/ Hex Artifact Content
Login

Artifact 316e6bc773559d164155848f086c4b7d146f483a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   );.  return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
0420: 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e 67  the error string
0430: 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65 2e   stored in Vdbe.
0440: 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64 20  zErrMsg.*/.void 
0450: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
0460: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0470: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
0480: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
0490: 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  p;.  sqlite3DbFr
04a0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45 72  ee(p->db, p->zEr
04b0: 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61 72  rMsg);.  va_star
04c0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
04d0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
04e0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
04f0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
0500: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
0510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  ;.}../*.** Remem
0520: 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69  ber the SQL stri
0530: 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65  ng for a prepare
0540: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  d statement..*/.
0550: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0560: 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20  SetSql(Vdbe *p, 
0570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
0580: 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70  nt n, int isPrep
0590: 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74  areV2){.  assert
05a0: 28 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31  ( isPrepareV2==1
05b0: 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d   || isPrepareV2=
05c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
05d0: 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64   ) return;.#if d
05e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
05f0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
0600: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
0610: 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66  BLE_SQLLOG).  if
0620: 28 20 21 69 73 50 72 65 70 61 72 65 56 32 20 29  ( !isPrepareV2 )
0630: 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a   return;.#endif.
0640: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
0650: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
0660: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
0670: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
0680: 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72  );.  p->isPrepar
0690: 65 56 32 20 3d 20 28 75 38 29 69 73 50 72 65 70  eV2 = (u8)isPrep
06a0: 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  areV2;.}../*.** 
06b0: 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61  Return the SQL a
06c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
06d0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
06e0: 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ent.*/.const cha
06f0: 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73  r *sqlite3_sql(s
0700: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
0710: 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d  mt){.  Vdbe *p =
0720: 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a   (Vdbe *)pStmt;.
0730: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 70    return (p && p
0740: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 29 20 3f  ->isPrepareV2) ?
0750: 20 70 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a   p->zSql : 0;.}.
0760: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20  ./*.** Swap all 
0770: 63 6f 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20  content between 
0780: 74 77 6f 20 56 44 42 45 20 73 74 72 75 63 74 75  two VDBE structu
0790: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
07a0: 69 74 65 33 56 64 62 65 53 77 61 70 28 56 64 62  ite3VdbeSwap(Vdb
07b0: 65 20 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29  e *pA, Vdbe *pB)
07c0: 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70  {.  Vdbe tmp, *p
07d0: 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d  Tmp;.  char *zTm
07e0: 70 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a  p;.  tmp = *pA;.
07f0: 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a    *pA = *pB;.  *
0800: 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70  pB = tmp;.  pTmp
0810: 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pA->pNext;.  
0820: 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e  pA->pNext = pB->
0830: 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65  pNext;.  pB->pNe
0840: 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d  xt = pTmp;.  pTm
0850: 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20  p = pA->pPrev;. 
0860: 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d   pA->pPrev = pB-
0870: 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50  >pPrev;.  pB->pP
0880: 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54  rev = pTmp;.  zT
0890: 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20  mp = pA->zSql;. 
08a0: 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e   pA->zSql = pB->
08b0: 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c  zSql;.  pB->zSql
08c0: 20 3d 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69   = zTmp;.  pB->i
08d0: 73 50 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d  sPrepareV2 = pA-
08e0: 3e 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a  >isPrepareV2;.}.
08f0: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68  ./*.** Resize th
0900: 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79  e Vdbe.aOp array
0910: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61   so that it is a
0920: 74 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d  t least nOp elem
0930: 65 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20  ents larger .** 
0940: 74 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74  than its current
0950: 20 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75   size. nOp is gu
0960: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
0970: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
0980: 6c 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a  l.** to 1024/siz
0990: 65 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49  eof(Op)..**.** I
09a0: 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  f an out-of-memo
09b0: 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ry error occurs 
09c0: 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74  while resizing t
09d0: 68 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e  he array, return
09e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
09f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56  . In this case V
0a00: 64 62 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73  dbe.aOp and Pars
0a10: 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69  e.nOpAlloc remai
0a20: 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  n .** unchanged 
0a30: 28 74 68 69 73 20 69 73 20 73 6f 20 74 68 61 74  (this is so that
0a40: 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72   any opcodes alr
0a50: 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63  eady allocated c
0a60: 61 6e 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63  an be .** correc
0a70: 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20  tly deallocated 
0a80: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72  along with the r
0a90: 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29  est of the Vdbe)
0aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0ab0: 67 72 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65  growOpArray(Vdbe
0ac0: 20 2a 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20   *v, int nOp){. 
0ad0: 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20   VdbeOp *pNew;. 
0ae0: 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70   Parse *p = v->p
0af0: 50 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65  Parse;..  /* The
0b00: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0b10: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70  LLOC_STRESS comp
0b20: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
0b30: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66  is designed to f
0b40: 6f 72 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66  orce.  ** more f
0b50: 72 65 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73  requent reallocs
0b60: 20 61 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69   and hence provi
0b70: 64 65 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  de more opportun
0b80: 69 74 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20  ities for .  ** 
0b90: 73 69 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61  simulated OOM fa
0ba0: 75 6c 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45  ults.  SQLITE_TE
0bb0: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
0bc0: 53 20 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75  S is generally u
0bd0: 73 65 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  sed.  ** during 
0be0: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57  testing only.  W
0bf0: 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  ith SQLITE_TEST_
0c00: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67  REALLOC_STRESS g
0c10: 72 6f 77 20 74 68 65 20 6f 70 20 61 72 72 61 79  row the op array
0c20: 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e  .  ** by the min
0c30: 69 6d 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71  imum* amount req
0c40: 75 69 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  uired until the 
0c50: 73 69 7a 65 20 72 65 61 63 68 65 73 20 35 31 32  size reaches 512
0c60: 2e 20 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f  .  Normal.  ** o
0c70: 70 65 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75  peration (withou
0c80: 74 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  t SQLITE_TEST_RE
0c90: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73  ALLOC_STRESS) is
0ca0: 20 74 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63   to double the c
0cb0: 75 72 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65  urrent.  ** size
0cc0: 20 6f 66 20 74 68 65 20 6f 70 20 61 72 72 61 79   of the op array
0cd0: 20 6f 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73   or add 1KB of s
0ce0: 70 61 63 65 2c 20 77 68 69 63 68 65 76 65 72 20  pace, whichever 
0cf0: 69 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23  is smaller. */.#
0d00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
0d10: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
0d20: 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70  .  int nNew = (p
0d30: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20  ->nOpAlloc>=512 
0d40: 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20  ? p->nOpAlloc*2 
0d50: 3a 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f  : p->nOpAlloc+nO
0d60: 70 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  p);.#else.  int 
0d70: 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c  nNew = (p->nOpAl
0d80: 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  loc ? p->nOpAllo
0d90: 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34  c*2 : (int)(1024
0da0: 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20  /sizeof(Op)));. 
0db0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
0dc0: 52 28 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  R(nOp);.#endif..
0dd0: 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28    assert( nOp<=(
0de0: 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29  1024/sizeof(Op))
0df0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
0e00: 65 77 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  ew>=(p->nOpAlloc
0e10: 2b 6e 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20  +nOp) );.  pNew 
0e20: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
0e30: 6f 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70  oc(p->db, v->aOp
0e40: 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70  , nNew*sizeof(Op
0e50: 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  ));.  if( pNew )
0e60: 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  {.    p->nOpAllo
0e70: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
0e80: 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70  locSize(p->db, p
0e90: 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b  New)/sizeof(Op);
0ea0: 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e  .    v->aOp = pN
0eb0: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
0ec0: 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f   (pNew ? SQLITE_
0ed0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  OK : SQLITE_NOME
0ee0: 4d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  M);.}..#ifdef SQ
0ef0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
0f10: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  st a convenient 
0f20: 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
0f30: 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77  reakpoint that w
0f40: 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65  ill.** fire afte
0f50: 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73  r each opcode is
0f60: 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69   inserted and di
0f70: 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a  splayed using.**
0f80: 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64   "PRAGMA vdbe_ad
0f90: 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f  doptrace=on"..*/
0fa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
0fb0: 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69  t_addop_breakpoi
0fc0: 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nt(void){.  stat
0fd0: 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  ic int n = 0;.  
0fe0: 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n++;.}.#endif../
0ff0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
1000: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
1010: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
1020: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
1030: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
1040: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
1050: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
1060: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
1070: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
1080: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
1090: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
10a0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
10b0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
10c0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
10d0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
10e0: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
10f0: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
1100: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
1110: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1120: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
1130: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
1140: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
1150: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
1160: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
1170: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
1180: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
1190: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69  ** operand..*/.i
11a0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
11b0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
11c0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
11d0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
11e0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
11f0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
1200: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
1210: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1220: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1230: 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f  ssert( op>0 && o
1240: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
1250: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1260: 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66  loc<=i ){.    if
1270: 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c  ( growOpArray(p,
1280: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   1) ){.      ret
1290: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
12a0: 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70  .  p->nOp++;.  p
12b0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
12c0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
12d0: 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e   (u8)op;.  pOp->
12e0: 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70  p5 = 0;.  pOp->p
12f0: 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70  1 = p1;.  pOp->p
1300: 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70  2 = p2;.  pOp->p
1310: 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70  3 = p3;.  pOp->p
1320: 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  4.p = 0;.  pOp->
1330: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
1340: 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  SED;.#ifdef SQLI
1350: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
1360: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70  N_COMMENTS.  pOp
1370: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
1380: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1390: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
13a0: 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20   p->db->flags & 
13b0: 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
13c0: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74  Trace ){.    int
13d0: 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72   jj, kk;.    Par
13e0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
13f0: 70 50 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28  pParse;.    for(
1400: 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49  jj=kk=0; jj<SQLI
1410: 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a  TE_N_COLCACHE; j
1420: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  j++){.      stru
1430: 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20  ct yColCache *x 
1440: 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
1450: 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20  che + jj;.      
1460: 69 66 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50  if( x->iLevel>pP
1470: 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1480: 6c 20 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20  l || x->iReg==0 
1490: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14a0: 20 20 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d    printf(" r[%d]
14b0: 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52  ={%d:%d}", x->iR
14c0: 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78  eg, x->iTable, x
14d0: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
14e0: 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20    kk++;.    }.  
14f0: 20 20 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74    if( kk ) print
1500: 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c  f("\n");.    sql
1510: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
1520: 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  0, i, &p->aOp[i]
1530: 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f  );.    test_addo
1540: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a  p_breakpoint();.
1550: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
1560: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
1570: 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30   pOp->cycles = 0
1580: 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30  ;.  pOp->cnt = 0
1590: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
15a0: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
15b0: 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63  RAGE.  pOp->iSrc
15c0: 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Line = 0;.#endif
15d0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69  .  return i;.}.i
15e0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
15f0: 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp0(Vdbe *p, in
1600: 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  t op){.  return 
1610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1620: 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30  3(p, op, 0, 0, 0
1630: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1640: 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20  VdbeAddOp1(Vdbe 
1650: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1660: 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p1){.  return sq
1670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1680: 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29  p, op, p1, 0, 0)
1690: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
16a0: 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a  dbeAddOp2(Vdbe *
16b0: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
16c0: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65  1, int p2){.  re
16d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
16e0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
16f0: 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  , p2, 0);.}.../*
1700: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
1710: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
1720: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
1730: 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  a pointer..*/.in
1740: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1750: 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Op4(.  Vdbe *p, 
1760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1770: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
1780: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1790: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
17a0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
17b0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17d0: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
17e0: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
17f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1800: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1810: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1820: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
1830: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  and */.  const c
1840: 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20  har *zP4,    /* 
1850: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
1860: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
1870: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
1880: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
1890: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
18a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18b0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
18c0: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
18d0: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
18e0: 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b  r, zP4, p4type);
18f0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1900: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1910: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1920: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1930: 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36  e with a P4_INT6
1940: 34 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73  4 type..*/.int s
1950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1960: 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c  Dup8(.  Vdbe *p,
1970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1980: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1990: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
19a0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
19b0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
19c0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e0: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
19f0: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1a00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1a10: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1a20: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1a30: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1a40: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1a50: 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a  u8 *zP4,      /*
1a60: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1a70: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
1a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
1a90: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
1aa0: 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79  {.  char *p4copy
1ab0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1ac0: 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62  ocRaw(sqlite3Vdb
1ad0: 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66  eDb(p), 8);.  if
1ae0: 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70  ( p4copy ) memcp
1af0: 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38  y(p4copy, zP4, 8
1b00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1b10: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
1b20: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c   op, p1, p2, p3,
1b30: 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29   p4copy, p4type)
1b40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1b50: 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  n OP_ParseSchema
1b60: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
1b70: 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e  outine is broken
1b80: 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c   out from.** sql
1b90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29  ite3VdbeAddOp4()
1ba0: 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20   since it needs 
1bb0: 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f  to also needs to
1bc0: 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73   mark all btrees
1bd0: 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65  .** as having be
1be0: 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  en used..**.** T
1bf0: 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67  he zWhere string
1c00: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1c10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1c20: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
1c30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c40: 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73  will take owners
1c50: 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  hip of the alloc
1c60: 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  ated memory..*/.
1c70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1c80: 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
1c90: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
1ca0: 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29  b, char *zWhere)
1cb0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74  {.  int j;.  int
1cc0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1cd0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f  dbeAddOp3(p, OP_
1ce0: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
1cf0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
1d00: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
1d10: 2c 20 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20  , addr, zWhere, 
1d20: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66  P4_DYNAMIC);.  f
1d30: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d  or(j=0; j<p->db-
1d40: 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74  >nDb; j++) sqlit
1d50: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
1d60: 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, j);.}../*.** 
1d70: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1d80: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1d90: 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69  p4 value as an i
1da0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  nteger..*/.int s
1db0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1dc0: 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Int(.  Vdbe *p, 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1de0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
1df0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1e00: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1e10: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
1e20: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e40: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
1e50: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
1e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1e70: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1e80: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1e90: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
1ea0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20  and */.  int p4 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61  The P4 operand a
1ed0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1ee0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
1ef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f00: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1f10: 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p3);.  sqlite3V
1f20: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1f30: 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ddr, SQLITE_INT_
1f40: 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49  TO_PTR(p4), P4_I
1f50: 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  NT32);.  return 
1f60: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
1f70: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
1f80: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
1f90: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1fa0: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1fb0: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
1fc0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
1fd0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
1fe0: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1ff0: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
2000: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
2010: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
2020: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
2030: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
2040: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
2050: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
2060: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
2070: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
2080: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
2090: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
20a0: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
20b0: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
20c0: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
20d0: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
20e0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
20f0: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
2100: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
2110: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
2120: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
2130: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
2140: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
2150: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
2160: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
2170: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
2180: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
2190: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
21a0: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
21b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
21c0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
21d0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
21e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
21f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
2200: 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *v){.  Parse *p
2210: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
2220: 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65  int i = p->nLabe
2230: 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76  l++;.  assert( v
2240: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2250: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2260: 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30  ( (i & (i-1))==0
2270: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
2280: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
2290: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
22a0: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20  , p->aLabel, .  
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a       (i*2+1)*siz
22e0: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
22f0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
2300: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
2310: 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31  ->aLabel[i] = -1
2320: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
2330: 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  1-i;.}../*.** Re
2340: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
2350: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
2360: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2370: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
2380: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
2390: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
23a0: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
23b0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
23c0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
23d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
23e0: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  abel()..*/.void 
23f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2400: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c  veLabel(Vdbe *v,
2410: 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65   int x){.  Parse
2420: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
2430: 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b  .  int j = -1-x;
2440: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
2450: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2460: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
2470: 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  ( j<p->nLabel );
2480: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6a 3e  .  if( ALWAYS(j>
2490: 3d 30 29 20 26 26 20 70 2d 3e 61 4c 61 62 65 6c  =0) && p->aLabel
24a0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
24b0: 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  l[j] = v->nOp;. 
24c0: 20 7d 0a 20 20 70 2d 3e 69 46 69 78 65 64 4f 70   }.  p->iFixedOp
24d0: 20 3d 20 76 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d   = v->nOp - 1;.}
24e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
24f0: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
2500: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
2510: 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76  n one time..*/.v
2520: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
2530: 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20  unOnlyOnce(Vdbe 
2540: 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c  *p){.  p->runOnl
2550: 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69  yOnce = 1;.}..#i
2560: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2570: 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65  G /* sqlite3Asse
2580: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67  rtMayAbort() log
2590: 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ic */../*.** The
25a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
25b0: 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  and function are
25c0: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
25d0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
25e0: 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62  odes.** in a Vdb
25f0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61  e main program a
2600: 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73  nd each of the s
2610: 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69  ub-programs (tri
2620: 67 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a  ggers) it may .*
2630: 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c  * invoke directl
2640: 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e  y or indirectly.
2650: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73   It should be us
2660: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
2670: 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  *.**   Op *pOp;.
2680: 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20  **   VdbeOpIter 
2690: 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d  sIter;.**.**   m
26a0: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
26b0: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
26c0: 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20  .**   sIter.v = 
26d0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
26f0: 20 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64   v is of type Vd
2700: 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28  be* .**   while(
2710: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65   (pOp = opIterNe
2720: 78 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a  xt(&sIter)) ){.*
2730: 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65  *     // Do some
2740: 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a  thing with pOp.*
2750: 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74  *   }.**   sqlit
2760: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
2770: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a  sIter.apSub);.**
2780: 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72   .*/.typedef str
2790: 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56  uct VdbeOpIter V
27a0: 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63  dbeOpIter;.struc
27b0: 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20  t VdbeOpIter {. 
27c0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
27e0: 64 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74  dbe to iterate t
27f0: 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64  hrough the opcod
2800: 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72  es of */.  SubPr
2810: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20  ogram **apSub;  
2820: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2830: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  f subprograms */
2840: 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20  .  int nSub;    
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2860: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2870: 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20  es in apSub */. 
2880: 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20   int iAddr;     
2890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
28a0: 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69  ddress of next i
28b0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65  nstruction to re
28c0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  turn */.  int iS
28d0: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
28e0: 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e       /* 0 = main
28f0: 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69   program, 1 = fi
2900: 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  rst sub-program 
2910: 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69  etc. */.};.stati
2920: 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74  c Op *opIterNext
2930: 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b  (VdbeOpIter *p){
2940: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e  .  Vdbe *v = p->
2950: 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20  v;.  Op *pRet = 
2960: 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20  0;.  Op *aOp;.  
2970: 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20  int nOp;..  if( 
2980: 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62  p->iSub<=p->nSub
2990: 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   ){..    if( p->
29a0: 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iSub==0 ){.     
29b0: 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20   aOp = v->aOp;. 
29c0: 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f       nOp = v->nO
29d0: 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
29e0: 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53      aOp = p->apS
29f0: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61  ub[p->iSub-1]->a
2a00: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
2a10: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
2a20: 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  -1]->nOp;.    }.
2a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
2a40: 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20  Addr<nOp );..   
2a50: 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e   pRet = &aOp[p->
2a60: 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69  iAddr];.    p->i
2a70: 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Addr++;.    if( 
2a80: 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b  p->iAddr==nOp ){
2a90: 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b  .      p->iSub++
2aa0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72  ;.      p->iAddr
2ab0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 0;.    }.  . 
2ac0: 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74     if( pRet->p4t
2ad0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
2ae0: 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AM ){.      int 
2af0: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62  nByte = (p->nSub
2b00: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
2b10: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69  ogram*);.      i
2b20: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
2b30: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20  j=0; j<p->nSub; 
2b40: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
2b50: 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70  ( p->apSub[j]==p
2b60: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  Ret->p4.pProgram
2b70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2b80: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  }.      if( j==p
2b90: 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ->nSub ){.      
2ba0: 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c    p->apSub = sql
2bb0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
2bc0: 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70  ree(v->db, p->ap
2bd0: 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Sub, nByte);.   
2be0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53       if( !p->apS
2bf0: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
2c00: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
2c10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c20: 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e     p->apSub[p->n
2c30: 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70  Sub++] = pRet->p
2c40: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
2c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2c70: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
2c80: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72   Check if the pr
2c90: 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20  ogram stored in 
2ca0: 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65  the VM associate
2cb0: 64 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61  d with pParse ma
2cc0: 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42  y.** throw an AB
2cd0: 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63  ORT exception (c
2ce0: 61 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65  ausing the state
2cf0: 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e  ment, but not en
2d00: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2d10: 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  .** to be rolled
2d20: 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e   back). This con
2d30: 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69  dition is true i
2d40: 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  f the main progr
2d50: 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62  am or any.** sub
2d60: 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69  -programs contai
2d70: 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  ns any of the fo
2d80: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2d90: 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68   *  OP_Halt with
2da0: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
2db0: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
2dc0: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
2dd0: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74  P_HaltIfNull wit
2de0: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
2df0: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
2e00: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
2e10: 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20  OP_Destroy.**   
2e20: 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a  *  OP_VUpdate.**
2e30: 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65     *  OP_VRename
2e40: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f  .**   *  OP_FkCo
2e50: 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30  unter with P2==0
2e60: 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65   (immediate fore
2e70: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
2e80: 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43  nt).**   *  OP_C
2e90: 72 65 61 74 65 54 61 62 6c 65 20 61 6e 64 20 4f  reateTable and O
2ea0: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  P_InitCoroutine 
2eb0: 28 66 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c  (for CREATE TABL
2ec0: 45 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29  E AS SELECT ...)
2ed0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63  .**.** Then chec
2ee0: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
2ef0: 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f   of Parse.mayAbo
2f00: 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e  rt is true if an
2f10: 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65  .** ABORT may be
2f20: 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73   thrown, or fals
2f30: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74  e otherwise. Ret
2f40: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
2f50: 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72  oes.** match, or
2f60: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
2f70: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2f80: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
2f90: 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72  e used as.** par
2fa0: 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73  t of an assert s
2fb0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
2fc0: 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61  compiler. Simila
2fd0: 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  r to:.**.**   as
2fe0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
2ff0: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
3000: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
3010: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
3020: 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   );.*/.int sqlit
3030: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
3040: 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e  bort(Vdbe *v, in
3050: 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69  t mayAbort){.  i
3060: 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b  nt hasAbort = 0;
3070: 0a 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e  .  int hasFkCoun
3080: 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ter = 0;.  int h
3090: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  asCreateTable = 
30a0: 30 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74  0;.  int hasInit
30b0: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20  Coroutine = 0;. 
30c0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65   Op *pOp;.  Vdbe
30d0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20  OpIter sIter;.  
30e0: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
30f0: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
3100: 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  ;.  sIter.v = v;
3110: 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  ..  while( (pOp 
3120: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
3130: 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ter))!=0 ){.    
3140: 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70  int opcode = pOp
3150: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66  ->opcode;.    if
3160: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73  ( opcode==OP_Des
3170: 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  troy || opcode==
3180: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
3190: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
31a0: 20 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f   .     || ((opco
31b0: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
31c0: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
31d0: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
31e0: 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d  ((pOp->p1&0xff)=
31f0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
3200: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
3210: 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b  E_Abort)).    ){
3220: 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20  .      hasAbort 
3230: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
3240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3250: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74  opcode==OP_Creat
3260: 65 54 61 62 6c 65 20 29 20 68 61 73 43 72 65 61  eTable ) hasCrea
3270: 74 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  teTable = 1;.   
3280: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3290: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20  InitCoroutine ) 
32a0: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
32b0: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
32c0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
32d0: 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70  N_KEY.    if( op
32e0: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
32f0: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
3300: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29   && pOp->p2==1 )
3310: 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75  {.      hasFkCou
3320: 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  nter = 1;.    }.
3330: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
3340: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
3350: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
3360: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
3370: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
3380: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
3390: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
33a0: 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49  occurred..  ** I
33b0: 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c  f malloc failed,
33c0: 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28   then the while(
33d0: 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79  ) loop above may
33e0: 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74   not have iterat
33f0: 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ed.  ** through 
3400: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  all opcodes and 
3410: 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20  hasAbort may be 
3420: 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  set incorrectly.
3430: 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75   Return.  ** tru
3440: 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20  e for this case 
3450: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61  to prevent the a
3460: 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63  ssert() in the c
3470: 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a  allers frame.  *
3480: 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20  * from failing. 
3490: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76   */.  return ( v
34a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
34b0: 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d  ed || hasAbort==
34c0: 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46  mayAbort || hasF
34d0: 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20  kCounter.       
34e0: 20 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72         || (hasCr
34f0: 65 61 74 65 54 61 62 6c 65 20 26 26 20 68 61 73  eateTable && has
3500: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29  InitCoroutine) )
3510: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
3520: 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65  LITE_DEBUG - the
3530: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
3540: 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f  yAbort() functio
3550: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70  n */../*.** Loop
3560: 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f   through the pro
3570: 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  gram looking for
3580: 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20   P2 values that 
3590: 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  are negative.** 
35a0: 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  on jump instruct
35b0: 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68  ions.  Each such
35c0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
35d0: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a  l.  Resolve the.
35e0: 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  ** label by sett
35f0: 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65  ing the P2 value
3600: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
3610: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
3620: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3630: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
3640: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
3650: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
3660: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
3670: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
3680: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
3690: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
36a0: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
36b0: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
36c0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67  _Function, OP_Ag
36d0: 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c  gStep or OP_VFil
36e0: 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  ter opcode. This
36f0: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
3700: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
3710: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
3720: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
3730: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
3740: 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c   Op.opflags fiel
3750: 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20  d is set on all 
3760: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  opcodes..*/.stat
3770: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
3780: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
3790: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
37a0: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
37b0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
37c0: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
37d0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65  Op *pOp;.  Parse
37e0: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
37f0: 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  arse;.  int *aLa
3800: 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c  bel = pParse->aL
3810: 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f  abel;.  p->readO
3820: 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49  nly = 1;.  p->bI
3830: 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66  sReader = 0;.  f
3840: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
3850: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
3860: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
3870: 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f    u8 opcode = pO
3880: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20  p->opcode;..    
3890: 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65  /* NOTE: Be sure
38a0: 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63   to update mkopc
38b0: 6f 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64  odeh.awk when ad
38c0: 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67  ding or removing
38d0: 0a 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72  .    ** cases fr
38e0: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
38f0: 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  */.    switch( o
3900: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63  pcode ){.      c
3910: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
3920: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  on: {.        if
3930: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
3940: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
3950: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
3960: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  thru */.      }.
3970: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75        case OP_Au
3980: 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20  toCommit:.      
3990: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
39a0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  t: {.        p->
39b0: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
39c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
39d0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
39e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
39f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
3a00: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
3a10: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
3a20: 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  uum:.      case 
3a30: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20  OP_JournalMode: 
3a40: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61  {.        p->rea
3a50: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
3a60: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
3a70: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3a80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
3a90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3aa0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
3ab0: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61     case OP_VUpda
3ac0: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  te: {.        if
3ad0: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
3ae0: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
3af0: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
3b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3b10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46        case OP_VF
3b20: 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20  ilter: {.       
3b30: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
3b40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
3b50: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
3b60: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
3b70: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
3b80: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
3b90: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
3ba0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  .        if( n>n
3bb0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
3bc0: 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  gs = n;.        
3bd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
3be0: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
3bf0: 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20   OP_Next:.      
3c00: 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70  case OP_NextIfOp
3c10: 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  en:.      case O
3c20: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
3c30: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
3c40: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3c50: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
3c60: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3c70: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
3c80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3c90: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3ca0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
3cb0: 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70  case OP_PrevIfOp
3cc0: 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  en: {.        pO
3cd0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
3ce0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
3cf0: 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70  vious;.        p
3d00: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3d10: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
3d20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3d30: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e      }..    pOp->
3d40: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  opflags = sqlite
3d50: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
3d60: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28  opcode];.    if(
3d70: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
3d80: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
3d90: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
3da0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31        assert( -1
3db0: 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73 65 2d  -pOp->p2<pParse-
3dc0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
3dd0: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
3de0: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
3df0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
3e00: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
3e10: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b  pParse->aLabel);
3e20: 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  .  pParse->aLabe
3e30: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  l = 0;.  pParse-
3e40: 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >nLabel = 0;.  *
3e50: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
3e60: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
3e70: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
3e80: 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a  =0 || DbMaskAllZ
3e90: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
3ea0: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ) );.}../*.** Re
3eb0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
3ec0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3ed0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
3ee0: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
3ef0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3f00: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
3f10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3f20: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3f30: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
3f40: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
3f50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3f60: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
3f70: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
3f80: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69  f opcodes associ
3f90: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
3fa0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
3fb0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
3fc0: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  nt. It is the ca
3fd0: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
3fe0: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e  lity.** to arran
3ff0: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ge for the retur
4000: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20  ned array to be 
4010: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
4020: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76   using the .** v
4030: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29  dbeFreeOpArray()
4040: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
4050: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
4060: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20  g, *pnOp is set 
4070: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
4080: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
4090: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61  returned.** arra
40a0: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41  y. Also, *pnMaxA
40b0: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  rg is set to the
40c0: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63   larger of its c
40d0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
40e0: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20   .** the number 
40f0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
4100: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
4110: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f  rray required to
4120: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a   execute the .**
4130: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61   returned progra
4140: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  m..*/.VdbeOp *sq
4150: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41  lite3VdbeTakeOpA
4160: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
4170: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e  t *pnOp, int *pn
4180: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f  MaxArg){.  VdbeO
4190: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
41a0: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26  .  assert( aOp &
41b0: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  & !p->db->malloc
41c0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20  Failed );..  /* 
41d0: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74  Check that sqlit
41e0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
41f0: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
4200: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   on this VM */. 
4210: 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41   assert( DbMaskA
4220: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
4230: 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ask) );..  resol
4240: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e  veP2Values(p, pn
4250: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70  MaxArg);.  *pnOp
4260: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
4270: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  aOp = 0;.  retur
4280: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aOp;.}../*.** 
4290: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
42a0: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
42b0: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
42c0: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74  stack.  Return t
42d0: 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  he.** address of
42e0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
42f0: 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69  tion added..*/.i
4300: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
4310: 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c  dOpList(Vdbe *p,
4320: 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70   int nOp, VdbeOp
4330: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c  List const *aOp,
4340: 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20   int iLineno){. 
4350: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
4360: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
4370: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
4380: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
4390: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65   nOp > p->pParse
43a0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
43b0: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70  owOpArray(p, nOp
43c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
43d0: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
43e0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c  p->nOp;.  if( AL
43f0: 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20  WAYS(nOp>0) ){. 
4400: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
4410: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
4420: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
4430: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
4440: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
4450: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
4460: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
4470: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
4480: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
4490: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
44a0: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
44b0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
44c0: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p1;.      if( 
44d0: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p2<0 ){.        
44e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
44f0: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
4500: 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  ut->opcode] & OP
4510: 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20  FLG_JUMP );.    
4520: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
4530: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a  ddr + ADDR(p2);.
4540: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4550: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
4560: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
4570: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
4580: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
4590: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
45a0: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75  TUSED;.      pOu
45b0: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
45c0: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
45d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
45e0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
45f0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70 4f 75  MMENTS.      pOu
4600: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
4610: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4620: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
4630: 41 47 45 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  AGE.      pOut->
4640: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
4650: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20  no+i;.#else.    
4660: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
4670: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4680: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
4690: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
46a0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
46b0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
46c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
46d0: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64  ePrintOp(0, i+ad
46e0: 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  dr, &p->aOp[i+ad
46f0: 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  dr]);.      }.#e
4700: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
4710: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
4720: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
4730: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
4740: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
4750: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f  MT_SCANSTATUS)./
4760: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72  *.** Add an entr
4770: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  y to the array o
4780: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67  f counters manag
4790: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74  ed by sqlite3_st
47a0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e  mt_scanstatus().
47b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
47c0: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a  VdbeScanStatus(.
47d0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73    /* VM to add s
4800: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a  canstatus() to *
4810: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c  /.  int addrExpl
4820: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
4830: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4840: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72  f OP_Explain (or
4850: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64   0) */.  int add
4860: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  rLoop,          
4870: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
4880: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e  ess of loop coun
4890: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64  ter */ .  int ad
48a0: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20  drVisit,        
48b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
48c0: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73  ress of rows vis
48d0: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ited counter */.
48e0: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20    LogEst nEst,  
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
4910: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
4920: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rows */.  const 
4930: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
4940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
4950: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e  e of table or in
4960: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  dex being scanne
4970: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  d */.){.  int nB
4980: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b  yte = (p->nScan+
4990: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e  1) * sizeof(Scan
49a0: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53  Status);.  ScanS
49b0: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61  tatus *aNew;.  a
49c0: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75  New = (ScanStatu
49d0: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c  s*)sqlite3DbReal
49e0: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53  loc(p->db, p->aS
49f0: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  can, nByte);.  i
4a00: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53  f( aNew ){.    S
4a10: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20  canStatus *pNew 
4a20: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e  = &aNew[p->nScan
4a30: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ++];.    pNew->a
4a40: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64  ddrExplain = add
4a50: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e  rExplain;.    pN
4a60: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61  ew->addrLoop = a
4a70: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65  ddrLoop;.    pNe
4a80: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61  w->addrVisit = a
4a90: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e  ddrVisit;.    pN
4aa0: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b  ew->nEst = nEst;
4ab0: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  .    pNew->zName
4ac0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
4ad0: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  up(p->db, zName)
4ae0: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d  ;.    p->aScan =
4af0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   aNew;.  }.}.#en
4b00: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
4b10: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
4b20: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
4b30: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
4b40: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
4b50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4b60: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
4b70: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
4b80: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
4b90: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
4ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4bb0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
4bc0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
4bd0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
4be0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
4bf0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4c00: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
4c10: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
4c20: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
4c30: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
4c40: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
4c50: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4c60: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
4c70: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4c80: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4c90: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
4ca0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
4cb0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
4cc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4cd0: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
4ce0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
4cf0: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
4d00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4d10: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
4d20: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
4d30: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4d40: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4d50: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4d60: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4d70: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
4d80: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4d90: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4da0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
4db0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
4dc0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
4dd0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4de0: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
4df0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
4e00: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4e10: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
4e20: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
4e30: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
4e40: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
4e50: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4e60: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
4e70: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
4e80: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
4e90: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
4ea0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4eb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
4ec0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
4ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
4ee0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
4ef0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4f00: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
4f10: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
4f20: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
4f30: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4f40: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4f50: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
4f60: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
4f70: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
4f80: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
4f90: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
4fa0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
4fb0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
4fc0: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
4fd0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
4fe0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4ff0: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
5000: 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69  ;.  p->pParse->i
5010: 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70  FixedOp = p->nOp
5020: 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   - 1;.}.../*.** 
5030: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
5040: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
5050: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
5060: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
5070: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
5080: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
5090: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
50a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
50b0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
50c0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
50d0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
50e0: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
50f0: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66  Def) && (pDef->f
5100: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
5110: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
5120: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
5130: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
5140: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
5150: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
5160: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
5170: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
5180: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
5190: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
51a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
51b0: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
51c0: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
51d0: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
51e0: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65  ( p4 ){.    asse
51f0: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77  rt( db );.    sw
5200: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
5210: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
5220: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 20  NCCTX: {.       
5230: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
5240: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 28 73 71 6c  nction(db, ((sql
5250: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
5260: 29 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  )->pFunc);.     
5270: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5280: 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  gh into the next
5290: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d   case */.      }
52a0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
52b0: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
52c0: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
52d0: 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a  case P4_DYNAMIC:
52e0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
52f0: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
5300: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5310: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
5320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5330: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
5340: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
5350: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5360: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
5370: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
5380: 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20  (KeyInfo*)p4);. 
5390: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
53a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
53b0: 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20   P4_MPRINTF: {. 
53c0: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
53d0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
53e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34   sqlite3_free(p4
53f0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5410: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
5420: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
5430: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
5440: 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70  (db, (FuncDef*)p
5450: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5460: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5470: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
5480: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
5490: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
54a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
54b0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
54c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34  qlite3_value*)p4
54d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
54e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20  {.          Mem 
54f0: 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20  *p = (Mem*)p4;. 
5500: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
5510: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
5520: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
5530: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
5540: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5550: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
5560: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
5570: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5580: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
5590: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
55a0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
55b0: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
55c0: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
55d0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
55e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
55f0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
5600: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
5610: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
5620: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
5630: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
5640: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
5650: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
5660: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
5670: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
5680: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
5690: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
56a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
56b0: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
56c0: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
56d0: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
56e0: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
56f0: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
5700: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
5710: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
5720: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
5730: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
5740: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
5750: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
5760: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
5770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
5780: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f  ree(db, pOp->zCo
5790: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20  mment);.#endif  
57a0: 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
57b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
57c0: 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , aOp);.}../*.**
57d0: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
57e0: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
57f0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
5800: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
5810: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
5820: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
5830: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
5840: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
5850: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
5860: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
5870: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
5880: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
5890: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
58a0: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
58b0: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
58c0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
58d0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
58e0: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
58f0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
5900: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
5910: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
5920: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
5930: 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Noop.*/.void sql
5940: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
5950: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
5960: 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 61  t addr){.  if( a
5970: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ddr<p->nOp ){.  
5980: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
5990: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
59a0: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
59b0: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65 65   p->db;.    free
59c0: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
59d0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
59e0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20      memset(pOp, 
59f0: 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d  0, sizeof(pOp[0]
5a00: 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63  ));.    pOp->opc
5a10: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
5a20: 20 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d 3e     if( addr==p->
5a30: 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d 2d  nOp-1 ) p->nOp--
5a40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
5a50: 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64  f the last opcod
5a60: 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74  e is "op" and it
5a70: 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64   is not a jump d
5a80: 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74  estination,.** t
5a90: 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20  hen remove it.  
5aa0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
5ab0: 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70  nd only if an op
5ac0: 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64  code was removed
5ad0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5ae0: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
5af0: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
5b00: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d  8 op){.  if( (p-
5b10: 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72  >nOp-1)>(p->pPar
5b20: 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26  se->iFixedOp) &&
5b30: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5b40: 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a  ].opcode==op ){.
5b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5b60: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70  hangeToNoop(p, p
5b70: 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65  ->nOp-1);.    re
5b80: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
5b90: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5ba0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
5bb0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
5bc0: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
5bd0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
5be0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
5bf0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5c00: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
5c10: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
5c20: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
5c30: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
5c40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c50: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
5c60: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
5c70: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
5c80: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
5c90: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
5ca0: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
5cb0: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
5cc0: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
5cd0: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
5ce0: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
5cf0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
5d00: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
5d10: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
5d20: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
5d30: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
5d40: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
5d50: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
5d60: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
5d70: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
5d80: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
5d90: 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  4..** .** Other 
5da0: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
5db0: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
5dc0: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
5dd0: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
5de0: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
5df0: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
5e00: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
5e10: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
5e20: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
5e30: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
5e40: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
5e50: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
5e60: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
5e70: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
5e80: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
5e90: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
5ea0: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
5eb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5ec0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
5ed0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
5ee0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
5ef0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
5f00: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
5f10: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
5f20: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
5f30: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
5f40: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5f50: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
5f60: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62   p->aOp==0 || db
5f70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5f80: 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f  {.    if( n!=P4_
5f90: 56 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72  VTAB ){.      fr
5fa0: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
5fb0: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
5fc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
5fd0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
5fe0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
5ff0: 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d   assert( addr<p-
6000: 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64  >nOp );.  if( ad
6010: 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72  dr<0 ){.    addr
6020: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
6030: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
6040: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65  Op[addr];.  asse
6050: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
6060: 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20  =P4_NOTUSED.    
6070: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
6080: 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20  e==P4_INT32.    
6090: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
60a0: 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b  e==P4_KEYINFO );
60b0: 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f  .  freeP4(db, pO
60c0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
60d0: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
60e0: 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d  .p = 0;.  if( n=
60f0: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
6100: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
6110: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
6120: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
6130: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
6140: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
6150: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
6160: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
6170: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
6180: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
6190: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
61a0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
61b0: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
61c0: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
61d0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
61e0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
61f0: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
6200: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
6210: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70  KEYINFO ){.    p
6220: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
6230: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
6240: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
6250: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
6260: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n==P4_VTAB ){. 
6270: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
6280: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
6290: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
62a0: 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65  VTAB;.    sqlite
62b0: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
62c0: 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73  e *)zP4);.    as
62d0: 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a  sert( ((VTable *
62e0: 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62  )zP4)->db==p->db
62f0: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
6300: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
6310: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
6320: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
6330: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
6340: 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r)n;.  }else{.  
6350: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
6360: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6370: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
6380: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
6390: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
63a0: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
63b0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
63c0: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  AMIC;.  }.}../*.
63d0: 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e  ** Set the P4 on
63e0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
63f0: 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20  ly added opcode 
6400: 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66  to the KeyInfo f
6410: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  or the.** index 
6420: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
6430: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
6440: 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
6450: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
6460: 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  x){.  Vdbe *v = 
6470: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
6480: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
6490: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
64a0: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
64b0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
64c0: 31 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  1, (char*)sqlite
64d0: 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
64e0: 70 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20  pParse, pIdx),. 
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6500: 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
6510: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
6520: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
6530: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a  N_COMMENTS./*.**
6540: 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d   Change the comm
6550: 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  ent on the most 
6560: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
6570: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a  nstruction.  Or.
6580: 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f  ** insert a No-o
6590: 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f  p and add the co
65a0: 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65  mment to that ne
65b0: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  w instruction.  
65c0: 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68  This.** makes th
65d0: 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f  e code easier to
65e0: 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62   read during deb
65f0: 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66  ugging.  None of
6600: 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a   this happens.**
6610: 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   in a production
6620: 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
6630: 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d  c void vdbeVComm
6640: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
6650: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
6660: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
6670: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
6680: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
6690: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
66a0: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
66b0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
66c0: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
66d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
66e0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a    if( p->nOp ){.
66f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
6700: 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Op );.    sqlite
6710: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
6720: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
6730: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70  zComment);.    p
6740: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
6750: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74  zComment = sqlit
6760: 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62  e3VMPrintf(p->db
6770: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
6780: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
6790: 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64  e3VdbeComment(Vd
67a0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
67b0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
67c0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
67d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76    if( p ){.    v
67e0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
67f0: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
6800: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
6810: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
6820: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  nd(ap);.  }.}.vo
6830: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f  id sqlite3VdbeNo
6840: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  opComment(Vdbe *
6850: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
6860: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
6870: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
6880: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
6890: 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20  e3VdbeAddOp0(p, 
68a0: 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61  OP_Noop);.    va
68b0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
68c0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
68d0: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
68e0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
68f0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
6900: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
6910: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
6920: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f  _VDBE_COVERAGE./
6930: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
6940: 75 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69  ue if the iSrcLi
6950: 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65  ne field for the
6960: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65   previously code
6970: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
6980: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6990: 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28  beSetLineNumber(
69a0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69  Vdbe *v, int iLi
69b0: 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  ne){.  sqlite3Vd
69c0: 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69  beGetOp(v,-1)->i
69d0: 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b  SrcLine = iLine;
69e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
69f0: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
6a00: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E */../*.** Retu
6a10: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
6a20: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
6a30: 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65  s.  If the addre
6a40: 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a  ss is -1, then.*
6a50: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * return the mos
6a60: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
6a70: 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ted opcode..**.*
6a80: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
6a90: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
6aa0: 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f  as occurred prio
6ab0: 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67  r to the calling
6ac0: 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   of this.** rout
6ad0: 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ine, then a poin
6ae0: 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56  ter to a dummy V
6af0: 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65  dbeOp will be re
6b00: 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70  turned.  That op
6b10: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61  code.** is reada
6b20: 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74  ble but not writ
6b30: 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20  able, though it 
6b40: 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69  is cast to a wri
6b50: 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20  table value..** 
6b60: 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20  The return of a 
6b70: 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c  dummy opcode all
6b80: 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ows the call to 
6b90: 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f  continue functio
6ba0: 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e  ning.** after an
6bb0: 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f   OOM fault witho
6bc0: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65  ut having to che
6bd0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
6be0: 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a   return from .**
6bf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6c00: 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
6c10: 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
6c20: 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20  he dummy.opcode 
6c30: 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77  is 0,.** dummy w
6c40: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69  ill never be wri
6c50: 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69  tten to.  This i
6c60: 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f  s verified by co
6c70: 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e  de inspection an
6c80: 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20  d.** by running 
6c90: 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a  with Valgrind..*
6ca0: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
6cb0: 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20  3VdbeGetOp(Vdbe 
6cc0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
6cd0: 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65   /* C89 specifie
6ce0: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74  s that the const
6cf0: 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c  ant "dummy" will
6d00: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
6d10: 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f  to all.  ** zero
6d20: 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72  s, which is corr
6d30: 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72  ect.  MSVC gener
6d40: 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20  ates a warning, 
6d50: 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f  nevertheless. */
6d60: 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70  .  static VdbeOp
6d70: 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f   dummy;  /* Igno
6d80: 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e  re the MSVC warn
6d90: 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69  ing about no ini
6da0: 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73  tializer */.  as
6db0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
6dc0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
6dd0: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
6de0: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
6df0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
6e00: 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30  assert( (addr>=0
6e10: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
6e20: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
6e30: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
6e40: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6e50: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
6e60: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
6e70: 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  my;.  }else{.   
6e80: 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b   return &p->aOp[
6e90: 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  addr];.  }.}..#i
6ea0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6eb0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
6ec0: 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20  COMMENTS)./*.** 
6ed0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
6ee0: 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20  r value for one 
6ef0: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
6f00: 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20  s to the opcode 
6f10: 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  pOp.** determine
6f20: 64 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63  d by character c
6f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6f40: 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20  translateP(char 
6f50: 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70  c, const Op *pOp
6f60: 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20  ){.  if( c=='1' 
6f70: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31  ) return pOp->p1
6f80: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29  ;.  if( c=='2' )
6f90: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b   return pOp->p2;
6fa0: 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20  .  if( c=='3' ) 
6fb0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a  return pOp->p3;.
6fc0: 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72    if( c=='4' ) r
6fd0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b  eturn pOp->p4.i;
6fe0: 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70  .  return pOp->p
6ff0: 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  5;.}../*.** Comp
7000: 75 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72  ute a string for
7010: 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66   the "comment" f
7020: 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f  ield of a VDBE o
7030: 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a  pcode listing..*
7040: 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69  *.** The Synopsi
7050: 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d  s: field in comm
7060: 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65  ents in the vdbe
7070: 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67  .c source file g
7080: 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a  ets converted.**
7090: 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72   to an extra str
70a0: 69 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65  ing that is appe
70b0: 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69  nded to the sqli
70c0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e  te3OpcodeName().
70d0: 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65    In the.** abse
70e0: 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d  nce of other com
70f0: 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f  ments, this syno
7100: 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65  psis becomes the
7110: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
7120: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20  opcode..** Some 
7130: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75  translation occu
7140: 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rs:.**.**       
7150: 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72  "PX"      ->  "r
7160: 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50  [X]".**       "P
7170: 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58  X@PY"   ->  "r[X
7180: 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72  ..X+Y-1]"  or "r
7190: 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f  [x]" if y is 0 o
71a0: 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  r 1.**       "PX
71b0: 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e  @PY+1" ->  "r[X.
71c0: 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b  .X+Y]"    or "r[
71d0: 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a  x]" if y is 0.**
71e0: 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20         "PY..PY" 
71f0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20   ->  "r[X..Y]"  
7200: 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66      or "r[x]" if
7210: 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20   y<=x.*/.static 
7220: 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  int displayComme
7230: 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a  nt(.  const Op *
7240: 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pOp,     /* The 
7250: 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d  opcode to be com
7260: 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  mented */.  cons
7270: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f  t char *zP4,   /
7280: 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74  * Previously obt
7290: 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20  ained value for 
72a0: 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  P4 */.  char *zT
72b0: 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  emp,       /* Wr
72c0: 69 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20  ite result here 
72d0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20  */.  int nTemp  
72e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
72f0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54   available in zT
7300: 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f  emp[] */.){.  co
7310: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  nst char *zOpNam
7320: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
7330: 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e  *zSynopsis;.  in
7340: 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74  t nOpName;.  int
7350: 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61   ii, jj;.  zOpNa
7360: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
7370: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
7380: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
7390: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
73a0: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
73b0: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
73c0: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
73d0: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
73e0: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
73f0: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
7400: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
7410: 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b      for(ii=jj=0;
7420: 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28   jj<nTemp-1 && (
7430: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69  c = zSynopsis[ii
7440: 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20  ])!=0; ii++){.  
7450: 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29      if( c=='P' )
7460: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53  {.        c = zS
7470: 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20  ynopsis[++ii];. 
7480: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34         if( c=='4
7490: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
74a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
74b0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
74c0: 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a  jj, "%s", zP4);.
74d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
74e0: 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  ( c=='X' ){.    
74f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7500: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
7510: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
7520: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
7530: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43  .          seenC
7540: 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  om = 1;.        
7550: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
7560: 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c   int v1 = transl
7570: 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20  ateP(c, pOp);.  
7580: 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a          int v2;.
7590: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
75a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
75b0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
75c0: 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20  %d", v1);.      
75d0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
75e0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
75f0: 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20  "@P", 2)==0 ){. 
7600: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
7610: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   3;.            
7620: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
7630: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
7640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20  .            v2 
7650: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79  = translateP(zSy
7660: 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29  nopsis[ii], pOp)
7670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
7680: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
7690: 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29  sis+ii+1,"+1",2)
76a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
76b0: 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20       ii += 2;.  
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b              v2++
76d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
76f0: 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  v2>1 ){.        
7700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7710: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
7720: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64   zTemp+jj, "..%d
7730: 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20  ", v1+v2-1);.   
7740: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7750: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
7760: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
7770: 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34  +ii+1, "..P3", 4
7780: 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )==0 && pOp->p3=
7790: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
77a0: 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20    ii += 4;.     
77b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
77c0: 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  .        jj += s
77d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
77e0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
77f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
7800: 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a  Temp[jj++] = c;.
7810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7820: 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26    if( !seenCom &
7830: 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20  & jj<nTemp-5 && 
7840: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
7850: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7860: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
7870: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25  , zTemp+jj, "; %
7880: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
7890: 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20  t);.      jj += 
78a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
78b0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d  zTemp+jj);.    }
78c0: 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d  .    if( jj<nTem
78d0: 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20  p ) zTemp[jj] = 
78e0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
78f0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
7900: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7910: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7920: 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  p, "%s", pOp->zC
7930: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20  omment);.    jj 
7940: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7950: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73  0(zTemp);.  }els
7960: 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  e{.    zTemp[0] 
7970: 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b  = 0;.    jj = 0;
7980: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a  .  }.  return jj
7990: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
79a0: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a  LITE_DEBUG */...
79b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
79c0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
79d0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44  ) || !defined(ND
79e0: 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20  EBUG) \.     || 
79f0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
7a00: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
7a10: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
7a20: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
7a30: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
7a40: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
7a50: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
7a60: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
7a70: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
7a80: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
7a90: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
7aa0: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
7ab0: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
7ac0: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
7ad0: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
7ae0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73  P4 = zTemp;.  as
7af0: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
7b00: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
7b10: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
7b20: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
7b30: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
7b40: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
7b50: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70   *pKeyInfo = pOp
7b60: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
7b70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
7b80: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
7b90: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r!=0 );.      sq
7ba0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7bb0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28  Temp, zTemp, "k(
7bc0: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
7bd0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20  Field);.      i 
7be0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7bf0: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  0(zTemp);.      
7c00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
7c10: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
7c20: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
7c30: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
7c40: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
7c50: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
7c60: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
7c70: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
7c80: 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20   : "nil";.      
7c90: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
7ca0: 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
7cb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d  ;.        if( n=
7cc0: 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f  =6 && memcmp(zCo
7cd0: 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d  ll,"BINARY",6)==
7ce0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
7cf0: 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20  Coll = "B";.    
7d00: 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
7d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
7d20: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29  f( i+n>nTemp-6 )
7d30: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
7d40: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
7d50: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
7d60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7d70: 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70   }.        zTemp
7d80: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
7d90: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
7da0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
7db0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
7dc0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
7dd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7de0: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
7df0: 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b  i], zColl, n+1);
7e00: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b  .        i += n;
7e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
7e20: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b  Temp[i++] = ')';
7e30: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20  .      zTemp[i] 
7e40: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
7e50: 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20  t( i<nTemp );.  
7e60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7e70: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c  .    case P4_COL
7e80: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
7e90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
7ea0: 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20  Op->p4.pColl;.  
7eb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7ec0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7ed0: 70 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43  p, "(%.20s)", pC
7ee0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
7ef0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7f00: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
7f10: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
7f20: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
7f30: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
7f40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7f50: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7f60: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
7f70: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
7f80: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
7f90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7fa0: 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20   P4_FUNCCTX: {. 
7fb0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
7fc0: 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74  ef = pOp->p4.pCt
7fd0: 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  x->pFunc;.      
7fe0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7ff0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8000: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
8010: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
8020: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8030: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
8040: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
8050: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8060: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8070: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
8080: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
8090: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
80a0: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
80b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
80c0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
80d0: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
80e0: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
80f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8100: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
8110: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8120: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8130: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
8140: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
8150: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8160: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
8170: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
8180: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
8190: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  m;.      if( pMe
81a0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
81b0: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
81c0: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
81d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
81e0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
81f0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
8200: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8210: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
8220: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b  ld", pMem->u.i);
8230: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8240: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
8250: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
8260: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8270: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8280: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
8290: 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
82a0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
82b0: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  gs & MEM_Null ){
82c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
82d0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
82e0: 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b   zTemp, "NULL");
82f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8300: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
8310: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
8320: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20  Blob );.        
8330: 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a  zP4 = "(blob)";.
8340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
8350: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
8360: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
8370: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
8380: 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a  case P4_VTAB: {.
8390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
83a0: 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d  ab *pVtab = pOp-
83b0: 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
83c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
83d0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
83e0: 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 22  zTemp, "vtab:%p"
83f0: 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20  , pVtab);.      
8400: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
8410: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
8420: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
8430: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8440: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8450: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20   "intarray");.  
8460: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8470: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
8480: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
8490: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
84a0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
84b0: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
84c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
84d0: 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e     case P4_ADVAN
84e0: 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d  CE: {.      zTem
84f0: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
8500: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8510: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
8520: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
8530: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
8540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
8550: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
8560: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
8570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8580: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
8590: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
85a0: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
85b0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
85c0: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
85d0: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
85e0: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
85f0: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
8600: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
8610: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
8620: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
8630: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
8640: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
8650: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
8660: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
8670: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
8680: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
8690: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
86a0: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
86b0: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
86c0: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
86d0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
86e0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
86f0: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
8700: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
8710: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
8720: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
8730: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
8740: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
8750: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
8760: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
8770: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
8780: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
8790: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62  eMask)*8 );.  Db
87a0: 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65  MaskSet(p->btree
87b0: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20  Mask, i);.  if( 
87c0: 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42  i!=1 && sqlite3B
87d0: 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e  treeSharable(p->
87e0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
87f0: 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
8800: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29  (p->lockMask, i)
8810: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
8820: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8830: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
8840: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
8850: 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20  SAFE>0./*.** If 
8860: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
8870: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68  ed to support sh
8880: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
8890: 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  and to be thread
88a0: 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  safe,.** this ro
88b0: 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68  utine obtains th
88c0: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
88d0: 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53  ed with each BtS
88e0: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a  hared structure.
88f0: 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61  ** that may be a
8900: 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56  ccessed by the V
8910: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
8920: 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e  rgument. In doin
8930: 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20  g so it also.** 
8940: 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65  sets the BtShare
8950: 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65  d.db member of e
8960: 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61  ach of the BtSha
8970: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20  red structures, 
8980: 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74  ensuring.** that
8990: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73   the correct bus
89a0: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
89b0: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66  ck is invoked if
89c0: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
89d0: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
89e0: 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74  t threadsafe but
89f0: 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68   does support sh
8a00: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
8a10: 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33   then.** sqlite3
8a20: 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20  BtreeEnter() is 
8a30: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
8a40: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
8a50: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
8a60: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
8a70: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
8a80: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
8a90: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
8aa0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8ab0: 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49   the VM..**.** I
8ac0: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
8ad0: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
8ae0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
8af0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
8b00: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
8b10: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
8b20: 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72  **.** The p->btr
8b30: 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20  eeMask field is 
8b40: 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c  a bitmask of all
8b50: 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65   btrees that the
8b60: 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74   prepared .** st
8b70: 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65  atement p will e
8b80: 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20  ver use.  Let N 
8b90: 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
8ba0: 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65   bits in p->btre
8bb0: 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  eMask.** corresp
8bc0: 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73  onding to btrees
8bd0: 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
8be0: 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68   cache.  Then th
8bf0: 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20  e runtime of.** 
8c00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8c10: 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69  N*N.  But as N i
8c20: 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68  s rarely more th
8c30: 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c  an 1, this shoul
8c40: 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72  d not.** be a pr
8c50: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
8c60: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
8c70: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
8c80: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
8c90: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
8ca0: 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62  nt nDb;.  if( Db
8cb0: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
8cc0: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
8cd0: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
8ce0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
8cf0: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
8d00: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
8d10: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
8d20: 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29  i=0; i<nDb; i++)
8d30: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
8d40: 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  & DbMaskTest(p->
8d50: 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41  lockMask,i) && A
8d60: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
8d70: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
8d80: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
8d90: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
8da0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
8db0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
8dc0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
8dd0: 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54  _CACHE) && SQLIT
8de0: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f  E_THREADSAFE>0./
8df0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20  *.** Unlock all 
8e00: 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72  of the btrees pr
8e10: 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20  eviously locked 
8e20: 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  by a call to sql
8e30: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e  ite3VdbeEnter().
8e40: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
8e50: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
8e60: 76 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  vdbeLeave(Vdbe *
8e70: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
8e80: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
8e90: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
8ea0: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
8eb0: 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b    aDb = db->aDb;
8ec0: 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62  .  nDb = db->nDb
8ed0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
8ee0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
8ef0: 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b  ( i!=1 && DbMask
8f00: 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Test(p->lockMask
8f10: 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44  ,i) && ALWAYS(aD
8f20: 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a  b[i].pBt!=0) ){.
8f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
8f40: 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70  eeLeave(aDb[i].p
8f50: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
8f60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8f70: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b  eLeave(Vdbe *p){
8f80: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
8f90: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
8fa0: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
8fb0: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
8fc0: 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70  */.  vdbeLeave(p
8fd0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
8fe0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
8ff0: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
9000: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
9010: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69  /*.** Print a si
9020: 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68  ngle opcode.  Th
9030: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
9040: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
9050: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
9060: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
9070: 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e  p(FILE *pOut, in
9080: 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a  t pc, Op *pOp){.
9090: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
90a0: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
90b0: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
90c0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
90d0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
90e0: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
90f0: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
9100: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
9110: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
9120: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
9130: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
9140: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
9150: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
9160: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
9170: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
9180: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
9190: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
91a0: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
91b0: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
91c0: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
91d0: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
91e0: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
91f0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
9200: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
9210: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
9220: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
9230: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
9240: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
9250: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
9260: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
9270: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
9280: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
9290: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
92a0: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
92b0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
92c0: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
92d0: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
92e0: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
92f0: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
9300: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
9310: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
9320: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
9330: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
9340: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
9350: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
9360: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
9370: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
9380: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   N ){.    Mem *p
9390: 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20  End = &p[N];.   
93a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
93b0: 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c  ->db;.    u8 mal
93c0: 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d  loc_failed = db-
93d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
93e0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
93f0: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
9400: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
9410: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
9420: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9430: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
9440: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
9450: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  )<pEnd );.      
9460: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
9470: 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65    do{.      asse
9480: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
9490: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
94a0: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
94b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
94c0: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
94d0: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
94e0: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
94f0: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
9500: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
9510: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
9520: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
9530: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
9540: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
9550: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
9560: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
9570: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
9580: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
9590: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
95a0: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
95b0: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
95c0: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
95d0: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
95e0: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
95f0: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
9600: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
9610: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
9620: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
9630: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
9640: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
9650: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
9660: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
9670: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
9680: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
9690: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
96a0: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
96b0: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
96c0: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
96d0: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
96e0: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
96f0: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
9700: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
9710: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
9720: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
9730: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
9740: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
9750: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
9760: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
9770: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
9780: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
9790: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
97a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
97b0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
97c0: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
97d0: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
97e0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
97f0: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
9800: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9810: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46  p->flags & MEM_F
9820: 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65  rame );.      te
9830: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
9840: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b   & MEM_RowSet );
9850: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
9860: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
9870: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
9880: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
9890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
98a0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
98b0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
98c0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20  p->szMalloc ){. 
98d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
98e0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
98f0: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  loc);.        p-
9900: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  >szMalloc = 0;. 
9910: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
9920: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  >flags = MEM_Und
9930: 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69  efined;.    }whi
9940: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
9950: 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ;.    db->malloc
9960: 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f  Failed = malloc_
9970: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f  failed;.  }.}../
9980: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64  *.** Delete a Vd
9990: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61  beFrame object a
99a0: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
99b0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
99c0: 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ts are.** alloca
99d0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72  ted by the OP_Pr
99e0: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
99f0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
9a00: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
9a10: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
9a20: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b  e(VdbeFrame *p){
9a30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
9a40: 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d  *aMem = VdbeFram
9a50: 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43  eMem(p);.  VdbeC
9a60: 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20  ursor **apCsr = 
9a70: 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
9a80: 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65  aMem[p->nChildMe
9a90: 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m];.  for(i=0; i
9aa0: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
9ab0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
9ac0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
9ad0: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
9ae0: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
9af0: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
9b00: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
9b10: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
9b20: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
9b30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9b40: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
9b50: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
9b60: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
9b70: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
9b80: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
9b90: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
9ba0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
9bb0: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
9bc0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
9bd0: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
9be0: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
9bf0: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
9c00: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
9c10: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
9c20: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
9c30: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
9c40: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
9c50: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
9c60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
9c70: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
9c80: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
9c90: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
9ca0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
9cb0: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
9cc0: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
9cd0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
9ce0: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
9cf0: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
9d00: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
9d10: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
9d20: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
9d30: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
9d40: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
9d50: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
9d60: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
9d70: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
9d80: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
9d90: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
9da0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
9db0: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
9de0: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
9df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
9e10: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
9e20: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
9e30: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9e60: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
9e70: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
9e80: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
9e90: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
9ea0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
9eb0: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
9ec0: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
9ef0: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
9f00: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
9f10: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
9f20: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
9f30: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
9f40: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
9f50: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
9f80: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
9f90: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
9fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9fb0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
9fc0: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
9fd0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9ff0: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75  irst Mem of resu
a000: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73  lt set */..  ass
a010: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
a020: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
a030: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
a040: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72  C_RUN );.  asser
a050: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
a060: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
a070: 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e  LITE_BUSY || p->
a080: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
a090: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
a0a0: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
a0b0: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
a0c0: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
a0d0: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
a0e0: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
a0f0: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
a100: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
a110: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
a120: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
a130: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
a140: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
a150: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
a160: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
a170: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b  mArray(pMem, 8);
a180: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
a190: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
a1a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
a1b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a1c0: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
a1d0: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
a1e0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
a1f0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
a200: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
a210: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
a220: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
a230: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a240: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
a250: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
a260: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  }..  /* When the
a270: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
a280: 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e  t rows reaches n
a290: 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  Row, that means 
a2a0: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67  the.  ** listing
a2b0: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e   has finished an
a2c0: 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  d sqlite3_step()
a2d0: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
a2e0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a  QLITE_DONE..  **
a2f0: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d   nRow is the sum
a300: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
a310: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  f rows in the ma
a320: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73  in program, plus
a330: 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66  .  ** the sum of
a340: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
a350: 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67  ows in all trigg
a360: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65  er subprograms e
a370: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
a380: 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f  so far.  The nRo
a390: 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63  w value will inc
a3a0: 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69  rease as new tri
a3b0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
a3c0: 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e   are.  ** encoun
a3d0: 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63  tered, but p->pc
a3e0: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
a3f0: 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f   catch up to nRo
a400: 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  w..  */.  nRow =
a410: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70   p->nOp;.  if( p
a420: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
a430: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
a440: 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20   8 memory cells 
a450: 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  are used for the
a460: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f   result set.  So
a470: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   we will.    ** 
a480: 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39  commandeer the 9
a490: 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61  th cell to use a
a4a0: 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e  s storage for an
a4b0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
a4c0: 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69  rs.    ** to tri
a4d0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
a4e0: 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67  .  The VDBE is g
a4f0: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
a500: 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20  e at least 9.   
a510: 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20   ** cells.  */. 
a520: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d     assert( p->nM
a530: 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62  em>9 );.    pSub
a540: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a   = &p->aMem[9];.
a550: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c      if( pSub->fl
a560: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
a570: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20        /* On the 
a580: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
a590: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53  lite3_step(), pS
a5a0: 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e  ub will hold a N
a5b0: 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ULL.  It is.    
a5c0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
a5d0: 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68   to a BLOB by th
a5e0: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  e P4_SUBPROGRAM 
a5f0: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
a600: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
a610: 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73  nSub = pSub->n/s
a620: 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20  izeof(Vdbe*);.  
a630: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
a640: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
a650: 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  >z;.    }.    fo
a660: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69  r(i=0; i<nSub; i
a670: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ++){.      nRow 
a680: 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70  += apSub[i]->nOp
a690: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
a6a0: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
a6b0: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
a6c0: 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61  nRow && p->expla
a6d0: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
a6e0: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
a6f0: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
a700: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d  >=nRow ){.    p-
a710: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
a720: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
a730: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
a740: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
a750: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
a760: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
a770: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
a780: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
a790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
a7a0: 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45  rror(p, sqlite3E
a7b0: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
a7c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
a7d0: 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70   *zP4;.    Op *p
a7e0: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
a7f0: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
a800: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
a810: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
a820: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
a830: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
a840: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
a850: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
a860: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
a870: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
a880: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
a890: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
a8a0: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
a8b0: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
a8c0: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
a8d0: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
a8e0: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
a8f0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
a900: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
a910: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
a920: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
a930: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
a940: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
a950: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
a960: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
a970: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
a980: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
a990: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
a9a0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
a9b0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
a9c0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9f0: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
aa00: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
aa10: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
aa20: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
aa30: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
aa40: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
aa50: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
aa60: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
aa70: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f  p->opcode); /* O
aa80: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61  pcode */.      a
aa90: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
aaa0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
aab0: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
aac0: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
aad0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
aae0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
aaf0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
ab00: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
ab10: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
ab20: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
ab30: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
ab40: 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20  at has.      ** 
ab50: 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  a P4_SUBPROGRAM 
ab60: 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e  argument), expan
ab70: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
ab80: 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  e array of subpr
ab90: 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20  ograms.      ** 
aba0: 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b  kept in p->aMem[
abb0: 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65  9].z to hold the
abc0: 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61   new program - a
abd0: 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62  ssuming this sub
abe0: 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a  program.      **
abf0: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
ac00: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
ac10: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
ac20: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
ac30: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
ac40: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
ac50: 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66   (nSub+1)*sizeof
ac60: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
ac70: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
ac80: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
ac90: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
aca0: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
acb0: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
acc0: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
acd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ace0: 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20   if( j==nSub && 
acf0: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74  SQLITE_OK==sqlit
ad00: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
ad10: 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21  ub, nByte, nSub!
ad20: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
ad30: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
ad40: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
ad50: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
ad60: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
ad70: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
ad80: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
ad90: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
ada0: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
adb0: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
adc0: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
add0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ade0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
adf0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
ae00: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
ae10: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
ae40: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
ae50: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
ae60: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
ae70: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
aea0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
aeb0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
aec0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
aed0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
af00: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
af10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
af20: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
af30: 73 69 7a 65 28 70 4d 65 6d 2c 20 33 32 29 20 29  size(pMem, 32) )
af40: 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20  { /* P4 */.     
af50: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
af60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
af70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
af80: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
af90: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
afa0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
afb0: 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64  erm;.    zP4 = d
afc0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
afd0: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
afe0: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
aff0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b000: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
b010: 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51  Mem, zP4, -1, SQ
b020: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
b030: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b040: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
b050: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
b060: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
b070: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
b080: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
b090: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
b0a0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b     }.    pMem++;
b0b0: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
b0c0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
b0d0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
b0e0: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
b0f0: 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20  e(pMem, 4) ){.  
b100: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
b110: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
b120: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
b130: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
b140: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b150: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
b160: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
b170: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
b180: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
b190: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65  _snprintf(3, pMe
b1a0: 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f  m->z, "%.2x", pO
b1b0: 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20  p->p5);   /* P5 
b1c0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  */.      pMem->e
b1d0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
b1e0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
b1f0: 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
b200: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
b210: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69  COMMENTS.      i
b220: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
b230: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
b240: 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20  pMem, 500) ){.  
b250: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
b260: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
b270: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
b280: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
b290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b2a0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
b2b0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
b2c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
b2d0: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70  displayComment(p
b2e0: 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a  Op, zP4, pMem->z
b2f0: 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d  , 500);.      pM
b300: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
b310: 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20  _UTF8;.#else.   
b320: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
b330: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23   /* Comment */.#
b360: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
b370: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
b380: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61   8 - 4*(p->expla
b390: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52  in-1);.    p->pR
b3a0: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
b3b0: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72  Mem[1];.    p->r
b3c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b3d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
b3e0: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
b3f0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
b400: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
b410: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
b420: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
b430: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
b440: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
b450: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
b460: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
b470: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
b480: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
b490: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b4a0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a   = 0;.  if( p->z
b4b0: 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  Sql ){.    z = p
b4c0: 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20  ->zSql;.  }else 
b4d0: 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b  if( p->nOp>=1 ){
b4e0: 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f  .    const VdbeO
b4f0: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
b500: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  [0];.    if( pOp
b510: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
b520: 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  t && pOp->p4.z!=
b530: 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70  0 ){.      z = p
b540: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
b550: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
b560: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
b570: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
b580: 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c   z ) printf("SQL
b590: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d  : [%s]\n", z);.}
b5a0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
b5b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b5c0: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
b5d0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b5e0: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
b5f0: 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43   Print an IOTRAC
b600: 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e  E message showin
b610: 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a  g SQL content..*
b620: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b630: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62  beIOTraceSql(Vdb
b640: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
b650: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
b660: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
b670: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d  sqlite3IoTrace==
b680: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
b690: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
b6a0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
b6b0: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
b6c0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
b6d0: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
b6e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
b6f0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
b700: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
b710: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
b720: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
b730: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
b740: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
b750: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
b760: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
b770: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
b780: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
b790: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
b7a0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
b7b0: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
b7c0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
b7d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b7e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b7f0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
b800: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b810: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
b820: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
b830: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
b840: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
b850: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
b860: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
b870: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
b880: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
b890: 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20  ce from a fixed 
b8a0: 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20  size buffer and 
b8b0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
b8c0: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63   to.** that spac
b8d0: 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  e.  If insuffici
b8e0: 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61  ent space is ava
b8f0: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e  ilable, return N
b900: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ULL..**.** The p
b910: 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73  Buf parameter is
b920: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
b930: 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ue of a pointer 
b940: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65  which will.** re
b950: 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65  ceive the new me
b960: 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e  mory.  pBuf is n
b970: 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49  ormally NULL.  I
b980: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  f pBuf is not.**
b990: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
b9a0: 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63  that memory spac
b9b0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
b9c0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
b9d0: 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f   that.** this ro
b9e0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
b9f0: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65   allocate any ne
ba00: 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  w memory.  When 
ba10: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
ba20: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ULL simply retur
ba30: 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c  n pBuf.  Only al
ba40: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
ba50: 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75  y space when pBu
ba60: 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  f.** is NULL..**
ba70: 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65  .** nByte is the
ba80: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
ba90: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
baa0: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20  ..**.** *ppFrom 
bab0: 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61  points to availa
bac0: 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45  ble space and pE
bad0: 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  nd points to the
bae0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61   end of the.** a
baf0: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20  vailable space. 
bb00: 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61   When space is a
bb10: 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f  llocated, *ppFro
bb20: 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61  m is advanced pa
bb30: 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  st.** the end of
bb40: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   the allocated s
bb50: 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42  pace..**.** *pnB
bb60: 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72  yte is a counter
bb70: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
bb80: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
bb90: 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65   that have faile
bba0: 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  d.** to allocate
bbb0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69  .  If there is i
bbc0: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
bbd0: 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20  e in *ppFrom to 
bbe0: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72  satisfy the.** r
bbf0: 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63  equest, then inc
bc00: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62  rement *pnByte b
bc10: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  y the amount of 
bc20: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a  the request..*/.
bc30: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c  static void *all
bc40: 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20  ocSpace(.  void 
bc50: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
bc60: 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20  /* Where return 
bc70: 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  pointer will be 
bc80: 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  stored */.  int 
bc90: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
bca0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
bcb0: 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
bcc0: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d  */.  u8 **ppFrom
bcd0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ,         /* IN/
bce0: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72  OUT: Allocate fr
bcf0: 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20  om *ppFrom */.  
bd00: 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  u8 *pEnd,       
bd10: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
bd20: 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74  to 1 byte past t
bd30: 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f  he end of *ppFro
bd40: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
bd50: 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20  t *pnByte       
bd60: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
bd70: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
bd80: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
bd90: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
bda0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
bdb0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72  _ALIGNMENT(*ppFr
bdc0: 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75  om) );.  if( pBu
bdd0: 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b  f ) return pBuf;
bde0: 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
bdf0: 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  8(nByte);.  if( 
be00: 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65  &(*ppFrom)[nByte
be10: 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20  ] <= pEnd ){.   
be20: 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a   pBuf = (void*)*
be30: 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46  ppFrom;.    *ppF
be40: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
be50: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79  }else{.    *pnBy
be60: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  te += nByte;.  }
be70: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
be80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20  }../*.** Rewind 
be90: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f  the VDBE back to
bea0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69   the beginning i
beb0: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f  n preparation fo
bec0: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e  r.** running it.
bed0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
bee0: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20  VdbeRewind(Vdbe 
bef0: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
bf00: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
bf10: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
bf20: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
bf30: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
bf40: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
bf50: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
bf60: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
bf70: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
bf80: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
bf90: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
bfa0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
bfb0: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
bfc0: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
bfd0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
bfe0: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
bff0: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
c000: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
c010: 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53  C_RUN;..#ifdef S
c020: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
c030: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d  r(i=1; i<p->nMem
c040: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
c050: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64  rt( p->aMem[i].d
c060: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a  b==p->db );.  }.
c070: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d  #endif.  p->pc =
c080: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53   -1;.  p->rc = S
c090: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65  QLITE_OK;.  p->e
c0a0: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
c0b0: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69  Abort;.  p->magi
c0c0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
c0d0: 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  UN;.  p->nChange
c0e0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
c0f0: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
c100: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
c110: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74   = 255;.  p->iSt
c120: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70  atement = 0;.  p
c130: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
c140: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
c150: 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69  _PROFILE.  for(i
c160: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
c170: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69  +){.    p->aOp[i
c180: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ].cnt = 0;.    p
c190: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
c1a0: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
c1b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
c1c0: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
c1d0: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
c1e0: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
c1f0: 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65  ime after.** cre
c200: 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  ating the virtua
c210: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73  l machine.  This
c220: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
c230: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
c240: 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73  cating registers
c250: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
c260: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
c270: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
c280: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
c290: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
c2a0: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
c2b0: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
c2c0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
c2d0: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
c2e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c2f0: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
c300: 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61  actly once on ea
c310: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
c320: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
c330: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
c340: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
c350: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
c360: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
c370: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
c380: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
c390: 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61  lled, further ca
c3a0: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
c3b0: 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75  e3VdbeAddOp() fu
c3c0: 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68  nctions are proh
c3d0: 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f  ibited.  This ro
c3e0: 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74  utine disconnect
c3f0: 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72  s.** the Vdbe fr
c400: 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  om the Parse obj
c410: 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20  ect that helped 
c420: 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74  generate it so t
c430: 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56  hat the.** the V
c440: 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69  dbe becomes an i
c450: 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74  ndependent entit
c460: 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20  y and the Parse 
c470: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a  object can be.**
c480: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
c490: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
c4a0: 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72  3VdbeRewind() pr
c4b0: 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f  ocedure to resto
c4c0: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
c4d0: 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  hine back.** to 
c4e0: 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74  its initial stat
c4f0: 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62  e after it has b
c500: 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64  een run..*/.void
c510: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
c520: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
c530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c540: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
c550: 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  DBE */.  Parse *
c560: 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20  pParse          
c570: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c580: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
c590: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5b0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
c5c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
c5d0: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
c600: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e  rameters */.  in
c610: 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c630: 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d  Number of VM mem
c640: 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f  ory registers */
c650: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20  .  int nCursor; 
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c670: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c680: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
c690: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c6c0: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75   arguments in su
c6d0: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
c6e0: 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20  nt nOnce;       
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c700: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e   Number of OP_On
c710: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ce instructions 
c720: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c740: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
c750: 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73  ter */.  u8 *zCs
c760: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c770: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
c780: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
c790: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
c7a0: 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20  u8 *zEnd;       
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c7c0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
c7d0: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  t allocated memo
c7e0: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ry */.  int nByt
c7f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c800: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75         /* How mu
c810: 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  ch extra memory 
c820: 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20  is needed */..  
c830: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
c840: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
c850: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
c860: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
c870: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
c880: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
c890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
c8a0: 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20  arse==p->pParse 
c8b0: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
c8c0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
c8d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
c8e0: 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73  ;.  nVar = pPars
c8f0: 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20  e->nVar;.  nMem 
c900: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
c910: 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72    nCursor = pPar
c920: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67  se->nTab;.  nArg
c930: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41   = pParse->nMaxA
c940: 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50  rg;.  nOnce = pP
c950: 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69  arse->nOnce;.  i
c960: 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f  f( nOnce==0 ) nO
c970: 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75  nce = 1; /* Ensu
c980: 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  re at least one 
c990: 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65  byte in p->aOnce
c9a0: 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f  Flag[] */.  .  /
c9b0: 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f  * For each curso
c9c0: 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f  r required, also
c9d0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f   allocate a memo
c9e0: 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a  ry cell. Memory.
c9f0: 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d    ** cells (nMem
ca00: 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65  +1-nCursor)..nMe
ca10: 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69  m, inclusive, wi
ca20: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
ca30: 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62   by.  ** the vdb
ca40: 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65  e program. Inste
ca50: 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64  ad they are used
ca60: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
ca70: 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65  ce for.  ** Vdbe
ca80: 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20  Cursor/BtCursor 
ca90: 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20  structures. The 
caa0: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
cab0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
cac0: 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73    ** cursor 0 is
cad0: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
cae0: 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d  y cell nMem. Mem
caf0: 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31  ory cell (nMem-1
cb00: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
cb10: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
cb20: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
cb30: 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a   cursor 1, etc..
cb40: 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
cb50: 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
cb60: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
cb70: 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20  m += nCursor;.. 
cb80: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
cb90: 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65  ce for memory re
cba0: 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72  gisters, SQL var
cbb0: 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72  iables, VDBE cur
cbc0: 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61  sors and .  ** a
cbd0: 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68  n array to marsh
cbe0: 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  al SQL function 
cbf0: 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20  arguments in..  
cc00: 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a  */.  zCsr = (u8*
cc10: 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d  )&p->aOp[p->nOp]
cc20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
cc30: 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65  Memory avaliable
cc40: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
cc50: 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a  */.  zEnd = (u8*
cc60: 29 26 70 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d  )&p->aOp[pParse-
cc70: 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20  >nOpAlloc];  /* 
cc80: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
cc90: 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f  end of zCsr[] */
cca0: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
ccb0: 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
ccc0: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
ccd0: 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73  nal = (u8)(pPars
cce0: 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  e->isMultiWrite 
ccf0: 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  && pParse->mayAb
cd00: 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ort);.  if( pPar
cd10: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e  se->explain && n
cd20: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d  Mem<10 ){.    nM
cd30: 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d  em = 10;.  }.  m
cd40: 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a  emset(zCsr, 0, z
cd50: 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73  End-zCsr);.  zCs
cd60: 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38  r += (zCsr - (u8
cd70: 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74  *)0)&7;.  assert
cd80: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
cd90: 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a  GNMENT(zCsr) );.
cda0: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
cdb0: 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66  ;..  /* Memory f
cdc0: 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
cdd0: 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
cde0: 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
cdf0: 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20  ted in two.  ** 
ce00: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
ce10: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
ce20: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
ce30: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ed space at the 
ce40: 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
ce50: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
ce60: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
ce70: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
ce80: 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75  memory.  ** requ
ce90: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
cea0: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
ceb0: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
cec0: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
ced0: 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69  pass will fill i
cee0: 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67  n the rest using
cef0: 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74   a fresh allocat
cf00: 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ion.  .  **.  **
cf10: 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61   This two-pass a
cf20: 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75  pproach that reu
cf30: 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ses as much memo
cf40: 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
cf50: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66  rom.  ** the lef
cf60: 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74  tover space at t
cf70: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  he end of the op
cf80: 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73  code array can s
cf90: 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
cfa0: 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
cfb0: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
cfc0: 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
cfd0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
cfe0: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74  .  do {.    nByt
cff0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  e = 0;.    p->aM
d000: 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
d010: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69  p->aMem, nMem*si
d020: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
d030: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
d040: 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61  .    p->aVar = a
d050: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61  llocSpace(p->aVa
d060: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d  r, nVar*sizeof(M
d070: 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  em), &zCsr, zEnd
d080: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
d090: 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
d0a0: 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e  pace(p->apArg, n
d0b0: 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29  Arg*sizeof(Mem*)
d0c0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
d0d0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
d0e0: 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  zVar = allocSpac
d0f0: 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72  e(p->azVar, nVar
d100: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20  *sizeof(char*), 
d110: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
d120: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  yte);.    p->apC
d130: 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
d140: 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f  p->apCsr, nCurso
d150: 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
d160: 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20  sor*),.         
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d180: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
d190: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  Byte);.    p->aO
d1a0: 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53  nceFlag = allocS
d1b0: 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61  pace(p->aOnceFla
d1c0: 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c  g, nOnce, &zCsr,
d1d0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
d1e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d1f0: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
d200: 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78  ATUS.    p->anEx
d210: 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ec = allocSpace(
d220: 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f  p->anExec, p->nO
d230: 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 2c 20 26  p*sizeof(i64), &
d240: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
d250: 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  te);.#endif.    
d260: 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
d270: 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71     p->pFree = sq
d280: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
d290: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
d2a0: 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70    }.    zCsr = p
d2b0: 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e  ->pFree;.    zEn
d2c0: 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d  d = &zCsr[nByte]
d2d0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74  ;.  }while( nByt
d2e0: 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  e && !db->malloc
d2f0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e  Failed );..  p->
d300: 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f  nCursor = nCurso
d310: 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61  r;.  p->nOnceFla
d320: 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28  g = nOnce;.  if(
d330: 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20   p->aVar ){.    
d340: 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72  p->nVar = (ynVar
d350: 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e  )nVar;.    for(n
d360: 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29  =0; n<nVar; n++)
d370: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b  {.      p->aVar[
d380: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
d390: 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56  ull;.      p->aV
d3a0: 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  ar[n].db = db;. 
d3b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
d3c0: 2d 3e 61 7a 56 61 72 20 26 26 20 70 50 61 72 73  ->azVar && pPars
d3d0: 65 2d 3e 6e 7a 56 61 72 3e 30 20 29 7b 0a 20 20  e->nzVar>0 ){.  
d3e0: 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61    p->nzVar = pPa
d3f0: 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20  rse->nzVar;.    
d400: 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c  memcpy(p->azVar,
d410: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20   pParse->azVar, 
d420: 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28  p->nzVar*sizeof(
d430: 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20  p->azVar[0]));. 
d440: 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65     memset(pParse
d450: 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72  ->azVar, 0, pPar
d460: 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66  se->nzVar*sizeof
d470: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30  (pParse->azVar[0
d480: 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ]));.  }.  if( p
d490: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d  ->aMem ){.    p-
d4a0: 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20  >aMem--;        
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d4c0: 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f   aMem[] goes fro
d4d0: 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20  m 1..nMem */.   
d4e0: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72   /*       not fr
d510: 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a  om 0..nMem-1 */.
d520: 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d      for(n=1; n<=
d530: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
d540: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
d550: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
d560: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  ed;.      p->aMe
d570: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
d580: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70    }.  }.  p->exp
d590: 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65  lain = pParse->e
d5a0: 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65  xplain;.  sqlite
d5b0: 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a  3VdbeRewind(p);.
d5c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
d5d0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
d5e0: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
d5f0: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
d600: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
d610: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
d620: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
d630: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
d640: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
d650: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
d660: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
d670: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
d680: 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d  beSorterClose(p-
d690: 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28  >db, pCx);.  if(
d6a0: 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pCx->pBt ){.   
d6b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
d6c0: 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20  se(pCx->pBt);.  
d6d0: 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43    /* The pCx->pC
d6e0: 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c  ursor will be cl
d6f0: 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ose automaticall
d700: 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c  y, if it exists,
d710: 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   by.    ** the c
d720: 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20  all above. */.  
d730: 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70  }else if( pCx->p
d740: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
d750: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
d760: 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73  ursor(pCx->pCurs
d770: 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  or);.  }.#ifndef
d780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
d790: 54 55 41 4c 54 41 42 4c 45 0a 20 20 65 6c 73 65  TUALTABLE.  else
d7a0: 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43   if( pCx->pVtabC
d7b0: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
d7c0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
d7d0: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20   *pVtabCursor = 
d7e0: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
d7f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ;.    const sqli
d800: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
d810: 75 6c 65 20 3d 20 70 56 74 61 62 43 75 72 73 6f  ule = pVtabCurso
d820: 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  r->pVtab->pModul
d830: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
d840: 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
d850: 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  b->nRef>0 );.   
d860: 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
d870: 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  tab->nRef--;.   
d880: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
d890: 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
d8a0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
d8b0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
d8c0: 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72 72  sors in the curr
d8d0: 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74  ent frame..*/.st
d8e0: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43  atic void closeC
d8f0: 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64  ursorsInFrame(Vd
d900: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
d910: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
d920: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
d930: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
d940: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
d950: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
d960: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
d970: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
d980: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
d990: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
d9a0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
d9b0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
d9c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
d9d0: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c  .** Copy the val
d9e0: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
d9f0: 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75  e VdbeFrame stru
da00: 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62  cture to its Vdb
da10: 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73  e. This.** is us
da20: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
da30: 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20   when a trigger 
da40: 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68  sub-program is h
da50: 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65  alted to restore
da60: 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  .** control to t
da70: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
da80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
da90: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
daa0: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
dab0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
dac0: 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f  pFrame->v;.  clo
dad0: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
dae0: 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (v);.#ifdef SQLI
daf0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
db00: 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61  CANSTATUS.  v->a
db10: 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e  nExec = pFrame->
db20: 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20  anExec;.#endif. 
db30: 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20   v->aOnceFlag = 
db40: 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61  pFrame->aOnceFla
db50: 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61  g;.  v->nOnceFla
db60: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63  g = pFrame->nOnc
db70: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20  eFlag;.  v->aOp 
db80: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20  = pFrame->aOp;. 
db90: 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65   v->nOp = pFrame
dba0: 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d  ->nOp;.  v->aMem
dbb0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b   = pFrame->aMem;
dbc0: 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72  .  v->nMem = pFr
dbd0: 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->nMem;.  v->
dbe0: 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e  apCsr = pFrame->
dbf0: 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72  apCsr;.  v->nCur
dc00: 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  sor = pFrame->nC
dc10: 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e  ursor;.  v->db->
dc20: 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61  lastRowid = pFra
dc30: 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20  me->lastRowid;. 
dc40: 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46   v->nChange = pF
dc50: 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20  rame->nChange;. 
dc60: 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20   v->db->nChange 
dc70: 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61  = pFrame->nDbCha
dc80: 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  nge;.  return pF
dc90: 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a  rame->pc;.}../*.
dca0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
dcb0: 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  sors..**.** Also
dcc0: 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e   release any dyn
dcd0: 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64  amic memory held
dce0: 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68   by the VM in th
dcf0: 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f  e Vdbe.aMem memo
dd00: 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61  ry .** cell arra
dd10: 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  y. This is neces
dd20: 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f  sary as the memo
dd30: 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61  ry cell array ma
dd40: 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69  y contain.** poi
dd50: 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61  nters to VdbeFra
dd60: 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63  me objects, whic
dd70: 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f  h may in turn co
dd80: 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
dd90: 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  o.** open cursor
dda0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
ddb0: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
ddc0: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  s(Vdbe *p){.  if
ddd0: 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
dde0: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46     VdbeFrame *pF
ddf0: 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46  rame;.    for(pF
de00: 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
de10: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
de20: 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
de30: 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71  pParent);.    sq
de40: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
de50: 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
de60: 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30     p->pFrame = 0
de70: 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20  ;.    p->nFrame 
de80: 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
de90: 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20  t( p->nFrame==0 
dea0: 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72  );.  closeCursor
deb0: 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69  sInFrame(p);.  i
dec0: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
ded0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
dee0: 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70  y(&p->aMem[1], p
def0: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77  ->nMem);.  }.  w
df00: 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61  hile( p->pDelFra
df10: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
df20: 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70  ame *pDel = p->p
df30: 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d  DelFrame;.    p-
df40: 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65  >pDelFrame = pDe
df50: 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20  l->pParent;.    
df60: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
df70: 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20  Delete(pDel);.  
df80: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
df90: 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63  ny auxdata alloc
dfa0: 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74  ations made by t
dfb0: 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70  he VM */.  if( p
dfc0: 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 71 6c  ->pAuxData ) sql
dfd0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
dfe0: 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b  xData(p, -1, 0);
dff0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41  .  assert( p->pA
e000: 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a  uxData==0 );.}..
e010: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74  /*.** Clean up t
e020: 68 65 20 56 4d 20 61 66 74 65 72 20 61 20 73 69  he VM after a si
e030: 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61  ngle run..*/.sta
e040: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
e050: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
e060: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
e070: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
e080: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63  _DEBUG.  /* Exec
e090: 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ute assert() sta
e0a0: 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
e0b0: 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e  e that the Vdbe.
e0c0: 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a  apCsr[] and .  *
e0d0: 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72  * Vdbe.aMem[] ar
e0e0: 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64  rays have alread
e0f0: 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75  y been cleaned u
e100: 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  p.  */.  int i;.
e110: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
e120: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
e130: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73  Cursor; i++) ass
e140: 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d  ert( p->apCsr[i]
e150: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
e160: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28  aMem ){.    for(
e170: 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b  i=1; i<=p->nMem;
e180: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
e190: 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d  >aMem[i].flags==
e1a0: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b  MEM_Undefined );
e1b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
e1c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e1d0: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
e1e0: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
e1f0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
e200: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
e210: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
e220: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
e230: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
e240: 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c  rned by this SQL
e250: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  .** statement. T
e260: 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61  his is now set a
e270: 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
e280: 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69  rather than duri
e290: 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  ng.** execution 
e2a0: 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  of the vdbe prog
e2b0: 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69  ram so that sqli
e2c0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
e2d0: 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c  () can.** be cal
e2e0: 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74  led on an SQL st
e2f0: 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73  atement before s
e300: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a  qlite3_step()..*
e310: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
e320: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62  beSetNumCols(Vdb
e330: 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f  e *p, int nResCo
e340: 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43  lumn){.  Mem *pC
e350: 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b  olName;.  int n;
e360: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
e370: 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61   p->db;..  relea
e380: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
e390: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
e3a0: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
e3b0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
e3c0: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
e3d0: 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f  e);.  n = nResCo
e3e0: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a  lumn*COLNAME_N;.
e3f0: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
e400: 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d  = (u16)nResColum
e410: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  n;.  p->aColName
e420: 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d   = pColName = (M
e430: 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  em*)sqlite3DbMal
e440: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
e450: 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
e460: 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
e470: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
e480: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
e490: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c      pColName->fl
e4a0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
e4b0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62      pColName->db
e4c0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43   = p->db;.    pC
e4d0: 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a  olName++;.  }.}.
e4e0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
e4f0: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74  ame of the idx't
e500: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72  h column to be r
e510: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
e520: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
e530: 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61   zName must be a
e540: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75   pointer to a nu
e550: 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l terminated str
e560: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
e570: 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64  call must be mad
e580: 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  e after a call t
e590: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  o sqlite3VdbeSet
e5a0: 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a  NumCols()..**.**
e5b0: 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   The final param
e5c0: 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74  eter, xDel, must
e5d0: 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   be one of SQLIT
e5e0: 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54  E_DYNAMIC, SQLIT
e5f0: 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53  E_STATIC.** or S
e600: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e  QLITE_TRANSIENT.
e610: 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45   If it is SQLITE
e620: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74  _DYNAMIC, then t
e630: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
e640: 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65  d.** to by zName
e650: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62   will be freed b
e660: 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  y sqlite3DbFree(
e670: 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20  ) when the vdbe 
e680: 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f  is destroyed..*/
e690: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
e6a0: 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64  SetColName(.  Vd
e6b0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e6d0: 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e  * Vdbe being con
e6e0: 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74  figured */.  int
e6f0: 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20   idx,           
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e710: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
e720: 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74   zName applies t
e730: 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20  o */.  int var, 
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
e760: 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20  f the COLNAME_* 
e770: 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63  constants */.  c
e780: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
e790: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e7a0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
e7b0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
e7c0: 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  name */.  void (
e7d0: 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20  *xDel)(void*)   
e7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
e7f0: 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
e800: 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61  strategy for zNa
e810: 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  me */.){.  int r
e820: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
e830: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
e840: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
e850: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
e860: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
e870: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
e880: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61  cFailed ){.    a
e890: 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c  ssert( !zName ||
e8a0: 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59   xDel!=SQLITE_DY
e8b0: 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74  NAMIC );.    ret
e8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e8d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e8e0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
e8f0: 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
e900: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
e910: 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
e920: 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  mn]);.  rc = sql
e930: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
e940: 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
e950: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
e960: 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73  F8, xDel);.  ass
e970: 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a  ert( rc!=0 || !z
e980: 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d  Name || (pColNam
e990: 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72  e->flags&MEM_Ter
e9a0: 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  m)!=0 );.  retur
e9b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
e9c0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
e9d0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
e9e0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
e9f0: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
ea00: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
ea10: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
ea20: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
ea30: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
ea40: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
ea50: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
ea60: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
ea70: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
ea80: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
ea90: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
eaa0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
eab0: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
eac0: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
ead0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
eae0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
eaf0: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
eb00: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
eb10: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
eb20: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
eb30: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  -transaction */.
eb40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
eb50: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
eb60: 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69  Xcommit = 0;..#i
eb70: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
eb80: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
eb90: 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74  /* With this opt
eba0: 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62  ion, sqlite3Vtab
ebb0: 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65  Sync() is define
ebc0: 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a  d to be simply .
ebd0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73    ** SQLITE_OK s
ebe0: 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e  o p is not used.
ebf0: 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f   .  */.  UNUSED_
ec00: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65  PARAMETER(p);.#e
ec10: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  ndif..  /* Befor
ec20: 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
ec30: 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20   else, call the 
ec40: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
ec50: 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69   for any.  ** vi
ec60: 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62  rtual module tab
ec70: 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74  les written in t
ec80: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
ec90: 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a   This has to.  *
eca0: 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65  * be done before
ecb0: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65   determining whe
ecc0: 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f  ther a master jo
ecd0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20  urnal file is . 
ece0: 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73   ** required, as
ecf0: 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c   an xSync() call
ed00: 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20  back may add an 
ed10: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
ed20: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72  e.  ** to the tr
ed30: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
ed40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
ed50: 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a  abSync(db, p);..
ed60: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
ed70: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
ed80: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
ed90: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
eda0: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
edb0: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
edc0: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
edd0: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
ede0: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
edf0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
ee00: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
ee10: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
ee20: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
ee30: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
ee40: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
ee50: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
ee60: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
ee70: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
ee80: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
ee90: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
eea0: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
eeb0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
eec0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
eed0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
eee0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
eef0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
ef00: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
ef10: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
ef20: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  {.      needXcom
ef30: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mit = 1;.      i
ef40: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73  f( i!=1 ) nTrans
ef50: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
ef60: 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29  3BtreeEnter(pBt)
ef70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
ef80: 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
ef90: 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74  veLock(sqlite3Bt
efa0: 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a  reePager(pBt));.
efb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
efc0: 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20  eeLeave(pBt);.  
efd0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
efe0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
eff0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f000: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
f010: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
f020: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
f030: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
f040: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
f050: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
f060: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
f070: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63  llback ){.    rc
f080: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
f090: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
f0a0: 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20  itArg);.    if( 
f0b0: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
f0c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
f0d0: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b  AINT_COMMITHOOK;
f0e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f0f0: 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65   The simple case
f100: 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20   - no more than 
f110: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
f120: 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  e (not counting 
f130: 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61  the.  ** TEMP da
f140: 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72  tabase) has a tr
f150: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
f160: 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .   There is no 
f170: 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  need for the.  *
f180: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
f190: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
f1a0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
f1b0: 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  of sqlite3BtreeG
f1c0: 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20  etFilename() is 
f1d0: 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20  a zero length.  
f1e0: 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65  ** string, it me
f1f0: 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ans the main dat
f200: 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79  abase is :memory
f210: 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65  : or a temp file
f220: 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74  .  In .  ** that
f230: 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20   case we do not 
f240: 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d  support atomic m
f250: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
f260: 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20  s, so use the . 
f270: 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20   ** simple case 
f280: 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  then too..  */. 
f290: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
f2a0: 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42  trlen30(sqlite3B
f2b0: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
f2c0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29  db->aDb[0].pBt))
f2d0: 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31  .   || nTrans<=1
f2e0: 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  .  ){.    for(i=
f2f0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
f300: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
f310: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
f320: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
f330: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
f340: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
f350: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
f360: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
f370: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
f380: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
f390: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
f3a0: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
f3b0: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
f3c0: 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20   complete phase 
f3d0: 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  1. .    ** If on
f3e0: 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f  e of the BtreeCo
f3f0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
f400: 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73  alls fails, this
f410: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20   indicates an.  
f420: 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68    ** IO error wh
f430: 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ile deleting or 
f440: 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75  truncating a jou
f450: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73  rnal file. It is
f460: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a   unlikely,.    *
f470: 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70  * but could happ
f480: 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  en. In this case
f490: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
f4a0: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
f4b0: 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  he error..    */
f4c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
f4d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
f4e0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
f4f0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
f500: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
f510: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
f520: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f530: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
f540: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
f550: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
f560: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
f570: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f580: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
f590: 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  mit(db);.    }. 
f5a0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d   }..  /* The com
f5b0: 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72  plex case - Ther
f5c0: 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c  e is a multi-fil
f5d0: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
f5e0: 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a  ion active..  **
f5f0: 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61   This requires a
f600: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f610: 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74  file to ensure t
f620: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
f630: 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  s.  ** committed
f640: 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a   atomically..  *
f650: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
f660: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
f670: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
f680: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d  _vfs *pVfs = db-
f690: 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e  >pVfs;.    int n
f6a0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
f6b0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
f6c0: 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
f6d0: 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
f6e0: 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
f6f0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
f700: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
f710: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
f720: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
f730: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
f740: 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
f750: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
f760: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  = 0;.    int res
f770: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43  ;.    int retryC
f780: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ount = 0;.    in
f790: 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20  t nMainFile;..  
f7a0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
f7b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f7c0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d  e name */.    nM
f7d0: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
f7e0: 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46  3Strlen30(zMainF
f7f0: 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ile);.    zMaste
f800: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
f810: 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58  tf(db, "%s-mjXXX
f820: 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46  XXX9XXz", zMainF
f830: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ile);.    if( zM
f840: 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72  aster==0 ) retur
f850: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
f860: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
f870: 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
f880: 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
f890: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f8a0: 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29  retryCount>100 )
f8b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
f8c0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
f8d0: 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a  ULL, "MJ delete:
f8e0: 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
f8f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f900: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
f910: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
f920: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f930: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f940: 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b  retryCount==1 ){
f950: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f960: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
f970: 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a  LL, "MJ collide:
f980: 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
f990: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f9a0: 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75  }.      retryCou
f9b0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
f9c0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
f9d0: 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
f9e0: 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
f9f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
fa00: 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e  f(13, &zMaster[n
fa10: 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25  MainFile], "-mj%
fa20: 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20  06X9%02X",.     
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64            (iRand
fa50: 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c  om>>8)&0xffffff,
fa60: 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a   iRandom&0xff);.
fa70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74        /* The ant
fa80: 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61  ipenultimate cha
fa90: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61  racter of the ma
faa0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
fab0: 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e must.      ** 
fac0: 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20  be "9" to avoid 
fad0: 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  name collisions 
fae0: 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66  when using 8+3 f
faf0: 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20  ilenames. */.   
fb00: 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74     assert( zMast
fb10: 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  er[sqlite3Strlen
fb20: 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d  30(zMaster)-3]==
fb30: 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  '9' );.      sql
fb40: 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
fb50: 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74  zMainFile, zMast
fb60: 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
fb70: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
fb80: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
fb90: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
fba0: 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
fbb0: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
fbc0: 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
fbd0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
fbe0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
fbf0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
fc00: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
fc10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fc20: 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
fc30: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
fc40: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
fc50: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
fc60: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
fc70: 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
fc80: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
fc90: 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
fca0: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
fcb0: 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
fcc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fcd0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
fce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
fcf0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
fd00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
fd10: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
fd20: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
fd30: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
fd40: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
fd50: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
fd60: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
fd70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
fd80: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
fd90: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
fda0: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
fdb0: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
fdc0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
fdd0: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
fde0: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
fdf0: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
fe00: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
fe10: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
fe20: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
fe30: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
fe40: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
fe50: 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
fe60: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
fe70: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
fe80: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
fe90: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
fea0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
feb0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
fec0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
fed0: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
fee0: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
fef0: 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
ff00: 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
ff10: 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
ff20: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
ff30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
ff40: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
ff50: 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
ff60: 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
ff70: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
ff80: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
ff90: 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
ffa0: 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e      if( !needSyn
ffb0: 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72  c && !sqlite3Btr
ffc0: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70  eeSyncDisabled(p
ffd0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
ffe0: 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
fff0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
10010 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46  rite(pMaster, zF
10020 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ile, sqlite3Strl
10030 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f  en30(zFile)+1, o
10040 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
10050 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65  offset += sqlite
10060 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
10070 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
10080 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10090 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
100a0 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
100b0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
100c0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
100d0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
100e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
100f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10100 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
10110 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10130 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
10140 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
10150 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
10160 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
10170 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20  NTIAL device.   
10180 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20   ** flag is set 
10190 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  this is not requ
101a0 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
101b0 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20   if( needSync . 
101c0 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74      && 0==(sqlit
101d0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
101e0 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
101f0 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
10200 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20  SEQUENTIAL).    
10210 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
10220 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
10230 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49  nc(pMaster, SQLI
10240 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29  TE_SYNC_NORMAL))
10250 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
10260 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
10270 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
10280 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
10290 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
102a0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
102b0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
102c0 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
102d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
102e0 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
102f0 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
10300 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
10310 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
10320 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
10330 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
10340 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
10350 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
10360 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
10370 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
10380 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
10390 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
103a0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
103b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
103c0 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
103d0 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
103e0 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  st call to.    *
103f0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
10400 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20  mmitPhaseOne(), 
10410 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
10420 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a  chance that the.
10430 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
10440 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
10450 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  be orphaned. But
10460 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
10470 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20  e it,.    ** in 
10480 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20  case the master 
10490 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
104a0 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
104b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
104c0 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72     ** file befor
104d0 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63  e the failure oc
104e0 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  curred..    */. 
104f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
10500 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
10510 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
10520 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
10530 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
10540 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
10550 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10560 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
10570 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
10580 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
10590 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
105a0 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
105b0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
105c0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
105d0 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20  BUSY );.    if( 
105e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
105f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
10600 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
10610 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10620 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
10630 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
10640 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10650 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
10660 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
10670 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
10680 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
10690 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
106a0 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
106b0 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
106c0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
106d0 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
106e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
106f0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
10700 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
10710 20 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20   needSync);.    
10720 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10730 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
10740 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
10750 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
10760 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10770 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
10780 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
10790 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
107a0 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
107b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
107c0 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
107d0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
107e0 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
107f0 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
10800 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
10810 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
10820 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
10830 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
10840 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
10850 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
10860 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
10870 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
10880 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
10890 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
108a0 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
108b0 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
108c0 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
108d0 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
108e0 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
108f0 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
10900 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
10910 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
10920 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
10930 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
10940 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
10950 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
10960 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
10970 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
10980 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
10990 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
109a0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
109b0 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
109c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
109d0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
109e0 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
109f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
10a00 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
10a10 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
10a20 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
10a30 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
10a40 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
10a50 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
10a60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10a70 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
10a80 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
10a90 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64   the sqlite3.nVd
10aa0 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76  beActive count v
10ab0 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
10ac0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
10ad0 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
10ae0 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
10af0 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
10b00 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
10b10 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
10b20 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
10b30 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
10b40 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
10b50 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
10b60 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
10b70 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
10b80 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
10b90 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
10ba0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
10bb0 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
10bc0 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
10bd0 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
10be0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
10bf0 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
10c00 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
10c10 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
10c20 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20  t nWrite = 0;.  
10c30 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20  int nRead = 0;. 
10c40 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
10c50 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
10c60 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
10c70 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33  mt_busy((sqlite3
10c80 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20  _stmt*)p) ){.   
10c90 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
10ca0 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  if( p->readOnly=
10cb0 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20  =0 ) nWrite++;. 
10cc0 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52       if( p->bIsR
10cd0 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b  eader ) nRead++;
10ce0 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
10cf0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
10d00 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
10d10 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20  nVdbeActive );. 
10d20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
10d30 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
10d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  );.  assert( nRe
10d50 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ad==db->nVdbeRea
10d60 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  d );.}.#else.#de
10d70 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
10d80 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
10d90 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
10da0 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
10db0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
10dc0 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65  t opened a state
10dd0 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
10de0 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f  ,.** close it no
10df0 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20  w. Argument eOp 
10e00 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
10e10 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10e20 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  K or.** SAVEPOIN
10e30 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74  T_RELEASE. If it
10e40 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
10e50 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65  LLBACK, then the
10e60 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
10e70 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
10e80 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70  led back. If eOp
10e90 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
10ea0 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20  LEASE, then the 
10eb0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72  .** statement tr
10ec0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
10ed0 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
10ee0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
10ef0 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
10f00 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
10f10 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
10f20 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
10f30 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
10f40 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
10f50 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
10f60 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
10f70 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
10f80 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
10f90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10fa0 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74  ..  /* If p->iSt
10fb0 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74  atement is great
10fc0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
10fd0 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65  en this Vdbe ope
10fe0 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74  ned a .  ** stat
10ff0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
11000 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  n that should be
11010 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68   closed here. Th
11020 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e  e only exception
11030 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e  .  ** is that an
11040 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61   IO error may ha
11050 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75  ve occurred, cau
11060 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63  sing an emergenc
11070 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  y rollback..  **
11080 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64   In this case (d
11090 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
110a0 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ), and there is 
110b0 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20  nothing to do.. 
110c0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53   */.  if( db->nS
110d0 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
110e0 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
110f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
11100 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
11110 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
11120 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  -1;..    assert(
11130 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
11140 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d  ROLLBACK || eOp=
11150 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
11160 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  SE);.    assert(
11170 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
11180 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
11190 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
111a0 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b  (db->nStatement+
111b0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20  db->nSavepoint) 
111c0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  );..    for(i=0;
111d0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
111e0 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  { .      int rc2
111f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11200 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
11210 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
11220 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
11230 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  {.        if( eO
11240 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
11250 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
11260 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
11270 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
11280 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Bt, SAVEPOINT_RO
11290 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
112a0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
112b0 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d         if( rc2==
112c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
112d0 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
112e0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
112f0 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
11300 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
11310 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
11320 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
11330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11340 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63           rc = rc
11350 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
11360 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64     }.    }.    d
11370 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b  b->nStatement--;
11380 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  .    p->iStateme
11390 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  nt = 0;..    if(
113a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
113b0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d  {.      if( eOp=
113c0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
113d0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ACK ){.        r
113e0 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
113f0 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
11400 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
11410 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
11420 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11440 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11450 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
11460 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
11470 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
11480 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
11490 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
114a0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
114b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
114c0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ng rolled back, 
114d0 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65  also restore the
114e0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
114f0 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
11500 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
11510 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
11520 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
11530 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
11540 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11550 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f   was opened.  */
11560 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  .    if( eOp==SA
11570 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
11580 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44   ){.      db->nD
11590 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d  eferredCons = p-
115a0 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20  >nStmtDefCons;. 
115b0 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
115c0 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e  edImmCons = p->n
115d0 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a  StmtDefImmCons;.
115e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
115f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11600 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
11610 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
11620 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
11630 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
11640 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
11650 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
11660 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
11670 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
11680 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
11690 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
116a0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
116b0 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
116c0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
116d0 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
116e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
116f0 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
11700 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
11710 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
11720 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
11730 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
11740 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
11750 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
11760 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
11770 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
11780 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
11790 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20  T_FOREIGNKEY.** 
117a0 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72  and write an err
117b0 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
117c0 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
117d0 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
117e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
117f0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
11800 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
11810 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
11820 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
11830 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
11840 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
11850 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65  rred && (db->nDe
11860 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e  ferredCons+db->n
11870 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29  DeferredImmCons)
11880 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66  >0) .   || (!def
11890 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
118a0 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20  onstraint>0) .  
118b0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
118c0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
118d0 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
118e0 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
118f0 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
11900 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
11910 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  (p, "FOREIGN KEY
11920 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
11930 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
11940 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
11950 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11960 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
11970 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11980 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
11990 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
119a0 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
119b0 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
119c0 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
119d0 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
119e0 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
119f0 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
11a00 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
11a10 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
11a20 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
11a30 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
11a40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
11a50 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
11a60 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
11a70 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
11a80 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
11a90 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
11aa0 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
11ab0 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
11ac0 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
11ad0 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
11ae0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
11af0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
11b00 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
11b10 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
11b20 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
11b30 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
11b40 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
11b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
11b60 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
11b70 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
11b80 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
11b90 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
11ba0 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
11bb0 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
11bc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
11bd0 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
11be0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
11c10 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
11c20 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
11c30 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
11c40 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
11c50 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
11c60 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
11c70 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
11c80 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
11c90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
11ca0 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
11cb0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
11cc0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
11cd0 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
11ce0 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
11cf0 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
11d00 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
11d10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
11d20 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
11d30 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
11d40 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
11d50 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
11d60 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
11d70 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
11d80 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
11d90 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
11da0 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
11db0 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
11dc0 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
11dd0 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
11de0 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
11df0 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
11e00 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11e10 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
11e20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
11e30 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
11e40 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
11e50 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
11e60 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
11e70 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
11e80 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
11e90 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
11ea0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
11eb0 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20   p->aOnceFlag ) 
11ec0 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46  memset(p->aOnceF
11ed0 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65  lag, 0, p->nOnce
11ee0 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c  Flag);.  closeAl
11ef0 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
11f00 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
11f10 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
11f20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11f30 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
11f40 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
11f50 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
11f60 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
11f70 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
11f80 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
11f90 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
11fa0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
11fb0 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
11fc0 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
11fd0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
11fe0 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
11ff0 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
12000 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
12010 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
12020 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
12030 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
12040 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
12050 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
12060 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
12070 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
12080 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
12090 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
120a0 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
120b0 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
120c0 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
120d0 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
120e0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
120f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
12100 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
12110 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
12120 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
12130 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
12140 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
12150 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
12160 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
12170 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
12180 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
12190 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
121a0 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
121b0 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
121c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
121d0 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
121e0 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
121f0 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
12200 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
12210 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
12220 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
12230 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
12240 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
12250 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
12260 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
12270 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
12280 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
12290 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
122a0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
122b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
122c0 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
122d0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
122e0 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
122f0 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
12300 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
12310 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
12320 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
12330 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
12340 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
12350 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
12360 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
12370 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
12380 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
12390 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
123a0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
123b0 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
123c0 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
123d0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
123e0 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
123f0 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
12400 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
12410 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
12420 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
12430 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
12440 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
12450 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
12460 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
12470 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
12480 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
12490 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
124a0 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
124b0 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
124c0 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
124d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
124e0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
124f0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12500 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12510 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
12520 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
12530 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
12540 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
12550 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
12560 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
12570 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
12580 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
12590 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
125a0 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
125b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
125c0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
125d0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
125e0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
125f0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12600 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
12610 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
12620 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
12630 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
12640 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
12650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12660 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
12670 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
12680 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
12690 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
126a0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
126b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
126c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
126d0 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
126e0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
126f0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
12700 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
12710 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
12720 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
12730 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
12740 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
12750 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
12760 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
12770 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
12780 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
12790 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
127a0 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
127b0 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
127c0 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
127d0 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
127e0 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
127f0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
12800 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
12810 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
12820 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
12830 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
12840 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
12850 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
12860 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
12870 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
12880 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
12890 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
128a0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
128b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
128c0 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
128d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
128e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
128f0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
12900 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
12910 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12920 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
12930 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12940 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
12950 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12960 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12970 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
12980 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
12990 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
129a0 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
129b0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
129c0 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
129d0 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
129e0 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
129f0 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
12a00 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
12a10 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
12a20 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
12a30 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
12a40 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
12a50 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
12a60 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
12a70 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
12a80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
12a90 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
12aa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
12ab0 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
12ac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12ad0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12ae0 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
12af0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
12b00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
12b10 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
12b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
12b30 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
12b40 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
12b50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12b60 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
12b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
12b80 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
12b90 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
12ba0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
12bb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
12bc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
12bd0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
12be0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
12bf0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
12c00 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
12c10 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
12c20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
12c30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12c40 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
12c50 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
12c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
12c70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
12c80 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
12c90 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
12ca0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
12cb0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
12cc0 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
12cd0 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ment = 0;.    }e
12ce0 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65  lse if( eStateme
12cf0 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ntOp==0 ){.     
12d00 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
12d10 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
12d20 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
12d30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
12d40 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
12d50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20  OINT_RELEASE;.  
12d60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
12d70 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
12d80 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
12d90 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
12da0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
12db0 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ACK;.      }else
12dc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12dd0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
12de0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
12df0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
12e00 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
12e10 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
12e20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
12e30 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
12e40 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
12e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12e60 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61   .    /* If eSta
12e70 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d  tementOp is non-
12e80 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61  zero, then a sta
12e90 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
12ea0 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  on needs to.    
12eb0 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ** be committed 
12ec0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  or rolled back. 
12ed0 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  Call sqlite3Vdbe
12ee0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29  CloseStatement()
12ef0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f   to.    ** do so
12f00 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74  . If this operat
12f10 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
12f20 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75  rror, and the cu
12f30 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a  rrent statement.
12f40 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
12f50 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  e is SQLITE_OK o
12f60 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  r SQLITE_CONSTRA
12f70 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74  INT, then promot
12f80 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  e the.    ** cur
12f90 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65  rent statement e
12fa0 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a  rror code..    *
12fb0 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  /.    if( eState
12fc0 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20  mentOp ){.      
12fd0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
12fe0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
12ff0 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b  , eStatementOp);
13000 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
13010 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
13020 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
13030 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53   (p->rc&0xff)==S
13040 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
13050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
13060 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
13070 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13080 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
13090 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
130a0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
130b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
130c0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
130d0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
130e0 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
130f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
13100 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
13110 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
13120 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
13130 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
13140 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
13150 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
13160 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
13170 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
13180 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61  ELETE and no sta
13190 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
131a0 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65  on.    ** has be
131b0 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  en rolled back, 
131c0 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  update the datab
131d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  ase connection c
131e0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a  hange-counter. .
131f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
13200 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b  ->changeCntOn ){
13210 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74  .      if( eStat
13220 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49  ementOp!=SAVEPOI
13230 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
13240 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13250 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
13260 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
13270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
13290 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
132a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
132b0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
132c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
132d0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a  ease the locks *
132e0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
132f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a  eLeave(p);.  }..
13300 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63    /* We have suc
13310 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64  cessfully halted
13320 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20   and closed the 
13330 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73  VM.  Record this
13340 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20   fact. */.  if( 
13350 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
13360 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d  db->nVdbeActive-
13370 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72  -;.    if( !p->r
13380 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56  eadOnly ) db->nV
13390 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20  dbeWrite--;.    
133a0 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
133b0 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64   ) db->nVdbeRead
133c0 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
133d0 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
133e0 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
133f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
13400 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d  ->nVdbeRead>=db-
13410 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
13420 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
13430 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a  VdbeWrite>=0 );.
13440 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
13450 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
13460 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  ;.  checkActiveV
13470 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66  dbeCnt(db);.  if
13480 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
13490 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
134a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
134b0 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  M;.  }..  /* If 
134c0 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
134d0 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74  flag is set to t
134e0 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f  rue, then any lo
134f0 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65  cks that were he
13500 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65  ld.  ** by conne
13510 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f  ction db have no
13520 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e  w been released.
13530 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e   Call sqlite3Con
13540 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
13550 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b  ) .  ** to invok
13560 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75  e any required u
13570 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c  nlock-notify cal
13580 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69  lbacks..  */.  i
13590 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
135a0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
135b0 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
135c0 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61  ed(db);.  }..  a
135d0 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
135e0 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e  Active>0 || db->
135f0 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c  autoCommit==0 ||
13600 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d   db->nStatement=
13610 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
13620 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
13630 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  SY ? SQLITE_BUSY
13640 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d   : SQLITE_OK);.}
13650 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
13660 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
13670 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
13680 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
13690 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
136a0 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
136b0 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
136c0 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
136d0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
136e0 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
136f0 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
13700 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
13710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13720 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72  *.** Copy the er
13730 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
13740 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e  or message belon
13750 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45  ging to the VDBE
13760 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
13770 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
13780 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65   to its database
13790 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74   handle (so that
137a0 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a   they will be .*
137b0 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61  * returned by ca
137c0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  lls to sqlite3_e
137d0 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c  rrcode() and sql
137e0 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a  ite3_errmsg())..
137f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
13800 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65  ion does not cle
13810 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f  ar the VDBE erro
13820 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67  r code or messag
13830 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65  e, just.** copie
13840 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61  s them to the da
13850 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
13860 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
13870 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56  eTransferError(V
13880 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
13890 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
138a0 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
138b0 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d  ;.  if( p->zErrM
138c0 73 67 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c  sg ){.    u8 mal
138d0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e  locFailed = db->
138e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
138f0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
13900 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
13910 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d    if( db->pErr==
13920 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73  0 ) db->pErr = s
13930 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
13940 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
13950 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
13960 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
13970 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
13980 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
13990 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
139a0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
139b0 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  );.    db->mallo
139c0 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63  cFailed = malloc
139d0 46 61 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e  Failed;.    db->
139e0 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
139f0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
13a00 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
13a10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13a20 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
13a30 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
13a40 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c  ./*.** If an SQL
13a50 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
13a60 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74  G hook is regist
13a70 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20  ered and the VM 
13a80 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a  has been run, .*
13a90 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a  * invoke it..*/.
13aa0 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
13ab0 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62  InvokeSqllog(Vdb
13ac0 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c  e *v){.  if( sql
13ad0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
13ae0 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72  .xSqllog && v->r
13af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13b00 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63  v->zSql && v->pc
13b10 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=0 ){.    char 
13b20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c  *zExpanded = sql
13b30 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71  ite3VdbeExpandSq
13b40 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20  l(v, v->zSql);. 
13b50 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62     assert( v->db
13b60 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
13b70 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e  ;.    if( zExpan
13b80 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ded ){.      sql
13b90 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
13ba0 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20  .xSqllog(.      
13bb0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
13bc0 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
13bd0 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61  rg, v->db, zExpa
13be0 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b  nded, 1.      );
13bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
13c00 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70  Free(v->db, zExp
13c10 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  anded);.    }.  
13c20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
13c30 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  ne vdbeInvokeSql
13c40 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  log(x).#endif../
13c50 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
13c60 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
13c70 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
13c80 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
13c90 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
13ca0 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
13cb0 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
13cc0 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
13cd0 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
13ce0 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
13cf0 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
13d00 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
13d10 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
13d20 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
13d30 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
13d40 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
13d50 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
13d60 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
13d70 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
13d80 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
13d90 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
13da0 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
13db0 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
13dc0 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
13dd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13de0 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
13df0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
13e00 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
13e10 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
13e20 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
13e30 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
13e40 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
13e50 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
13e60 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
13e70 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
13e80 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
13e90 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
13ea0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
13eb0 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  Halt(p);..  /* I
13ec0 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
13ed0 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
13ee0 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
13ef0 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
13f00 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
13f10 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
13f20 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
13f30 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
13f40 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
13f50 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
13f60 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
13f70 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
13f80 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
13f90 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
13fa0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
13fb0 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
13fc0 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
13fd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
13fe0 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
13ff0 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
14000 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c    vdbeInvokeSqll
14010 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  og(p);.    sqlit
14020 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
14030 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ror(p);.    sqli
14040 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14050 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
14060 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
14070 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
14080 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
14090 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
140a0 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
140b0 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
140c0 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
140d0 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
140e0 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
140f0 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
14100 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
14110 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
14120 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
14130 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
14140 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
14150 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
14160 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
14170 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
14180 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
14190 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
141a0 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d   p->rc, p->zErrM
141b0 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70  sg ? "%s" : 0, p
141c0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
141d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
141e0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
141f0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
14200 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
14210 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
14220 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
14230 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
14240 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
14250 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
14260 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
14270 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
14280 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
14290 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
142a0 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
142b0 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
142c0 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
142d0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
142e0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
142f0 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
14300 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14310 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
14320 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
14330 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
14340 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
14350 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
14360 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
14370 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71        if( p->zSq
14380 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  l ){.        cha
14390 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20  r c, pc = 0;.   
143a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
143b0 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
143c0 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
143d0 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20  p->zSql[i])!=0; 
143e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
143f0 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66  if( pc=='\n' ) f
14400 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
14410 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  ");.          pu
14420 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
14430 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20        pc = c;.  
14440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14450 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66  if( pc!='\n' ) f
14460 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
14470 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14480 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
14490 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
144a0 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d    char zHdr[100]
144b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
144c0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
144d0 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22  f(zHdr), zHdr, "
144e0 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75  %6u %12llu %8llu
144f0 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
14500 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
14510 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
14520 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
14530 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
14540 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
14550 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
14560 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
14570 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70     );.        fp
14580 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
14590 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20   zHdr);.        
145a0 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
145b0 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
145c0 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
145d0 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
145e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
145f0 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e  dif.  p->iCurren
14600 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  tTime = 0;.  p->
14610 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
14620 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72  IC_INIT;.  retur
14630 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
14640 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
14650 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
14660 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
14670 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
14680 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
14690 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
146a0 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
146b0 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
146c0 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
146d0 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
146e0 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
146f0 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
14700 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14710 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
14720 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
14730 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
14740 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
14750 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
14760 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
14770 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
14780 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
14790 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a  ask)==rc );.  }.
147a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
147b0 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
147c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
147d0 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69   parameter iOp i
147e0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
147f0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
14800 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
14810 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72  .** all auxiliar
14820 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
14830 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
14840 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
14850 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  d as.** the firs
14860 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
14870 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20  * Or, if iOp is 
14880 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
14890 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
148a0 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74  hen the destruct
148b0 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e  or is.** only in
148c0 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20  voked for those 
148d0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
148e0 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20  ointers created 
148f0 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20  by the user .** 
14900 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64  function invoked
14910 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74   by the OP_Funct
14920 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e  ion opcode at in
14930 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66  struction iOp of
14940 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61   .** VM pVdbe, a
14950 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a  nd only then if:
14960 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
14970 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74  associated funct
14980 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  ion parameter is
14990 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74   the 32nd or lat
149a0 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20  er (counting.** 
149b0 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74       from left t
149c0 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a  o right), or.**.
149d0 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72  **    * the corr
149e0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
149f0 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69   argument mask i
14a00 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74  s clear (where t
14a10 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20  he first.**     
14a20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
14a30 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ter corresponds 
14a40 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a  to bit 0 etc.)..
14a50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
14a60 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
14a70 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 69 6e  (Vdbe *pVdbe, in
14a80 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29  t iOp, int mask)
14a90 7b 0a 20 20 41 75 78 44 61 74 61 20 2a 2a 70 70  {.  AuxData **pp
14aa0 20 3d 20 26 70 56 64 62 65 2d 3e 70 41 75 78 44   = &pVdbe->pAuxD
14ab0 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70  ata;.  while( *p
14ac0 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61  p ){.    AuxData
14ad0 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20   *pAux = *pp;.  
14ae0 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20    if( (iOp<0).  
14af0 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70     || (pAux->iOp
14b00 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e  ==iOp && (pAux->
14b10 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73  iArg>31 || !(mas
14b20 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41  k & MASKBIT32(pA
14b30 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20  ux->iArg)))).   
14b40 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
14b50 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d  se( pAux->iArg==
14b60 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  31 );.      if( 
14b70 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
14b80 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
14b90 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
14ba0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
14bb0 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e    *pp = pAux->pN
14bc0 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
14bd0 65 33 44 62 46 72 65 65 28 70 56 64 62 65 2d 3e  e3DbFree(pVdbe->
14be0 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d  db, pAux);.    }
14bf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20  else{.      pp= 
14c00 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  &pAux->pNext;.  
14c10 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
14c20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
14c30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
14c40 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
14c50 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
14c60 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65  rgument,.** exce
14c70 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74  pt for object it
14c80 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70  self, which is p
14c90 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
14ca0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
14cb0 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
14cc0 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33  tion and sqlite3
14cd0 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20  VdbeDelete() is 
14ce0 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65  that.** VdbeDele
14cf0 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b  te() also unlink
14d00 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  s the Vdbe from 
14d10 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20  the list of VMs 
14d20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
14d30 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14d40 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66  connection and f
14d50 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20  rees the object 
14d60 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20  itself..*/.void 
14d70 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
14d80 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
14d90 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
14da0 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62  SubProgram *pSub
14db0 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20  , *pNext;.  int 
14dc0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  i;.  assert( p->
14dd0 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d  db==0 || p->db==
14de0 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  db );.  releaseM
14df0 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
14e00 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c   p->nVar);.  rel
14e10 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
14e20 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
14e30 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
14e40 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70  N);.  for(pSub=p
14e50 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62  ->pProgram; pSub
14e60 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20  ; pSub=pNext){. 
14e70 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d     pNext = pSub-
14e80 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65  >pNext;.    vdbe
14e90 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
14ea0 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d  pSub->aOp, pSub-
14eb0 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  >nOp);.    sqlit
14ec0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
14ed0 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  b);.  }.  for(i=
14ee0 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30  p->nzVar-1; i>=0
14ef0 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62  ; i--) sqlite3Db
14f00 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61  Free(db, p->azVa
14f10 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65  r[i]);.  vdbeFre
14f20 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
14f30 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
14f40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14f50 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
14f60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14f70 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  db, p->zSql);.  
14f80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14f90 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66  , p->pFree);.#if
14fa0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14fb0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
14fc0 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  S.  for(i=0; i<p
14fd0 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
14fe0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
14ff0 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d  (db, p->aScan[i]
15000 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
15010 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15020 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65 6e 64   p->aScan);.#end
15030 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  if.}../*.** Dele
15040 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
15050 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
15060 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
15070 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
15080 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56   *db;..  if( NEV
15090 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
150a0 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  n;.  db = p->db;
150b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
150c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
150d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
150e0 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
150f0 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
15100 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
15110 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
15120 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
15130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
15140 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
15150 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
15160 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
15170 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
15180 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
15190 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
151a0 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
151b0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
151c0 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
151d0 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
151e0 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
151f0 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22  .** The cursor "
15200 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67  p" has a pending
15210 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20   seek operation 
15220 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74  that has not yet
15230 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64   been.** carried
15240 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20   out.  Seek the 
15250 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20  cursor now.  If 
15260 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
15270 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61   return.** the a
15280 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
15290 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
152a0 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
152b0 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72  LINE handleDefer
152c0 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  redMoveto(VdbeCu
152d0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
152e0 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
152f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78  SQLITE_TEST.  ex
15300 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
15310 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
15320 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
15330 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
15340 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
15350 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 72  ->isTable );.  r
15360 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
15370 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
15380 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
15390 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
153a0 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
153b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
153c0 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65   if( res!=0 ) re
153d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
153e0 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66  UPT_BKPT;.#ifdef
153f0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
15400 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
15410 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
15420 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
15430 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  o = 0;.  p->cach
15440 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
15450 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20  STALE;.  return 
15460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15470 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61  .** Something ha
15480 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22  s moved cursor "
15490 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e  p" out of place.
154a0 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20    Maybe the row 
154b0 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65  it was.** pointe
154c0 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64  d to was deleted
154d0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
154e0 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68  it.  Or maybe th
154f0 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72  e btree was.** r
15500 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74  ebalanced.  What
15510 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20  ever the cause, 
15520 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22  try to restore "
15530 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20  p" to the place 
15540 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65  it.** is suppose
15550 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67  d to be pointing
15560 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61  .  If the row wa
15570 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
15580 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20  om under the.** 
15590 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20  cursor, set the 
155a0 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
155b0 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  to a NULL row..*
155c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
155d0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
155e0 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56  dleMovedCursor(V
155f0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
15600 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74   int isDifferent
15610 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72  Row, rc;.  asser
15620 74 28 20 70 2d 3e 70 43 75 72 73 6f 72 21 3d 30  t( p->pCursor!=0
15630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
15640 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
15650 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72  HasMoved(p->pCur
15660 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
15670 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
15680 72 52 65 73 74 6f 72 65 28 70 2d 3e 70 43 75 72  rRestore(p->pCur
15690 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e  sor, &isDifferen
156a0 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68  tRow);.  p->cach
156b0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
156c0 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44  STALE;.  if( isD
156d0 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d  ifferentRow ) p-
156e0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
156f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15700 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73  .** Check to ens
15710 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
15720 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52  sor is valid.  R
15730 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
15740 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e  r.** if need be.
15750 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f    Return any I/O
15760 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20   error from the 
15770 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f  restore operatio
15780 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
15790 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f  3VdbeCursorResto
157a0 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  re(VdbeCursor *p
157b0 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
157c0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
157d0 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20  ved(p->pCursor) 
157e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
157f0 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
15800 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
15810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15820 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
15830 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72  he cursor p is r
15840 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20  eady to read or 
15850 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f  write the row to
15860 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73   which it.** was
15870 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64   last positioned
15880 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
15890 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f  or code if an OO
158a0 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65  M fault or I/O e
158b0 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73  rror.** prevents
158c0 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f   us from positio
158d0 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
158e0 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70  to its correct p
158f0 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  osition..**.** I
15900 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
15910 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
15920 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
15930 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
15940 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
15950 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20    If no move is 
15960 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74  pending, check t
15970 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77  o see if the row
15980 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c   has been.** del
15990 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
159a0 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61  der the cursor a
159b0 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61  nd if it has, ma
159c0 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a  rk the row as.**
159d0 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a   a NULL row..**.
159e0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
159f0 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
15a00 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72  ting to the corr
15a10 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74  ect row and that
15a20 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20   row has.** not 
15a30 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
15a40 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
15a50 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69  cursor, then thi
15a60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
15a70 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
15a80 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
15a90 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
15aa0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65  *p){.  if( p->de
15ab0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
15ac0 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
15ad0 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
15ae0 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  p);.  }.  if( p-
15af0 3e 70 43 75 72 73 6f 72 20 26 26 20 73 71 6c 69  >pCursor && sqli
15b00 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
15b10 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
15b20 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
15b30 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
15b40 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  or(p);.  }.  ret
15b50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15b60 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
15b70 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a  owing functions:
15b80 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  .**.** sqlite3Vd
15b90 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a  beSerialType().*
15ba0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
15bb0 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20  ialTypeLen().** 
15bc0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15bd0 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lLen().** sqlite
15be0 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29  3VdbeSerialPut()
15bf0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
15c00 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a  erialGet().**.**
15c10 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65   encapsulate the
15c20 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61   code that seria
15c30 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72  lizes values for
15c40 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69   storage in SQLi
15c50 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69  te.** data and i
15c60 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61  ndex records. Ea
15c70 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  ch serialized va
15c80 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  lue consists of 
15c90 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70  a.** 'serial-typ
15ca0 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66  e' and a blob of
15cb0 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61   data. The seria
15cc0 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62  l type is an 8-b
15cd0 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20  yte unsigned.** 
15ce0 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20  integer, stored 
15cf0 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a  as a varint..**.
15d00 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20  ** In an SQLite 
15d10 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68  index record, th
15d20 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
15d30 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79   stored directly
15d40 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62   before.** the b
15d50 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74  lob of data that
15d60 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20   it corresponds 
15d70 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72  to. In a table r
15d80 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61  ecord, all seria
15d90 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73  l.** types are s
15da0 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
15db0 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
15dc0 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20  , and the blobs 
15dd0 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68  of data at.** th
15de0 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65  e end. Hence the
15df0 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c  se functions all
15e00 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  ow the caller to
15e10 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73   handle the.** s
15e20 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64  erial-type and d
15e30 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74  ata blob separat
15e40 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ely..**.** The f
15e50 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
15e60 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72  escribes the var
15e70 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61  ious storage cla
15e80 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a  sses for data:.*
15e90 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79  *.**   serial ty
15ea0 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20  pe        bytes 
15eb0 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70  of data      typ
15ec0 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
15ed0 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
15ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
15ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
15f00 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
15f10 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
15f20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20          NULL.** 
15f30 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
15f40 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
15f50 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
15f60 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32  nteger.**      2
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f80 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
15f90 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
15fa0 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
15fd0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
15fe0 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
15ff0 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20           4      
16000 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
16010 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20  eger.**      5  
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
16040 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
16050 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20  *      6        
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
16070 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
16080 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
16090 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20   7              
160a0 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
160b0 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a      IEEE float.*
160c0 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20  *      8        
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
160e0 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
160f0 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20  r constant 0.** 
16100 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20       9          
16110 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
16120 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
16130 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20  constant 1.**   
16140 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20    10,11         
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16160 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66        reserved f
16170 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20  or expansion.** 
16180 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65     N>=12 and eve
16190 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32  n       (N-12)/2
161a0 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20          BLOB.** 
161b0 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64     N>=13 and odd
161c0 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32          (N-13)/2
161d0 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a          text.**.
161e0 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74  ** The 8 and 9 t
161f0 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20  ypes were added 
16200 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66  in 3.3.0, file f
16210 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20  ormat 4.  Prior 
16220 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53  versions.** of S
16230 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75  QLite will not u
16240 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20  nderstand those 
16250 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f  serial types..*/
16260 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16270 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66  he serial-type f
16280 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
16290 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a  red in pMem..*/.
162a0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
162b0 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70  erialType(Mem *p
162c0 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
162d0 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61  rmat){.  int fla
162e0 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
162f0 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 69 66  ;.  u32 n;..  if
16300 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ( flags&MEM_Null
16310 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
16320 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
16330 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
16340 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
16350 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
16360 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
16370 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
16380 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
16390 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
163a0 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
163b0 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
163c0 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
163d0 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
163e0 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73  u = ~i;.    }els
163f0 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
16400 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
16410 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 72 65  =127 ){.      re
16420 74 75 72 6e 20 28 28 69 26 31 29 3d 3d 69 20 26  turn ((i&1)==i &
16430 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  & file_format>=4
16440 29 20 3f 20 38 2b 28 75 33 32 29 75 20 3a 20 31  ) ? 8+(u32)u : 1
16450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16460 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72  u<=32767 ) retur
16470 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 2;.    if( u<=
16480 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e  8388607 ) return
16490 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32   3;.    if( u<=2
164a0 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75  147483647 ) retu
164b0 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 4;.    if( u<
164c0 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74  =MAX_6BYTE ) ret
164d0 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72  urn 5;.    retur
164e0 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
164f0 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
16500 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
16510 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65   }.  assert( pMe
16520 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  m->db->mallocFai
16530 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45  led || flags&(ME
16540 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
16550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
16560 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d  m->n>=0 );.  n =
16570 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20   (u32)pMem->n;. 
16580 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
16590 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
165a0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
165b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 28  .  }.  return ((
165c0 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
165d0 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
165e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
165f0 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
16600 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
16610 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
16620 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
16630 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  ype..*/.u32 sqli
16640 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
16650 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
16660 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
16670 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
16680 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
16690 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
166a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
166b0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a  ic const u8 aSiz
166c0 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  e[] = { 0, 1, 2,
166d0 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20   3, 4, 6, 8, 8, 
166e0 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
166f0 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73    return aSize[s
16700 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
16710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
16720 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
16730 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
16740 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
16750 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
16760 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
16770 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
16780 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
16790 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
167a0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
167b0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
167c0 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
167d0 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
167e0 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
167f0 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
16800 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
16810 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
16820 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
16830 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
16840 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
16850 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
16860 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
16870 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
16880 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
16890 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
168a0 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
168b0 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
168c0 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
168d0 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
168e0 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
168f0 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
16900 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
16910 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
16920 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
16930 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
16940 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
16950 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
16960 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
16970 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
16980 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
16990 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
169a0 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
169b0 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
169c0 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
169d0 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
169e0 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
169f0 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
16a00 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
16a10 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
16a20 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
16a30 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
16a40 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
16a50 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
16a60 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
16a70 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
16a80 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
16a90 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
16aa0 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
16ab0 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
16ac0 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
16ad0 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
16ae0 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
16af0 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
16b00 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
16b10 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
16b20 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
16b30 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
16b40 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
16b50 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
16b60 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
16b70 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
16b80 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
16b90 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
16ba0 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
16bb0 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
16bc0 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
16bd0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
16be0 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
16bf0 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
16c00 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
16c10 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
16c20 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
16c30 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
16c40 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
16c50 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
16c60 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
16c70 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
16c80 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
16c90 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
16ca0 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
16cb0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
16cc0 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
16cd0 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
16ce0 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
16cf0 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
16d00 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
16d10 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
16d20 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
16d30 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
16d40 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
16d50 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
16d60 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
16d70 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
16d80 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
16d90 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
16da0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
16db0 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
16dc0 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
16dd0 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
16de0 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
16df0 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
16e00 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
16e10 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
16e20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
16e30 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
16e40 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
16e50 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
16e60 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
16e70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
16e80 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
16e90 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
16ea0 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
16eb0 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
16ec0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
16ed0 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
16ee0 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
16ef0 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
16f00 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
16f10 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
16f20 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
16f30 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
16f40 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
16f50 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
16f60 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
16f70 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
16f80 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
16f90 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
16fa0 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20   in buf[].  The 
16fb0 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
16fc0 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c  sible.** for all
16fd0 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73  ocating enough s
16fe0 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f  pace to buf[] to
16ff0 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
17000 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76   field, exclusiv
17010 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d  e.** of the pMem
17020 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20  ->u.nZero bytes 
17030 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76  for a MEM_Zero v
17040 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  alue..**.** Retu
17050 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17060 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
17070 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
17080 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
17090 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
170a0 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
170b0 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
170c0 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
170d0 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
170e0 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
170f0 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
17100 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33  .*/ .u32 sqlite3
17110 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
17120 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   *buf, Mem *pMem
17130 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  , u32 serial_typ
17140 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a  e){.  u32 len;..
17150 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64    /* Integer and
17160 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73   Real */.  if( s
17170 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26  erial_type<=7 &&
17180 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29   serial_type>0 )
17190 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20  {.    u64 v;.   
171a0 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20   u32 i;.    if( 
171b0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
171c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
171d0 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f  sizeof(v)==sizeo
171e0 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a  f(pMem->u.r) );.
171f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c        memcpy(&v,
17200 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a   &pMem->u.r, siz
17210 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73  eof(v));.      s
17220 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
17230 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  oat(v);.    }els
17240 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65  e{.      v = pMe
17250 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20  m->u.i;.    }.  
17260 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69    len = i = sqli
17270 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17280 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
17290 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
172a0 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  >0 );.    do{.  
172b0 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28      buf[--i] = (
172c0 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
172d0 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
172e0 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20  }while( i );.   
172f0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
17300 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
17310 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
17320 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
17330 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
17340 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
17350 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
17360 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
17370 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
17380 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
17390 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
173a0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
173b0 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
173c0 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62  >n;.    memcpy(b
173d0 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
173e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
173f0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c  n;.  }..  /* NUL
17400 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30  L or constants 0
17410 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72   or 1 */.  retur
17420 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74  n 0;.}../* Input
17430 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e   "x" is a sequen
17440 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63  ce of unsigned c
17450 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72  haracters that r
17460 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69  epresent a.** bi
17470 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
17480 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71  .  Return the eq
17490 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20  uivalent native 
174a0 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69  integer.*/.#defi
174b0 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  ne ONE_BYTE_INT(
174c0 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30  x)    ((i8)(x)[0
174d0 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42  ]).#define TWO_B
174e0 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32  YTE_INT(x)    (2
174f0 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  56*(i8)((x)[0])|
17500 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[1]).#define 
17510 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78  THREE_BYTE_INT(x
17520 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28  )  (65536*(i8)((
17530 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c  x)[0])|((x)[1]<<
17540 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69  8)|(x)[2]).#defi
17550 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  ne FOUR_BYTE_UIN
17560 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29  T(x)  (((u32)(x)
17570 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d  [0]<<24)|((x)[1]
17580 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38  <<16)|((x)[2]<<8
17590 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e  )|(x)[3]).#defin
175a0 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  e FOUR_BYTE_INT(
175b0 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38  x) (16777216*(i8
175c0 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
175d0 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
175e0 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a  8)|(x)[3])../*.*
175f0 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
17600 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
17610 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
17620 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
17630 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
17640 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
17650 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
17660 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
17670 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a  bytes read..**.*
17680 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17690 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
176a0 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72  s two separate r
176b0 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66  outines for perf
176c0 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
176d0 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72  few cases that r
176e0 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72  equire local var
176f0 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65  iables are broke
17700 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70  n out into a sep
17710 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65  arate.** routine
17720 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74   so that in most
17730 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68   cases the overh
17740 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68  ead of moving th
17750 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a  e stack pointer.
17760 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a  ** is avoided..*
17770 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53 51  / .static u32 SQ
17780 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65  LITE_NOINLINE se
17790 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
177a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
177b0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
177c0 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
177d0 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
177e0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
177f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
17800 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
17810 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
17820 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
17830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
17840 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
17850 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
17860 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f  .){.  u64 x = FO
17870 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
17880 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55  );.  u32 y = FOU
17890 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
178a0 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32  4);.  x = (x<<32
178b0 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72  ) + y;.  if( ser
178c0 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
178d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
178e0 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32  F: R-29851-52272
178f0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
17900 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20  endian 64-bit.  
17910 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
17920 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
17930 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
17940 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
17950 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
17960 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63  M_Int;.    testc
17970 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
17980 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
17990 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
179a0 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56   R-57343-49114 V
179b0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
179c0 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30  dian IEEE 754-20
179d0 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  08 64-bit.    **
179e0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
179f0 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21  number. */.#if !
17a00 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
17a10 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
17a20 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
17a30 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56  _POINT).    /* V
17a40 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
17a50 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
17a60 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
17a70 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a  e the same.    *
17a80 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
17a90 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
17aa0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
17ab0 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
17ac0 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
17ad0 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
17ae0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
17af0 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
17b00 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
17b10 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63     */.    static
17b20 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
17b30 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
17b40 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69  )<<32;.    stati
17b50 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
17b60 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34  1 = 1.0;.    u64
17b70 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77   t2 = t1;.    sw
17b80 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
17b90 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65  at(t2);.    asse
17ba0 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
17bb0 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
17bc0 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
17bd0 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
17be0 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
17bf0 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
17c00 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
17c10 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  >u.r)==8 );.    
17c20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
17c30 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d  loat(x);.    mem
17c40 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  cpy(&pMem->u.r, 
17c50 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
17c60 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
17c70 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70  = sqlite3IsNaN(p
17c80 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f  Mem->u.r) ? MEM_
17c90 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
17ca0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b  .  }.  return 8;
17cb0 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  .}.u32 sqlite3Vd
17cc0 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
17cd0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
17ce0 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
17cf0 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
17d00 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
17d10 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d30 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
17d40 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
17d50 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17d70 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
17d80 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
17d90 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
17da0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
17db0 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
17dc0 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
17dd0 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
17de0 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
17df0 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
17e00 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
17e10 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c  ase 0: {  /* Nul
17e20 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  l */.      /* EV
17e30 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
17e40 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69  78-09375 Value i
17e50 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20  s a NULL. */.   
17e60 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
17e70 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
17e80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17e90 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20    case 1: {.    
17ea0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17eb0 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20  : R-44885-25196 
17ec0 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69  Value is an 8-bi
17ed0 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  t twos-complemen
17ee0 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  t.      ** integ
17ef0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
17f00 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54  m->u.i = ONE_BYT
17f10 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
17f20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
17f30 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
17f40 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
17f50 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
17f60 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
17f70 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
17f80 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
17f90 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
17fa0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17fb0 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75  49794-35026 Valu
17fc0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
17fd0 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 16-bit.      *
17fe0 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
17ff0 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
18000 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
18010 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
18020 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
18030 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
18040 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18050 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
18060 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
18070 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
18080 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
18090 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
180a0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
180b0 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33  -OF: R-37839-543
180c0 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  01 Value is a bi
180d0 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a  g-endian 24-bit.
180e0 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
180f0 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
18100 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
18110 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54  >u.i = THREE_BYT
18120 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
18130 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
18140 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
18150 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
18160 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
18170 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
18180 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
18190 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
181a0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
181b0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
181c0 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75  01849-26079 Valu
181d0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
181e0 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 32-bit.      *
181f0 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
18200 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
18210 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
18220 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75  FOUR_BYTE_INT(bu
18230 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
18240 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
18250 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18260 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
18270 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
18280 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
18290 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
182a0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
182b0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
182c0 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39  E-OF: R-50385-09
182d0 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62  674 Value is a b
182e0 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74  ig-endian 48-bit
182f0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
18300 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
18310 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
18320 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
18330 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20  E_UINT(buf+2) + 
18340 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
18350 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  WO_BYTE_INT(buf)
18360 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
18370 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
18380 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18390 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
183a0 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
183b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
183c0 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e    /* 8-byte sign
183d0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
183e0 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49    case 7: { /* I
183f0 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  EEE floating poi
18400 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54  nt */.      /* T
18410 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76  hese use local v
18420 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20  ariables, so do 
18430 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61  them in a separa
18440 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  te routine.     
18450 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76   ** to avoid hav
18460 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ing to move the 
18470 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e  frame pointer in
18480 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
18490 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
184a0 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73   serialGet(buf,s
184b0 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29  erial_type,pMem)
184c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
184d0 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65   8:    /* Intege
184e0 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  r 0 */.    case 
184f0 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72  9: {  /* Integer
18500 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45   1 */.      /* E
18510 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32  VIDENCE-OF: R-12
18520 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20  976-22893 Value 
18530 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30  is the integer 0
18540 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  . */.      /* EV
18550 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31  IDENCE-OF: R-181
18560 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69  43-12121 Value i
18570 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e  s the integer 1.
18580 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
18590 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70  u.i = serial_typ
185a0 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  e-8;.      pMem-
185b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
185c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
185d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
185e0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ult: {.      /* 
185f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
18600 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65  4606-31564 Value
18610 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20   is a BLOB that 
18620 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65  is (N-12)/2 byte
18630 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  s in.      ** le
18640 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45  ngth..      ** E
18650 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
18660 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20  401-00140 Value 
18670 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74  is a string in t
18680 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
18690 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e   and.      ** (N
186a0 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20  -13)/2 bytes in 
186b0 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20  length. */.     
186c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
186d0 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45  6 aFlag[] = { ME
186e0 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d  M_Blob|MEM_Ephem
186f0 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70  , MEM_Str|MEM_Ep
18700 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65  hem };.      pMe
18710 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
18720 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
18730 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
18740 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
18750 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61  em->flags = aFla
18760 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d  g[serial_type&1]
18770 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
18780 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20  Mem->n;.    }.  
18790 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
187a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
187b0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  ne is used to al
187c0 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e  locate sufficien
187d0 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55  t space for an U
187e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a  npackedRecord.**
187f0 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65   structure large
18800 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73   enough to be us
18810 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56  ed with sqlite3V
18820 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
18830 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  ) if.** the firs
18840 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
18850 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e  pointer to KeyIn
18860 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65  fo structure pKe
18870 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  yInfo..**.** The
18880 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72   space is either
18890 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
188a0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
188b0 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69  Raw() or from wi
188c0 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c  thin.** the unal
188d0 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73  igned buffer pas
188e0 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f  sed via the seco
188f0 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67  nd and third arg
18900 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62  uments (presumab
18910 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63  ly.** stack spac
18920 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65  e). If the forme
18930 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20  r, then *ppFree 
18940 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e  is set to a poin
18950 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ter that should.
18960 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ** be eventually
18970 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
18980 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
18990 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20  e3DbFree(). Or, 
189a0 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63  if the .** alloc
189b0 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d  ation comes from
189c0 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70   the pSpace/szSp
189d0 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46  ace buffer, *ppF
189e0 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ree is set to NU
189f0 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  LL.** before ret
18a00 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
18a10 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
18a20 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
18a30 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63  turned..*/.Unpac
18a40 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
18a50 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
18a60 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79  kedRecord(.  Key
18a70 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
18a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18a90 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
18aa0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  he record */.  c
18ab0 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20  har *pSpace,    
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18ad0 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63  * Unaligned spac
18ae0 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  e available */. 
18af0 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20   int szSpace,   
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61   /* Size of pSpa
18b20 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  ce[] in bytes */
18b30 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65  .  char **ppFree
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b50 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65     /* OUT: Calle
18b60 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68  r should free th
18b70 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b  is pointer */.){
18b80 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
18b90 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  d *p;           
18ba0 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72     /* Unpacked r
18bb0 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20  ecord to return 
18bc0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20  */.  int nOff;  
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
18bf0 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66  t pSpace by nOff
18c00 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a   to align it */.
18c10 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
18c40 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  ytes required fo
18c50 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65  r *p */..  /* We
18c60 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74   want to shift t
18c70 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63  he pointer pSpac
18c80 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69  e up such that i
18c90 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67  t is 8-byte alig
18ca0 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20  ned..  ** Thus, 
18cb0 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75  we need to calcu
18cc0 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f  late a value, nO
18cd0 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ff, between 0 an
18ce0 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20  d 7, to shift . 
18cf0 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70   ** it by.  If p
18d00 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79  Space is already
18d10 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c   8-byte aligned,
18d20 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20   nOff should be 
18d30 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66  zero..  */.  nOf
18d40 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45  f = (8 - (SQLITE
18d50 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61  _PTR_TO_INT(pSpa
18d60 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20  ce) & 7)) & 7;. 
18d70 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
18d80 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
18d90 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66  ecord)) + sizeof
18da0 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d  (Mem)*(pKeyInfo-
18db0 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66  >nField+1);.  if
18dc0 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b  ( nByte>szSpace+
18dd0 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20  nOff ){.    p = 
18de0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
18df0 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
18e00 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64  cRaw(pKeyInfo->d
18e10 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a  b, nByte);.    *
18e20 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a  ppFree = (char *
18e30 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29  )p;.    if( !p )
18e40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
18e50 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70  se{.    p = (Unp
18e60 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53  ackedRecord*)&pS
18e70 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20  pace[nOff];.    
18e80 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  *ppFree = 0;.  }
18e90 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d  ..  p->aMem = (M
18ea0 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
18eb0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
18ec0 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
18ed0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
18ee0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
18ef0 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49  =0 );.  p->pKeyI
18f00 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
18f10 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
18f20 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
18f30 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
18f40 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
18f50 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
18f60 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
18f70 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
18f80 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
18f90 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
18fa0 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
18fb0 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
18fc0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
18fd0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
18fe0 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
18ff0 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
19000 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
19010 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
19020 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
19030 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
19040 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
19050 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
19060 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
19070 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
19080 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
19090 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
190a0 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
190b0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
190c0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
190d0 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
190e0 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
190f0 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
19100 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
19110 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
19120 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
19130 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
19140 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
19150 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
19180 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
19190 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
191a0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
191b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
191c0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
191d0 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
191e0 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
191f0 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
19200 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
19210 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
19220 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
19230 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
19240 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
19250 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
19260 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
19270 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
19280 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20  zHdr && d<=nKey 
19290 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
192a0 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
192b0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
192c0 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
192d0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d  al_type);.    pM
192e0 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em->enc = pKeyIn
192f0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65  fo->enc;.    pMe
19300 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m->db = pKeyInfo
19310 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65  ->db;.    /* pMe
19320 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f  m->flags = 0; //
19330 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19340 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74  alGet() will set
19350 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a   this for us */.
19360 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c      pMem->szMall
19370 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
19380 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19390 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
193a0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
193b0 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
193c0 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70      if( (++u)>=p
193d0 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b  ->nField ) break
193e0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
193f0 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  u<=pKeyInfo->nFi
19400 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e  eld + 1 );.  p->
19410 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23  nField = u;.}..#
19420 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
19430 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
19440 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f  ion compares two
19450 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
19460 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74  record keys in t
19470 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61  he same way.** a
19480 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  s the sqlite3Vdb
19490 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
194a0 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65   routine. Unlike
194b0 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
194c0 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  re(),.** this fu
194d0 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69  nction deseriali
194e0 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73  zes and compares
194f0 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68   values using th
19500 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  e.** sqlite3Vdbe
19510 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20  SerialGet() and 
19520 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
19530 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49  e() functions. I
19540 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20  t is used.** in 
19550 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
19560 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
19570 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64  at the optimized
19580 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69   code in.** sqli
19590 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
195a0 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72  pare() returns r
195b0 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73  esults with thes
195c0 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73  e two primitives
195d0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
195e0 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  rue if the resul
195f0 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
19600 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
19610 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a   desiredResult..
19620 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  ** Return false 
19630 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
19640 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  sagreement..*/.s
19650 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
19660 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
19670 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
19680 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
19690 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
196a0 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65  .  const Unpacke
196b0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c  dRecord *pPKey2,
196c0 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
196d0 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65  .  int desiredRe
196e0 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  sult            
196f0 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77   /* Correct answ
19700 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  er */.){.  u32 d
19710 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
19720 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
19730 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
19740 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
19750 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
19760 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
19770 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
19780 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
19790 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
197a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
197b0 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
197c0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
197d0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  0;.  int rc = 0;
197e0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
197f0 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
19800 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
19810 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
19820 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
19830 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
19840 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
19850 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
19860 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
19870 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
19880 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b  .  mem1.enc = pK
19890 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d  eyInfo->enc;.  m
198a0 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
198b0 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31  o->db;.  /* mem1
198c0 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20  .flags = 0;  // 
198d0 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  Will be initiali
198e0 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  zed by sqlite3Vd
198f0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f  beSerialGet() */
19900 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
19910 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  1.szMalloc = 0; 
19920 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
19930 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
19940 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a  tements */..  /*
19950 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63   Compilers may c
19960 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d  omplain that mem
19970 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69  1.u.i is potenti
19980 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a  ally uninitializ
19990 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c  ed..  ** We coul
199a0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c  d initialize it,
199b0 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20   as shown here, 
199c0 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65  to silence those
199d0 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a   complaints..  *
199e0 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d  * But in fact, m
199f0 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76  em1.u.i will nev
19a00 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75  er actually be u
19a10 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  sed uninitialize
19a20 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20  d, and doing .  
19a30 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61  ** the unnecessa
19a40 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ry initializatio
19a50 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62  n has a measurab
19a60 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66  le negative perf
19a70 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70  ormance.  ** imp
19a80 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20  act, since this 
19a90 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72  routine is a ver
19aa0 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20  y high runner.  
19ab0 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73  And so, we choos
19ac0 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65  e.  ** to ignore
19ad0 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61   the compiler wa
19ae0 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65  rnings and leave
19af0 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75   this variable u
19b00 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
19b10 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e  */.  /*  mem1.u.
19b20 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e  i = 0;  // not n
19b30 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73  eeded, here to s
19b40 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20  ilence compiler 
19b50 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20  warning */.  .  
19b60 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
19b70 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
19b80 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  );.  d1 = szHdr1
19b90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
19ba0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
19bb0 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
19bc0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c  pPKey2->nField |
19bd0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
19be0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
19bf0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
19c00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
19c10 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
19c20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
19c30 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
19c40 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
19c50 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
19c60 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
19c70 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
19c80 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
19c90 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
19ca0 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
19cb0 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
19cc0 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
19cd0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
19ce0 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
19cf0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
19d00 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72  ough key space r
19d10 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69  emaining to avoi
19d20 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65  d.    ** a buffe
19d30 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65  r overread.  The
19d40 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65   "d1+serial_type
19d50 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69  1+2" subexpressi
19d60 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61  on will.    ** a
19d70 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72  lways be greater
19d80 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
19d90 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  o the amount of 
19da0 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61  required key spa
19db0 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74  ce..    ** Use t
19dc0 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  hat approximatio
19dd0 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d  n to avoid the m
19de0 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61  ore expensive ca
19df0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
19e00 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
19e10 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63  peLen() in the c
19e20 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20  ommon case..    
19e30 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65  */.    if( d1+se
19e40 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33  rial_type1+2>(u3
19e50 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20  2)nKey1.     && 
19e60 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65  d1+sqlite3VdbeSe
19e70 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
19e80 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e  al_type1)>(u32)n
19e90 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20  Key1 .    ){.   
19ea0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19eb0 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
19ec0 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
19ed0 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
19ee0 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
19ef0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
19f00 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
19f10 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
19f20 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
19f30 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
19f40 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
19f50 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
19f60 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
19f70 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f  Mem[i], pKeyInfo
19f80 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20  ->aColl[i]);.   
19f90 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
19fa0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
19fb0 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
19fc0 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
19fd0 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  below */.      i
19fe0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
19ff0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1a000 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20        rc = -rc; 
1a010 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
1a020 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73  esult for DESC s
1a030 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ort order. */.  
1a040 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1a050 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64   debugCompareEnd
1a060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
1a070 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1a080 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1a090 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20  y2->nField );.. 
1a0a0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
1a0b0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
1a0c0 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
1a0d0 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
1a0e0 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
1a0f0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
1a100 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
1a110 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
1a120 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
1a130 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
1a140 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
1a150 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1a160 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
1a170 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1a180 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1a190 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1a1a0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1a1b0 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1a1c0 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1a1d0 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1a1e0 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1a1f0 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1a200 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1a210 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1a220 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32  */.  rc = pPKey2
1a230 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64  ->default_rc;..d
1a240 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a  ebugCompareEnd:.
1a250 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1a260 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20  ult==0 && rc==0 
1a270 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1a280 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c  ( desiredResult<
1a290 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75  0 && rc<0 ) retu
1a2a0 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1a2b0 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72  redResult>0 && r
1a2c0 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c>0 ) return 1;.
1a2d0 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1a2e0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1a2f0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  f( pKeyInfo->db-
1a300 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1a310 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1a320 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1a330 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
1a340 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1a350 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1a360 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e  s (a.k.a. column
1a370 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  s) in the record
1a380 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65   given by.** pKe
1a390 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72  y,nKey.  The ver
1a3a0 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f  ify that this co
1a3b0 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  unt is less than
1a3c0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1a3d0 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20  .** limit given 
1a3e0 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  by pKeyInfo->nFi
1a3f0 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld + pKeyInfo->
1a400 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49  nXField..**.** I
1a410 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  f this constrain
1a420 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69  t is not satisfi
1a430 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ed, it means tha
1a440 74 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64  t the high-speed
1a450 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f  .** vdbeRecordCo
1a460 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
1a470 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1a480 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65  String() routine
1a490 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f  s will.** not wo
1a4a0 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  rk correctly.  I
1a4b0 66 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20  f this assert() 
1a4c0 65 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70  ever fires, it p
1a4d0 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a  robably means.**
1a4e0 20 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66   that the KeyInf
1a4f0 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49  o.nField or KeyI
1a500 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75  nfo.nXField valu
1a510 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  es were computed
1a520 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  .** incorrectly.
1a530 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a540 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1a550 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1a560 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  (.  int nKey, co
1a570 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1a580 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
1a590 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20  to verify */ .  
1a5a0 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70  const KeyInfo *p
1a5b0 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a  KeyInfo       /*
1a5c0 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69   Compare size wi
1a5d0 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20  th this KeyInfo 
1a5e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65  */.){.  int nFie
1a5f0 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a  ld = 0;.  u32 sz
1a600 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  Hdr;.  u32 idx;.
1a610 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20    u32 notUsed;. 
1a620 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1a630 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1a640 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1a650 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20  r*)pKey;..  if( 
1a660 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1a670 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  urn;.  idx = get
1a680 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
1a690 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  zHdr);.  assert(
1a6a0 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
1a6b0 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33  sert( szHdr<=(u3
1a6c0 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c  2)nKey );.  whil
1a6d0 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a  e( idx<szHdr ){.
1a6e0 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
1a6f0 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c  rint32(aKey+idx,
1a700 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e   notUsed);.    n
1a710 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61  Field++;.  }.  a
1a720 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d  ssert( nField <=
1a730 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1a740 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1a750 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  eld );.}.#else.#
1a760 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65   define vdbeAsse
1a770 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1a780 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a  inLimits(A,B,C).
1a790 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f  #endif../*.** Bo
1a7a0 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70  th *pMem1 and *p
1a7b0 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72  Mem2 contain str
1a7c0 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  ing values. Comp
1a7d0 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
1a7e0 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  es.** using the 
1a7f0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a800 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75  ce pColl. As usu
1a810 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67  al, return a neg
1a820 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20  ative , zero.** 
1a830 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  or positive valu
1a840 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c  e if *pMem1 is l
1a850 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1a860 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
1a870 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72  an .** *pMem2, r
1a880 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d  espectively. Sim
1a890 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74  ilar in spirit t
1a8a0 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29  o "rc = (*pMem1)
1a8b0 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a   - (*pMem2);"..*
1a8c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1a8d0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1a8e0 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  g(.  const Mem *
1a8f0 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d  pMem1,.  const M
1a900 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e  em *pMem2,.  con
1a910 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1a920 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20  l,.  u8 *prcErr 
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f       /* If an OO
1a950 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f  M occurs, set to
1a960 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f   SQLITE_NOMEM */
1a970 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d  .){.  if( pMem1-
1a980 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
1a990 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   ){.    /* The s
1a9a0 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61  trings are alrea
1a9b0 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  dy in the correc
1a9c0 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c  t encoding.  Cal
1a9d0 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f  l the.     ** co
1a9e0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1a9f0 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20  n directly */.  
1aa00 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e    return pColl->
1aa10 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1aa20 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31  r,pMem1->n,pMem1
1aa30 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65  ->z,pMem2->n,pMe
1aa40 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  m2->z);.  }else{
1aa50 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1aa60 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c   const void *v1,
1aa70 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31   *v2;.    int n1
1aa80 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31  , n2;.    Mem c1
1aa90 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20  ;.    Mem c2;.  
1aaa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1aab0 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d  Init(&c1, pMem1-
1aac0 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1aad0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1aae0 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d  emInit(&c2, pMem
1aaf0 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1ab00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1ab10 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1ab20 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f  &c1, pMem1, MEM_
1ab30 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  Ephem);.    sqli
1ab40 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1ab50 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32  wCopy(&c2, pMem2
1ab60 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1ab70 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61    v1 = sqlite3Va
1ab80 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1ab90 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f  _value*)&c1, pCo
1aba0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31  ll->enc);.    n1
1abb0 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63   = v1==0 ? 0 : c
1abc0 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71  1.n;.    v2 = sq
1abd0 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28  lite3ValueText((
1abe0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26  sqlite3_value*)&
1abf0 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  c2, pColl->enc);
1ac00 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20  .    n2 = v2==0 
1ac10 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20  ? 0 : c2.n;.    
1ac20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  rc = pColl->xCmp
1ac30 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e  (pColl->pUser, n
1ac40 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a  1, v1, n2, v2);.
1ac50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1ac60 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a  emRelease(&c1);.
1ac70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1ac80 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a  emRelease(&c2);.
1ac90 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c      if( (v1==0 |
1aca0 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45  | v2==0) && prcE
1acb0 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53  rr ) *prcErr = S
1acc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1acd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1ace0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1acf0 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74   two blobs.  Ret
1ad00 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1ad10 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1ad20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  if the first.** 
1ad30 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1ad40 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1ad50 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1ad60 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  nd, respectively
1ad70 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62  ..** If one blob
1ad80 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1ad90 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20  the other, then 
1ada0 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74  the shorter is t
1adb0 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74  he lessor..*/.st
1adc0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
1add0 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33  LINE int sqlite3
1ade0 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73  BlobCompare(cons
1adf0 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73  t Mem *pB1, cons
1ae00 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69  t Mem *pB2){.  i
1ae10 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42  nt c = memcmp(pB
1ae20 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42  1->z, pB2->z, pB
1ae30 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42  1->n>pB2->n ? pB
1ae40 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a  2->n : pB1->n);.
1ae50 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e    if( c ) return
1ae60 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31   c;.  return pB1
1ae70 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a  ->n - pB2->n;.}.
1ae80 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1ae90 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61  the values conta
1aea0 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20  ined by the two 
1aeb0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65  memory cells, re
1aec0 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74  turning.** negat
1aed0 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73  ive, zero or pos
1aee0 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69  itive if pMem1 i
1aef0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1af00 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1af10 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e  r.** than pMem2.
1af20 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69   Sorting order i
1af30 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20  s NULL's first, 
1af40 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62  followed by numb
1af50 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a  ers (integers.**
1af60 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74   and reals) sort
1af70 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20  ed numerically, 
1af80 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74  followed by text
1af90 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20   ordered by the 
1afa0 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
1afb0 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20  uence pColl and 
1afc0 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f  finally blob's o
1afd0 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70  rdered by memcmp
1afe0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  ()..**.** Two NU
1aff0 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  LL values are co
1b000 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62  nsidered equal b
1b010 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1b020 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
1b030 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  emCompare(const 
1b040 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73  Mem *pMem1, cons
1b050 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f  t Mem *pMem2, co
1b060 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
1b070 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66  ll){.  int f1, f
1b080 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65  2;.  int combine
1b090 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d  d_flags;..  f1 =
1b0a0 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20   pMem1->flags;. 
1b0b0 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61   f2 = pMem2->fla
1b0c0 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66  gs;.  combined_f
1b0d0 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20  lags = f1|f2;.  
1b0e0 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65  assert( (combine
1b0f0 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  d_flags & MEM_Ro
1b100 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20  wSet)==0 );. .  
1b110 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1b120 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c  is NULL, it is l
1b130 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ess than the oth
1b140 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  er. If both valu
1b150 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  es.  ** are NULL
1b160 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f  , return 0..  */
1b170 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1b180 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
1b190 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32  {.    return (f2
1b1a0 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31  &MEM_Null) - (f1
1b1b0 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  &MEM_Null);.  }.
1b1c0 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
1b1d0 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72 20 61  ue is a number a
1b1e0 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  nd the other is 
1b1f0 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  not, the number 
1b200 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
1b210 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62 65 72   both are number
1b220 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20 72 65  s, compare as re
1b230 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20 61 20  als if one is a 
1b240 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65  real, or as inte
1b250 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74  gers.  ** if bot
1b260 68 20 76 61 6c 75 65 73 20 61 72 65 20 69 6e 74  h values are int
1b270 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  egers..  */.  if
1b280 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1b290 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  &(MEM_Int|MEM_Re
1b2a0 61 6c 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  al) ){.    doubl
1b2b0 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 69 66  e r1, r2;.    if
1b2c0 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1b2d0 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1b2e0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1b2f0 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   < pMem2->u.i ) 
1b300 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1b310 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
1b320 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  > pMem2->u.i ) r
1b330 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 72  eturn 1;.      r
1b340 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1b350 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52     if( (f1&MEM_R
1b360 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1b370 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e 75 2e 72   r1 = pMem1->u.r
1b380 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1b390 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f1&MEM_Int)!=0 
1b3a0 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 28 64  ){.      r1 = (d
1b3b0 6f 75 62 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69  ouble)pMem1->u.i
1b3c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b3d0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1b3e0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 26 4d   }.    if( (f2&M
1b3f0 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1b400 20 20 20 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d       r2 = pMem2-
1b410 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20  >u.r;.    }else 
1b420 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29  if( (f2&MEM_Int)
1b430 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20  !=0 ){.      r2 
1b440 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d  = (double)pMem2-
1b450 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  >u.i;.    }else{
1b460 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1b470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b480 72 31 3c 72 32 20 29 20 72 65 74 75 72 6e 20 2d  r1<r2 ) return -
1b490 31 3b 0a 20 20 20 20 69 66 28 20 72 31 3e 72 32  1;.    if( r1>r2
1b4a0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
1b4b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
1b4c0 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
1b4d0 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e  e is a string an
1b4e0 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61  d the other is a
1b4f0 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e   blob, the strin
1b500 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  g is less..  ** 
1b510 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69  If both are stri
1b520 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69  ngs, compare usi
1b530 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ng the collating
1b540 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
1b550 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1b560 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
1b570 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d  .    if( (f1 & M
1b580 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1b590 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1b5a0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20    }.    if( (f2 
1b5b0 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1b5c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1b5d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
1b5e0 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1b5f0 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20  =pMem2->enc );. 
1b600 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1b610 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1b620 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  F8 || .         
1b630 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53     pMem1->enc==S
1b640 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c  QLITE_UTF16LE ||
1b650 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1b660 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a  ITE_UTF16BE );..
1b670 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
1b680 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75  tion sequence mu
1b690 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74  st be defined at
1b6a0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65   this point, eve
1b6b0 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  n if.    ** the 
1b6c0 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65  user deletes the
1b6d0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1b6e0 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64  nce after the vd
1b6f0 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20  be program is.  
1b700 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74    ** compiled (t
1b710 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61  his was not alwa
1b720 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20  ys the case)..  
1b730 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1b740 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c   !pColl || pColl
1b750 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69  ->xCmp );..    i
1b760 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
1b770 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d    return vdbeCom
1b780 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d  pareMemString(pM
1b790 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c  em1, pMem2, pCol
1b7a0 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 0);.    }.   
1b7b0 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f   /* If a NULL po
1b7c0 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64  inter was passed
1b7d0 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20   as the collate 
1b7e0 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74  function, fall t
1b7f0 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f  hrough.    ** to
1b800 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61   the blob case a
1b810 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e  nd use memcmp().
1b820 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20    */.  }. .  /* 
1b830 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74  Both values must
1b840 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70   be blobs.  Comp
1b850 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  are using memcmp
1b860 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ().  */.  return
1b870 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1b880 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32  are(pMem1, pMem2
1b890 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
1b8a0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1b8b0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1b8c0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72  unction is a ser
1b8d0 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a  ial-type that.**
1b8e0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1b8f0 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c  an integer - all
1b900 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
1b910 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76  1 and 9 inclusiv
1b920 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20  e .** except 7. 
1b930 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74  The second point
1b940 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
1b950 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65  ntaining an inte
1b960 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72  ger value.** ser
1b970 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e  ialized accordin
1b980 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65  g to serial_type
1b990 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1b9a0 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20  deserializes.** 
1b9b0 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20  and returns the 
1b9c0 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
1b9d0 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44   i64 vdbeRecordD
1b9e0 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72  ecodeInt(u32 ser
1b9f0 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ial_type, const 
1ba00 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
1ba10 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   y;.  assert( CO
1ba20 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72  RRUPT_DB || (ser
1ba30 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73  ial_type>=1 && s
1ba40 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26  erial_type<=9 &&
1ba50 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29   serial_type!=7)
1ba60 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
1ba70 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1ba80 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73   case 0:.    cas
1ba90 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 1:.      testc
1baa0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1bab0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1bac0 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  n ONE_BYTE_INT(a
1bad0 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32  Key);.    case 2
1bae0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1baf0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1bb00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1bb10 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1bb20 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20  );.    case 3:. 
1bb30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1bb40 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1bb50 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45       return THRE
1bb60 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1bb70 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a  ;.    case 4: {.
1bb80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bb90 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1bba0 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
1bbb0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1bbc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1bbd0 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
1bbe0 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1bbf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1bc00 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1bc10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f  .      return FO
1bc20 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1bc30 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
1bc40 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1bc50 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  NT(aKey);.    }.
1bc60 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20      case 6: {.  
1bc70 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52      u64 x = FOUR
1bc80 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1bc90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bca0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1bcb0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1bcc0 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1bcd0 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1bce0 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1bcf0 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d  *(i64*)&x;.    }
1bd00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
1bd10 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29  serial_type - 8)
1bd20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1bd30 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
1bd40 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
1bd50 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65  rows or index re
1bd60 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69  cords.** specifi
1bd70 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b  ed by {nKey1, pK
1bd80 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e  ey1} and pPKey2.
1bd90 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e    It returns a n
1bda0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
1bdb0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
1bdc0 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20  eger if key1 is 
1bdd0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1bde0 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74   to or .** great
1bdf0 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54  er than key2.  T
1be00 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  he {nKey1, pKey1
1be10 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  } key must be a 
1be20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20  blob.** created 
1be30 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1be40 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
1be50 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
1be60 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
1be70 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
1be80 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
1be90 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
1bea0 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
1beb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
1bec0 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e  ent bSkip is non
1bed0 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73  -zero, it is ass
1bee0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
1bef0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1bf00 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74  .** determined t
1bf10 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69  hat the first fi
1bf20 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73  elds of the keys
1bf30 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a   are equal..**.*
1bf40 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
1bf50 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
1bf60 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
1bf70 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1bf80 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65  . If all .** fie
1bf90 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20  lds that appear 
1bfa0 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65  in both keys are
1bfb0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b   equal, then pPK
1bfc0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1bfd0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
1bfe0 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61  .**.** If databa
1bff0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1c000 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74   discovered, set
1c010 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1c020 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43   to .** SQLITE_C
1c030 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72  ORRUPT and retur
1c040 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65  n 0. If an OOM e
1c050 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1c060 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d  red, .** pPKey2-
1c070 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20  >errCode is set 
1c080 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1c090 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  and, if it is no
1c0a0 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d  t NULL, the.** m
1c0b0 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61  alloc-failed fla
1c0c0 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73  g set on databas
1c0d0 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32  e handle (pPKey2
1c0e0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e  ->pKeyInfo->db).
1c0f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1c100 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c110 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20  WithSkip(.  int 
1c120 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1c130 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
1c140 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1c150 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1c160 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2,         /* 
1c170 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1c180 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20  nt bSkip        
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c1a0 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20  * If true, skip 
1c1b0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1c1c0 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1c1f0 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1c200 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1c210 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  nt */.  int i;  
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1c240 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74   of next field t
1c250 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75  o compare */.  u
1c260 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c280 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64  * Size of record
1c290 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
1c2a0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1c2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2c0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1c2d0 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e  of first type in
1c2e0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
1c2f0 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c310 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1c320 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50    Mem *pRhs = pP
1c330 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20  Key2->aMem;     
1c340 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20    /* Next field 
1c350 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d  of pPKey2 to com
1c360 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  pare */.  KeyInf
1c370 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  o *pKeyInfo = pP
1c380 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
1c390 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1c3a0 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
1c3b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1c3c0 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d  har *)pKey1;.  M
1c3d0 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49  em mem1;..  /* I
1c3e0 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c  f bSkip is true,
1c3f0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
1c400 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74   has already det
1c410 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
1c420 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20   first.  ** two 
1c430 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1c440 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20  keys are equal. 
1c450 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20  Fix the various 
1c460 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20  stack variables 
1c470 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69  so.  ** that thi
1c480 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73  s routine begins
1c490 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68   comparing at th
1c4a0 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20  e second field. 
1c4b0 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29  */.  if( bSkip )
1c4c0 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20  {.    u32 s1;.  
1c4d0 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74    idx1 = 1 + get
1c4e0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1c4f0 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48  1], s1);.    szH
1c500 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  dr1 = aKey1[0];.
1c510 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20      d1 = szHdr1 
1c520 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  + sqlite3VdbeSer
1c530 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a  ialTypeLen(s1);.
1c540 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70      i = 1;.    p
1c550 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rhs++;.  }else{.
1c560 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61      idx1 = getVa
1c570 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1c580 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20  Hdr1);.    d1 = 
1c590 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20  szHdr1;.    if( 
1c5a0 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  d1>(unsigned)nKe
1c5b0 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b  y1 ){ .      pPK
1c5c0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1c5d0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1c5e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
1c5f0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72  turn 0;  /* Corr
1c600 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
1c610 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a      i = 0;.  }..
1c620 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1c630 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
1c640 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
1c650 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
1c660 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65  ements */.  asse
1c670 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1c680 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b  Info->nField+pPK
1c690 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1c6a0 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
1c6b0 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c  nField .       |
1c6c0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1c6d0 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1c6e0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
1c6f0 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
1c700 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1c710 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1c720 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1c730 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1c740 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1c750 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1c760 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20  l_type;..    /* 
1c770 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65  RHS is an intege
1c780 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68  r */.    if( pRh
1c790 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  s->flags & MEM_I
1c7a0 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  nt ){.      seri
1c7b0 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1c7c0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73  idx1];.      tes
1c7d0 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1c7e0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1c7f0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1c800 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =10 ){.        r
1c810 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1c820 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1c830 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1c840 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1c850 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1c860 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1c870 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20       double rhs 
1c880 3d 20 28 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e  = (double)pRhs->
1c890 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  u.i;.        sql
1c8a0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1c8b0 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1c8c0 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
1c8d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
1c8e0 65 6d 31 2e 75 2e 72 3c 72 68 73 20 29 7b 0a 20  em1.u.r<rhs ){. 
1c8f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1c900 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1c910 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 72 68 73  if( mem1.u.r>rhs
1c920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1c930 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1c940 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c950 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20        i64 lhs = 
1c960 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1c970 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c  Int(serial_type,
1c980 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20   &aKey1[d1]);.  
1c990 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20        i64 rhs = 
1c9a0 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
1c9b0 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
1c9c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1c9d0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1c9e0 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
1c9f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1ca00 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1ca10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ca20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c    /* RHS is real
1ca30 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1ca40 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1ca50 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
1ca60 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1ca70 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1ca80 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1ca90 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
1caa0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73   /* Serial types
1cab0 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61   12 or greater a
1cac0 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62  re strings and b
1cad0 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68  lobs (greater th
1cae0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  an.        ** nu
1caf0 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30  mbers). Types 10
1cb00 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72   and 11 are curr
1cb10 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20  ently "reserved 
1cb20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20  for future .    
1cb30 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20      ** use", so 
1cb40 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c  it doesn't reall
1cb50 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68  y matter what th
1cb60 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d  e results of com
1cb70 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  paring.        *
1cb80 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72  * them to number
1cb90 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20  ic values are.  
1cba0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1cbb0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1cbc0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1cbd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1cbe0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1cbf0 73 65 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62  se{.        doub
1cc00 6c 65 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75  le rhs = pRhs->u
1cc10 2e 72 3b 0a 20 20 20 20 20 20 20 20 64 6f 75 62  .r;.        doub
1cc20 6c 65 20 6c 68 73 3b 0a 20 20 20 20 20 20 20 20  le lhs;.        
1cc30 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1cc40 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1cc50 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1cc60 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  em1);.        if
1cc70 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1cc80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68   ){.          lh
1cc90 73 20 3d 20 6d 65 6d 31 2e 75 2e 72 3b 0a 20 20  s = mem1.u.r;.  
1cca0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ccb0 20 20 20 20 20 20 20 6c 68 73 20 3d 20 28 64 6f         lhs = (do
1ccc0 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20  uble)mem1.u.i;. 
1ccd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cce0 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
1ccf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1cd00 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1cd10 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
1cd20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
1cd30 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1cd40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1cd50 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69  /* RHS is a stri
1cd60 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ng */.    else i
1cd70 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1cd80 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
1cd90 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1cda0 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
1cdb0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
1cdc0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1cdd0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1cde0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1cdf0 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20  pe<12 ){.       
1ce00 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1ce10 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
1ce20 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1ce30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ce40 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1ce50 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20  .        mem1.n 
1ce60 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
1ce70 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
1ce80 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1ce90 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e  mem1.n)==(unsign
1cea0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1ceb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1cec0 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e  1+mem1.n+1)==(un
1ced0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1cee0 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1cef0 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67  mem1.n) > (unsig
1cf00 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1cf10 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1cf20 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1cf30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1cf40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1cf50 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1cf60 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1cf70 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1cf80 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
1cf90 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  ->aColl[i] ){.  
1cfa0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63          mem1.enc
1cfb0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1cfc0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1cfd0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1cfe0 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  db;.          me
1cff0 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m1.flags = MEM_S
1d000 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  tr;.          me
1d010 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61  m1.z = (char*)&a
1d020 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20  Key1[d1];.      
1d030 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
1d040 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1d050 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65               &me
1d060 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e  m1, pRhs, pKeyIn
1d070 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70  fo->aColl[i], &p
1d080 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20  PKey2->errCode. 
1d090 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1d0a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d0b0 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1d0c0 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73  MIN(mem1.n, pRhs
1d0d0 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1d0e0 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1d0f0 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1d100 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1d110 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1d120 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73   = mem1.n - pRhs
1d130 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ->n; .        }.
1d140 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1d150 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62     /* RHS is a b
1d160 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  lob */.    else 
1d170 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1d180 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  & MEM_Blob ){.  
1d190 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1d1a0 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1d1b0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1d1c0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1d1d0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1d1e0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1d1f0 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69  type<12 || (seri
1d200 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1d210 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d220 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1d230 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74  .        int nSt
1d240 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1d250 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1d260 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1d270 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e  1+nStr)==(unsign
1d280 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1d290 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1d2a0 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69  1+nStr+1)==(unsi
1d2b0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1d2c0 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53        if( (d1+nS
1d2d0 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  tr) > (unsigned)
1d2e0 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1d2f0 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1d300 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1d310 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1d320 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1d330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d340 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1d350 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1d360 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1d370 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20  Cmp = MIN(nStr, 
1d380 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1d390 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1d3a0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1d3b0 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1d3c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1d3d0 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52  ) rc = nStr - pR
1d3e0 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d  hs->n;.        }
1d3f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1d400 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75      /* RHS is nu
1d410 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a  ll */.    else{.
1d420 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1d430 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1d440 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72  .      rc = (ser
1d450 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20  ial_type!=0);.  
1d460 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
1d470 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1d480 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1d490 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1d4a0 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20     rc = -rc;.   
1d4b0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1d4c0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1d4d0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1d4e0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1d4f0 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
1d500 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1d510 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1d520 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1d530 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
1d540 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
1d550 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  +;.    pRhs++;. 
1d560 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1d570 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1d580 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
1d590 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
1d5a0 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
1d5b0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68  ial_type);.  }wh
1d5c0 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67  ile( idx1<(unsig
1d5d0 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c  ned)szHdr1 && i<
1d5e0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26  pPKey2->nField &
1d5f0 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29  & d1<=(unsigned)
1d600 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e  nKey1 );..  /* N
1d610 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1d620 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1d630 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1d640 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1d650 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1d660 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1d670 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1d680 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1d690 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1d6a0 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1d6b0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1d6c0 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1d6d0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1d6e0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1d6f0 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1d700 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1d710 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  one or both of t
1d720 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1d730 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1d740 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1d750 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1d760 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1d770 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1d780 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1d790 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43    */.  assert( C
1d7a0 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20  ORRUPT_DB .     
1d7b0 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43    || vdbeRecordC
1d7c0 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1d7d0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1d7e0 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  , pPKey2->defaul
1d7f0 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c  t_rc) .       ||
1d800 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1d810 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
1d820 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32  .  return pPKey2
1d830 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a  ->default_rc;.}.
1d840 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
1d850 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
1d860 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1d870 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
1d880 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1d890 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1d8a0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 20  *pPKey2         
1d8b0 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1d8c0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
1d8d0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1d8e0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1d8f0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1d900 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  y2, 0);.}.../*.*
1d910 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d920 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1d930 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
1d940 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1d950 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
1d960 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
1d970 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
1d980 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20  an integer, and 
1d990 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65  (b) the .** size
1d9a0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
1d9b0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
1d9c0 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
1d9d0 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
1d9e0 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69  .** byte (i.e. i
1d9f0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29  s less than 128)
1da00 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
1da10 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20   concerns about 
1da20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
1da30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1da40 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f  s only used.** o
1da50 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20  n schemas where 
1da60 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69  the maximum vali
1da70 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  d header size is
1da80 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73   63 bytes or les
1da90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1daa0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1dab0 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65  reInt(.  int nKe
1dac0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1dad0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
1dae0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1daf0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
1db00 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1db10 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
1db20 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63   u8 *aKey = &((c
1db30 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
1db40 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  *(const u8*)pKey
1db50 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74  1 & 0x3F];.  int
1db60 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28   serial_type = (
1db70 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1db80 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b  )[1];.  int res;
1db90 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20  .  u32 y;.  u64 
1dba0 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b  x;.  i64 v = pPK
1dbb0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69  ey2->aMem[0].u.i
1dbc0 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20  ;.  i64 lhs;..  
1dbd0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1dbe0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1dbf0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1dc00 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29  PKey2->pKeyInfo)
1dc10 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 28 75  ;.  assert( (*(u
1dc20 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20  8*)pKey1)<=0x3F 
1dc30 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1dc40 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1dc50 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1dc60 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
1dc70 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1dc80 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1dc90 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
1dca0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1dcb0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1dcc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1dcd0 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
1dce0 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
1dcf0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1dd00 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  lhs = TWO_BYTE_I
1dd10 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1dd20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1dd30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1dd40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
1dd50 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
1dd60 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1dd70 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45        lhs = THRE
1dd80 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1dd90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1dda0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1ddb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ddc0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
1ddd0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1dde0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20  eger */.      y 
1ddf0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1de00 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68  (aKey);.      lh
1de10 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29  s = (i64)*(int*)
1de20 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  &y;.      testca
1de30 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1de40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1de50 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
1de60 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
1de70 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1de80 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  lhs = FOUR_BYTE_
1de90 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
1dea0 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1deb0 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1dec0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ded0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1dee0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1def0 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38    case 6: { /* 8
1df00 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1df10 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20  eger */.      x 
1df20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1df30 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20  (aKey);.      x 
1df40 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52  = (x<<32) | FOUR
1df50 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1df60 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  4);.      lhs = 
1df70 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
1df80 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1df90 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1dfa0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1dfb0 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  8: .      lhs = 
1dfc0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1dfd0 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20      case 9:.    
1dfe0 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20    lhs = 1;.     
1dff0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
1e000 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20  This case could 
1e010 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f  be removed witho
1e020 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
1e030 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69  results of runni
1e040 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63  ng.    ** this c
1e050 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69  ode. Including i
1e060 74 20 63 61 75 73 65 73 20 67 63 63 20 74 6f 20  t causes gcc to 
1e070 67 65 6e 65 72 61 74 65 20 61 20 66 61 73 74 65  generate a faste
1e080 72 20 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a  r switch .    **
1e090 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63   statement (sinc
1e0a0 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73  e the range of s
1e0b0 77 69 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f  witch targets no
1e0c0 77 20 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f  w starts at zero
1e0d0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63   and.    ** is c
1e0e0 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74 20 64  ontiguous) but d
1e0f0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
1e100 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65  y duplicate code
1e110 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
1e120 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20  .    ** (as gcc 
1e130 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68  is clever enough
1e140 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
1e150 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e  two like cases).
1e160 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   Other .    ** c
1e170 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62  ompilers might b
1e180 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a  e similar.  */ .
1e190 20 20 20 20 63 61 73 65 20 30 3a 20 63 61 73 65      case 0: case
1e1a0 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e   7:.      return
1e1b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1e1c0 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1e1d0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
1e1e0 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
1e1f0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1e200 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1e210 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
1e220 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a  1, pPKey2);.  }.
1e230 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a  .  if( v>lhs ){.
1e240 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1e250 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r1;.  }else if
1e260 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v<lhs ){.    r
1e270 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
1e280 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
1e290 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
1e2a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
1e2b0 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1e2c0 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
1e2d0 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  al. Compare the 
1e2e0 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a  trailing .    **
1e2f0 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20   fields.  */.   
1e300 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
1e310 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1e320 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
1e330 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
1e340 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1e350 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
1e360 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
1e370 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64  ys are equal and
1e380 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
1e390 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69  ailing.    ** fi
1e3a0 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b  elds. Return pPK
1e3b0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1e3c0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  in this case. */
1e3d0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1e3e0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
1e3f0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
1e400 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1e410 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1e420 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20  1, pPKey2, res) 
1e430 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
1e440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1e450 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
1e460 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
1e470 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
1e480 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
1e490 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
1e4a0 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
1e4b0 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67  Key2 is a string
1e4c0 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66  , that (b) the f
1e4d0 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73  irst field.** us
1e4e0 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
1e4f0 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
1e500 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68   and (c) that th
1e510 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
1e520 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74   varint .** at t
1e530 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
1e540 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
1e550 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  n a single byte.
1e560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1e570 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1e580 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b  String(.  int nK
1e590 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1e5a0 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
1e5b0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1e5c0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
1e5d0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1e5e0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  key */.){.  cons
1e5f0 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63  t u8 *aKey1 = (c
1e600 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a  onst u8*)pKey1;.
1e610 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
1e620 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  e;.  int res;.. 
1e630 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1e640 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1e650 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  s(nKey1, pKey1, 
1e660 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1e670 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32  );.  getVarint32
1e680 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69  (&aKey1[1], seri
1e690 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20  al_type);.  if( 
1e6a0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29  serial_type<12 )
1e6b0 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
1e6c0 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20  y2->r1;      /* 
1e6d0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
1e6e0 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e   a number or a n
1e6f0 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ull */.  }else i
1e700 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65  f( !(serial_type
1e710 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20   & 0x01) ){ .   
1e720 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1e730 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  2;      /* (pKey
1e740 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c  1/nKey1) is a bl
1e750 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ob */.  }else{. 
1e760 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20     int nCmp;.   
1e770 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69   int nStr;.    i
1e780 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31  nt szHdr = aKey1
1e790 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d  [0];..    nStr =
1e7a0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
1e7b0 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28  ) / 2;.    if( (
1e7c0 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20  szHdr + nStr) > 
1e7d0 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70  nKey1 ){.      p
1e7e0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1e7f0 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1e800 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1e810 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
1e820 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1e830 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d    }.    nCmp = M
1e840 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  IN( pPKey2->aMem
1e850 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20  [0].n, nStr );. 
1e860 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
1e870 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70  &aKey1[szHdr], p
1e880 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a  PKey2->aMem[0].z
1e890 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66  , nCmp);..    if
1e8a0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
1e8b0 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70    res = nStr - p
1e8c0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
1e8d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ;.      if( res=
1e8e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
1e8f0 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
1e900 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
1e910 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
1e920 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
1e930 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
1e940 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b  ey1, pPKey2, 1);
1e950 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1e960 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
1e970 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1e980 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1e990 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
1e9a0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  s>0 ){.        r
1e9b0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
1e9c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e9d0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1e9e0 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a  y2->r1;.      }.
1e9f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
1ea00 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  s>0 ){.      res
1ea10 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
1ea20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ea30 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
1ea40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
1ea50 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
1ea60 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1ea70 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1ea80 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20  y2, res).       
1ea90 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20  || CORRUPT_DB.  
1eaa0 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e       || pPKey2->
1eab0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
1eac0 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a  llocFailed.  );.
1ead0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
1eae0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1eaf0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
1eb00 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1eb10 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69  ompare() compati
1eb20 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ble function.** 
1eb30 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d  suitable for com
1eb40 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65  paring serialize
1eb50 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  d records to the
1eb60 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
1eb70 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
1eb80 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
1eb90 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72  .*/.RecordCompar
1eba0 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  e sqlite3VdbeFin
1ebb0 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65  dCompare(Unpacke
1ebc0 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f  dRecord *p){.  /
1ebd0 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  * varintRecordCo
1ebe0 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
1ebf0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
1ec00 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20  reString() both 
1ec10 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74  assume.  ** that
1ec20 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
1ec30 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20  der varint that 
1ec40 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74  occurs at the st
1ec50 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f  art of each reco
1ec60 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20  rd.  ** fits in 
1ec70 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69  a single byte (i
1ec80 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65  .e. is 127 or le
1ec90 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72  ss). varintRecor
1eca0 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20  dCompareInt().  
1ecb0 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  ** also assumes 
1ecc0 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
1ecd0 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75  to overread a bu
1ece0 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74  ffer by at least
1ecf0 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d   the .  ** maxim
1ed00 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61  um possible lega
1ed10 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c  l header size pl
1ed20 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61  us 8 bytes. Beca
1ed30 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a  use there is.  *
1ed40 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
1ed50 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28  be at least 74 (
1ed60 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74  but not 136) byt
1ed70 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f  es of padding fo
1ed80 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a  llowing each.  *
1ed90 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  * buffer passed 
1eda0 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  to varintRecordC
1edb0 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73  ompareInt() this
1edc0 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e   makes it conven
1edd0 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d  ient to.  ** lim
1ede0 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  it the size of t
1edf0 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20  he header to 64 
1ee00 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77  bytes in cases w
1ee10 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66  here the first f
1ee20 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20  ield.  ** is an 
1ee30 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20  integer..  **.  
1ee40 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77  ** The easiest w
1ee50 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ay to enforce th
1ee60 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63  is limit is to c
1ee70 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63  onsider only rec
1ee80 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31  ords with.  ** 1
1ee90 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73  3 fields or less
1eea0 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66  . If the first f
1eeb0 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67  ield is an integ
1eec0 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  er, the maximum 
1eed0 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  legal.  ** heade
1eee0 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20  r size is (12*5 
1eef0 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20  + 1 + 1) bytes. 
1ef00 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b   */.  if( (p->pK
1ef10 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1ef20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58   p->pKeyInfo->nX
1ef30 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20  Field)<=13 ){.  
1ef40 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d    int flags = p-
1ef50 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a  >aMem[0].flags;.
1ef60 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49      if( p->pKeyI
1ef70 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1ef80 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  0] ){.      p->r
1ef90 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  1 = 1;.      p->
1efa0 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  r2 = -1;.    }el
1efb0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20  se{.      p->r1 
1efc0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72  = -1;.      p->r
1efd0 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 1;.    }.   
1efe0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
1eff0 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  M_Int) ){.      
1f000 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
1f010 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20  dCompareInt;.   
1f020 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
1f030 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61   flags & MEM_Rea
1f040 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
1f050 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  e( flags & MEM_N
1f060 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ull );.    testc
1f070 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
1f080 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28  _Blob );.    if(
1f090 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52   (flags & (MEM_R
1f0a0 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  eal|MEM_Null|MEM
1f0b0 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d  _Blob))==0 && p-
1f0c0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  >pKeyInfo->aColl
1f0d0 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
1f0e0 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20  assert( flags & 
1f0f0 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20  MEM_Str );.     
1f100 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
1f110 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b  rdCompareString;
1f120 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1f130 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1f140 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d  RecordCompare;.}
1f150 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
1f160 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
1f170 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
1f180 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
1f190 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
1f1a0 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
1f1b0 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
1f1c0 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
1f1d0 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
1f1e0 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
1f1f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
1f200 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
1f210 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1f220 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
1f230 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20  * pCur might be 
1f240 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74  pointing to text
1f250 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
1f260 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
1f270 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68  e file..** So th
1f280 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74  e content cannot
1f290 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f   be trusted.  Do
1f2a0 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65   appropriate che
1f2b0 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  cks on the conte
1f2c0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1f2d0 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73  e3VdbeIdxRowid(s
1f2e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75  qlite3 *db, BtCu
1f2f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
1f300 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
1f310 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
1f320 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
1f330 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
1f340 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
1f350 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
1f360 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
1f370 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
1f380 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
1f390 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
1f3a0 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
1f3b0 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
1f3c0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
1f3d0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
1f3e0 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
1f3f0 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
1f400 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
1f410 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
1f420 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
1f430 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
1f440 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
1f450 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
1f460 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
1f470 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
1f480 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
1f490 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
1f4a0 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
1f4b0 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
1f4c0 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
1f4d0 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
1f4e0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
1f4f0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
1f500 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) );.  VVA_ONLY(
1f510 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72  rc =) sqlite3Btr
1f520 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
1f530 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
1f540 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1f550 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43  _OK );     /* pC
1f560 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ur is always val
1f570 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61  id so KeySize ca
1f580 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61  nnot fail */.  a
1f590 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79  ssert( (nCellKey
1f5a0 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
1f5b0 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65  2)==(u64)nCellKe
1f5c0 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  y );..  /* Read 
1f5d0 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  in the complete 
1f5e0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69  content of the i
1f5f0 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ndex entry */.  
1f600 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1f610 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20  it(&m, db, 0);. 
1f620 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
1f630 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
1f640 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c  ur, 0, (u32)nCel
1f650 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
1f660 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1f670 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1f680 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74  /* The index ent
1f690 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69  ry must begin wi
1f6a0 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65  th a header size
1f6b0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
1f6c0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a  arint32((u8*)m.z
1f6d0 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74  , szHdr);.  test
1f6e0 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29  case( szHdr==3 )
1f6f0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
1f700 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66  Hdr==m.n );.  if
1f710 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72  ( unlikely(szHdr
1f720 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72  <3 || (int)szHdr
1f730 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74  >m.n) ){.    got
1f740 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
1f750 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
1f760 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64  * The last field
1f770 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68   of the index sh
1f780 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
1f790 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a  er - the ROWID..
1f7a0 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74    ** Verify that
1f7b0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
1f7c0 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74  really is an int
1f7d0 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  eger. */.  (void
1f7e0 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
1f7f0 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c  *)&m.z[szHdr-1],
1f800 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74   typeRowid);.  t
1f810 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1f820 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63  id==1 );.  testc
1f830 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1f840 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  2 );.  testcase(
1f850 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b   typeRowid==3 );
1f860 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1f870 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74  eRowid==4 );.  t
1f880 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1f890 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63  id==5 );.  testc
1f8a0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1f8b0 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
1f8c0 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b   typeRowid==8 );
1f8d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1f8e0 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69  eRowid==9 );.  i
1f8f0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65  f( unlikely(type
1f900 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52  Rowid<1 || typeR
1f910 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f  owid>9 || typeRo
1f920 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67  wid==7) ){.    g
1f930 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
1f940 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  rruption;.  }.  
1f950 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
1f960 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1f970 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a  Len(typeRowid);.
1f980 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32    testcase( (u32
1f990 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52  )m.n==szHdr+lenR
1f9a0 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e  owid );.  if( un
1f9b0 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c  likely((u32)m.n<
1f9c0 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20  szHdr+lenRowid) 
1f9d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
1f9e0 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
1f9f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63  ;.  }..  /* Fetc
1fa00 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66  h the integer of
1fa10 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
1fa20 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
1fa30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
1fa40 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e  rialGet((u8*)&m.
1fa50 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c  z[m.n-lenRowid],
1fa60 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b   typeRowid, &v);
1fa70 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e  .  *rowid = v.u.
1fa80 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  i;.  sqlite3Vdbe
1fa90 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
1faa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fab0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
1fac0 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ere if database 
1fad0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
1fae0 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68  tected after m h
1faf0 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c  as been.  ** all
1fb00 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68  ocated.  Free th
1fb10 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  e m object and r
1fb20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1fb30 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77  RUPT. */.idx_row
1fb40 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20  id_corruption:. 
1fb50 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d   testcase( m.szM
1fb60 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
1fb70 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1fb80 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
1fb90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1fba0 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
1fbb0 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
1fbc0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
1fbd0 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
1fbe0 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  C is pointing to
1fbf0 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
1fc00 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55  key string in pU
1fc10 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20  npacked.  Write 
1fc20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
1fc30 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
1fc40 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1fc50 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
1fc60 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1fc70 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
1fc80 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70  reater than pUnp
1fc90 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53  acked.  Return S
1fca0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1fcb0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  ess..**.** pUnpa
1fcc0 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63  cked is either c
1fcd0 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
1fce0 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
1fcf0 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
1fd00 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
1fd10 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
1fd20 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
1fd30 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
1fd40 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
1fd50 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
1fd60 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
1fd70 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
1fd80 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
1fd90 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
1fda0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
1fdb0 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
1fdc0 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
1fdd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1fde0 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
1fdf0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
1fe20 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56  onnection */.  V
1fe30 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20  dbeCursor *pC,  
1fe40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe50 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
1fe60 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
1fe70 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1fe80 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c  cord *pUnpacked,
1fe90 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
1fea0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65  ed version of ke
1feb0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20  y */.  int *res 
1fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fed0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1fee0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1fef0 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29  result here */.)
1ff00 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
1ff10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
1ff20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1ff30 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
1ff40 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65    Mem m;..  asse
1ff50 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1ff60 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
1ff70 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c  ur) );.  VVA_ONL
1ff80 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42  Y(rc =) sqlite3B
1ff90 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
1ffa0 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
1ffb0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1ffc0 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70  TE_OK );    /* p
1ffd0 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
1ffe0 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
1fff0 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
20000 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c  /* nCellKey will
20010 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65   always be betwe
20020 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66  en 0 and 0xfffff
20030 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74  fff because of t
20040 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74  he way.  ** that
20050 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
20060 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  tr() and sqlite3
20070 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72  GetVarint32() ar
20080 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f  e implemented */
20090 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
200a0 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30  =0 || nCellKey>0
200b0 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  x7fffffff ){.   
200c0 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
200d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
200e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
200f0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
20100 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a  nit(&m, db, 0);.
20110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
20120 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
20130 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28  C->pCursor, 0, (
20140 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  u32)nCellKey, 1,
20150 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
20160 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
20170 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71  .  }.  *res = sq
20180 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20190 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c  ompare(m.n, m.z,
201a0 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73   pUnpacked);.  s
201b0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
201c0 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
201d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
201e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
201f0 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
20200 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
20210 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
20220 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
20230 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
20240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
20250 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
20260 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
20270 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
20280 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
20290 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ge){.  assert( s
202a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
202b0 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
202c0 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
202d0 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
202e0 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
202f0 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
20300 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
20310 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
20320 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
20330 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
20340 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
20350 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
20360 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
20370 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
20380 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
20390 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
203a0 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
203b0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
203c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
203d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
203e0 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
203f0 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
20400 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
20410 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
20420 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
20430 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
20440 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
20450 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
20460 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
20470 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
20480 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
20490 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
204a0 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
204b0 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
204c0 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
204d0 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
204e0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
204f0 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
20500 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
20510 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
20520 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
20530 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
20540 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
20550 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
20560 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
20570 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
20580 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
20590 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
205a0 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
205b0 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
205c0 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
205d0 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
205e0 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
205f0 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
20600 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
20610 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
20620 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  b;.}../*.** Retu
20630 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
20640 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
20650 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
20660 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
20670 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
20680 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e  er iVar of VM v.
20690 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
206a0 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20  value is an SQL 
206b0 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  NULL, return .**
206c0 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65   0 instead. Unle
206d0 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61  ss it is NULL, a
206e0 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66  pply affinity af
206f0 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51  f (one of the SQ
20700 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f  LITE_AFF_*.** co
20710 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20  nstants) to the 
20720 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
20730 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  urning it..**.**
20740 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
20750 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65  lue must be free
20760 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
20770 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c  using sqlite3Val
20780 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c  ueFree()..*/.sql
20790 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69  ite3_value *sqli
207a0 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
207b0 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  alue(Vdbe *v, in
207c0 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b  t iVar, u8 aff){
207d0 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
207e0 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  0 );.  if( v ){.
207f0 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
20800 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d  &v->aVar[iVar-1]
20810 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d  ;.    if( 0==(pM
20820 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
20830 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73  Null) ){.      s
20840 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
20850 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  et = sqlite3Valu
20860 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20  eNew(v->db);.   
20870 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
20880 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20890 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a  beMemCopy((Mem *
208a0 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20  )pRet, pMem);.  
208b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
208c0 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  ueApplyAffinity(
208d0 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54  pRet, aff, SQLIT
208e0 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
208f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52  .      return pR
20900 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  et;.    }.  }.  
20910 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
20920 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c  ** Configure SQL
20930 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73   variable iVar s
20940 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61  o that binding a
20950 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74   new value to it
20960 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73   signals.** to s
20970 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a  qlite3_reoptimiz
20980 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70  e() that re-prep
20990 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  aring the statem
209a0 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ent may result.*
209b0 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75  * in a better qu
209c0 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69  ery plan..*/.voi
209d0 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
209e0 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c  Varmask(Vdbe *v,
209f0 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73   int iVar){.  as
20a00 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
20a10 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b    if( iVar>32 ){
20a20 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
20a30 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20  = 0xffffffff;.  
20a40 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78  }else{.    v->ex
20a50 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31  pmask |= ((u32)1
20a60 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20   << (iVar-1));. 
20a70 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
20a80 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
20a90 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61  LTABLE./*.** Tra
20aa0 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73  nsfer error mess
20ab0 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e  age text from an
20ac0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45   sqlite3_vtab.zE
20ad0 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
20ae0 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
20af0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
20b00 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e  lite3_malloc) in
20b10 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73  to a Vdbe.zErrMs
20b20 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
20b30 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
20b40 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
20b50 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76  3DbMalloc)..*/.v
20b60 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49  oid sqlite3VtabI
20b70 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65  mportErrmsg(Vdbe
20b80 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61   *p, sqlite3_vta
20b90 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c  b *pVtab){.  sql
20ba0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
20bb0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
20bc0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
20bd0 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
20be0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
20bf0 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72  p(db, pVtab->zEr
20c00 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
20c10 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
20c20 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e  rMsg);.  pVtab->
20c30 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23  zErrMsg = 0;.}.#
20c40 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
20c50 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
20c60 45 20 2a 2f 0a                                   E */.