/ Hex Artifact Content
Login

Artifact b4a127630ef81d5ea85346262f38aaf482ece4d9:


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 46 75 6e 63 74 69 6f 6e 3a  ase OP_Function:
3920: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41  .      case OP_A
3930: 67 67 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20  ggStep: {.      
3940: 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d    if( pOp->p5>nM
3950: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
3960: 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20  s = pOp->p5;.   
3970: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3980: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
3990: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b  P_Transaction: {
39a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
39b0: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61  ->p2!=0 ) p->rea
39c0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
39d0: 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20     /* fall thru 
39e0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
39f0: 20 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d   case OP_AutoCom
3a00: 6d 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20  mit:.      case 
3a10: 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a  OP_Savepoint: {.
3a20: 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65          p->bIsRe
3a30: 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ader = 1;.      
3a40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3a50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3a60: 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63  OMIT_WAL.      c
3a70: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
3a80: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t:.#endif.      
3a90: 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a  case OP_Vacuum:.
3aa0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f        case OP_Jo
3ab0: 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20  urnalMode: {.   
3ac0: 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79       p->readOnly
3ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
3ae0: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a  >bIsReader = 1;.
3af0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3b00: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
3b10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
3b20: 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61  ALTABLE.      ca
3b30: 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b  se OP_VUpdate: {
3b40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
3b50: 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p2>nMaxArgs ) 
3b60: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
3b70: 70 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p2;.        brea
3b80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3b90: 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72   case OP_VFilter
3ba0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
3bb0: 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
3bc0: 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d  t( p->nOp - i >=
3bd0: 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73   3 );.        as
3be0: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
3bf0: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
3c00: 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   );.        n = 
3c10: 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-1].p1;.    
3c20: 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72      if( n>nMaxAr
3c30: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
3c40: 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  n;.        break
3c50: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
3c60: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e  .      case OP_N
3c70: 65 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ext:.      case 
3c80: 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20  OP_NextIfOpen:. 
3c90: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72       case OP_Sor
3ca0: 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20  terNext: {.     
3cb0: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
3cc0: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
3cd0: 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  eeNext;.        
3ce0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3cf0: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
3d00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3d10: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50  .      case OP_P
3d20: 72 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20  rev:.      case 
3d30: 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b  OP_PrevIfOpen: {
3d40: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
3d50: 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69  .xAdvance = sqli
3d60: 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
3d70: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
3d80: 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e  4type = P4_ADVAN
3d90: 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  CE;.        brea
3da0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3db0: 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61  ..    pOp->opfla
3dc0: 67 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  gs = sqlite3Opco
3dd0: 64 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64  deProperty[opcod
3de0: 65 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70  e];.    if( (pOp
3df0: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
3e00: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f  G_JUMP)!=0 && pO
3e10: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
3e20: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
3e30: 3e 70 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62  >p2<pParse->nLab
3e40: 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d  el );.      pOp-
3e50: 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d  >p2 = aLabel[-1-
3e60: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a  pOp->p2];.    }.
3e70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
3e80: 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73  ree(p->db, pPars
3e90: 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50  e->aLabel);.  pP
3ea0: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  arse->aLabel = 0
3eb0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62  ;.  pParse->nLab
3ec0: 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46  el = 0;.  *pMaxF
3ed0: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
3ee0: 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  gs;.  assert( p-
3ef0: 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c  >bIsReader!=0 ||
3f00: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
3f10: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a  ->btreeMask) );.
3f20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3f30: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
3f40: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
3f50: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
3f60: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3f70: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
3f80: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
3f90: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3fa0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3fb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
3fc0: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Op;.}../*.** Thi
3fd0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
3fe0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
3ff0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
4000: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  odes associated 
4010: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65  with.** the Vdbe
4020: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
4030: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
4040: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
4050: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
4060: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f  ** to arrange fo
4070: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  r the returned a
4080: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74  rray to be event
4090: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
40a0: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72  g the .** vdbeFr
40b0: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63  eeOpArray() func
40c0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  tion..**.** Befo
40d0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
40e0: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68  nOp is set to th
40f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
4100: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  ies in the retur
4110: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c  ned.** array. Al
4120: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73  so, *pnMaxArg is
4130: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67   set to the larg
4140: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e  er of its curren
4150: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20  t value and .** 
4160: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
4170: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62  tries in the Vdb
4180: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20  e.apArg[] array 
4190: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63  required to exec
41a0: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  ute the .** retu
41b0: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  rned program..*/
41c0: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
41d0: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
41e0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Vdbe *p, int *pn
41f0: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72  Op, int *pnMaxAr
4200: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f  g){.  VdbeOp *aO
4210: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73  p = p->aOp;.  as
4220: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d  sert( aOp && !p-
4230: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4240: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  d );..  /* Check
4250: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62   that sqlite3Vdb
4260: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73  eUsesBtree() was
4270: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74   not called on t
4280: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65  his VM */.  asse
4290: 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  rt( DbMaskAllZer
42a0: 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20  o(p->btreeMask) 
42b0: 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  );..  resolveP2V
42c0: 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72  alues(p, pnMaxAr
42d0: 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d  g);.  *pnOp = p-
42e0: 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d  >nOp;.  p->aOp =
42f0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70   0;.  return aOp
4300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
4310: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f   whole list of o
4320: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  perations to the
4330: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b   operation stack
4340: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
4350: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
4360: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
4370: 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  added..*/.int sq
4380: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
4390: 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  st(Vdbe *p, int 
43a0: 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20  nOp, VdbeOpList 
43b0: 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74 20  const *aOp, int 
43c0: 69 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74 20  iLineno){.  int 
43d0: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
43e0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
43f0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
4400: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
4410: 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  > p->pParse->nOp
4420: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
4430: 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a  rray(p, nOp) ){.
4440: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4450: 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f  }.  addr = p->nO
4460: 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  p;.  if( ALWAYS(
4470: 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e  nOp>0) ){.    in
4480: 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c  t i;.    VdbeOpL
4490: 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d  ist const *pIn =
44a0: 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d   aOp;.    for(i=
44b0: 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70  0; i<nOp; i++, p
44c0: 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  In++){.      int
44d0: 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20   p2 = pIn->p2;. 
44e0: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75       VdbeOp *pOu
44f0: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  t = &p->aOp[i+ad
4500: 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  dr];.      pOut-
4510: 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f  >opcode = pIn->o
4520: 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75  pcode;.      pOu
4530: 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b  t->p1 = pIn->p1;
4540: 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20  .      if( p2<0 
4550: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
4560: 74 28 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  t( sqlite3Opcode
4570: 50 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f  Property[pOut->o
4580: 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a  pcode] & OPFLG_J
4590: 55 4d 50 20 29 3b 0a 20 20 20 20 20 20 20 20 70  UMP );.        p
45a0: 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b  Out->p2 = addr +
45b0: 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20   ADDR(p2);.     
45c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
45d0: 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20  pOut->p2 = p2;. 
45e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75       }.      pOu
45f0: 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b  t->p3 = pIn->p3;
4600: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  .      pOut->p4t
4610: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
4620: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
4630: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  .p = 0;.      pO
4640: 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64  ut->p5 = 0;.#ifd
4650: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4660: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
4670: 53 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43  S.      pOut->zC
4680: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
4690: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
46a0: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
46b0: 20 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c       pOut->iSrcL
46c0: 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b  ine = iLineno+i;
46d0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 28 76 6f  .#else.      (vo
46e0: 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64  id)iLineno;.#end
46f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4700: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28  _DEBUG.      if(
4710: 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20   p->db->flags & 
4720: 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
4730: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
4740: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
4750: 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26  tOp(0, i+addr, &
4760: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b  p->aOp[i+addr]);
4770: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
4780: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70      }.    p->nOp
4790: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72   += nOp;.  }.  r
47a0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23  eturn addr;.}..#
47b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
47c0: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
47d0: 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20  ANSTATUS)./*.** 
47e0: 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  Add an entry to 
47f0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75  the array of cou
4800: 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79  nters managed by
4810: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
4820: 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76  anstatus()..*/.v
4830: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
4840: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62  canStatus(.  Vdb
4850: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4870: 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74  VM to add scanst
4880: 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69  atus() to */.  i
4890: 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  nt addrExplain, 
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
48b0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
48c0: 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a  Explain (or 0) *
48d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70  /.  int addrLoop
48e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
48f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4900: 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  f loop counter *
4910: 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73  / .  int addrVis
4920: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
4930: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4940: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
4950: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67  counter */.  Log
4960: 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20  Est nEst,       
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4980: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
4990: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
49a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
49b0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *zName          
49c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
49d0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62  table or index b
49e0: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  eing scanned */.
49f0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
4a00: 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20   (p->nScan+1) * 
4a10: 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75  sizeof(ScanStatu
4a20: 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73  s);.  ScanStatus
4a30: 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d   *aNew;.  aNew =
4a40: 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71   (ScanStatus*)sq
4a50: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
4a60: 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20  ->db, p->aScan, 
4a70: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e  nByte);.  if( aN
4a80: 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74  ew ){.    ScanSt
4a90: 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e  atus *pNew = &aN
4aa0: 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a  ew[p->nScan++];.
4ab0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78      pNew->addrEx
4ac0: 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c  plain = addrExpl
4ad0: 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ain;.    pNew->a
4ae0: 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f  ddrLoop = addrLo
4af0: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  op;.    pNew->ad
4b00: 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69  drVisit = addrVi
4b10: 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  sit;.    pNew->n
4b20: 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20  Est = nEst;.    
4b30: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
4b40: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d  lite3DbStrDup(p-
4b50: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
4b60: 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77   p->aScan = aNew
4b70: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
4b80: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4b90: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
4ba0: 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  1 operand for a 
4bb0: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
4bc0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
4bd0: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
4be0: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
4bf0: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
4c00: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
4c10: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
4c20: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
4c30: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
4c40: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
4c50: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
4c60: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  he program..*/.v
4c70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4c80: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c  hangeP1(Vdbe *p,
4c90: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
4ca0: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
4cb0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75  !=0 );.  if( ((u
4cc0: 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20  32)p->nOp)>addr 
4cd0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
4ce0: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
4cf0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
4d00: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
4d10: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
4d20: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
4d30: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
4d40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4d50: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
4d60: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
4d70: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
4d80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4d90: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
4da0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
4db0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4dc0: 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f   if( ((u32)p->nO
4dd0: 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70  p)>addr ){.    p
4de0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
4df0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
4e00: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
4e10: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70  lue of the P3 op
4e20: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
4e30: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
4e40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4e50: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
4e60: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
4e70: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
4e80: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
4e90: 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29  f( ((u32)p->nOp)
4ea0: 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >addr ){.    p->
4eb0: 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76  aOp[addr].p3 = v
4ec0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
4ed0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
4ee0: 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72  e of the P5 oper
4ef0: 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  and for the most
4f00: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64   recently.** add
4f10: 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ed operation..*/
4f20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4f30: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
4f40: 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73  p, u8 val){.  as
4f50: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
4f60: 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20  if( p->aOp ){.  
4f70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
4f80: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  >0 );.    p->aOp
4f90: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20  [p->nOp-1].p5 = 
4fa0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
4fb0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20  * Change the P2 
4fc0: 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72  operand of instr
4fd0: 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74  uction addr so t
4fe0: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
4ff0: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
5000: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
5010: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f  ruction to be co
5020: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ded..*/.void sql
5030: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
5040: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
5050: 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr){.  sqlite3Vd
5060: 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64  beChangeP2(p, ad
5070: 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 70  dr, p->nOp);.  p
5080: 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64  ->pParse->iFixed
5090: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  Op = p->nOp - 1;
50a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
50b0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
50c0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
50d0: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
50e0: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
50f0: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
5100: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
5110: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
5120: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
5130: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
5140: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
5150: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
5160: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
5170: 26 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  && (pDef->funcFl
5180: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
5190: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
51a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
51b0: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a  (db, pDef);.  }.
51c0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  }..static void v
51d0: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
51e0: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20  qlite3 *, Op *, 
51f0: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  int);../*.** Del
5200: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
5210: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
5220: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
5230: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
5240: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
5250: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
5260: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
5270: 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  b );.    switch(
5280: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
5290: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
52a0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
52b0: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
52c0: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
52d0: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
52e0: 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y: {.        sql
52f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5300: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5310: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5320: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
5330: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
5340: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
5350: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79  ==0 ) sqlite3Key
5360: 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e  InfoUnref((KeyIn
5370: 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  fo*)p4);.       
5380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5390: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50        case P4_MP
53a0: 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20  RINTF: {.       
53b0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
53c0: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
53d0: 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20  e3_free(p4);.   
53e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
53f0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
5400: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
5410: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
5420: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
5430: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
5440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5450: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5460: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
5470: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5480: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
5490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
54a0: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
54b0: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
54c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
54d0: 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28        Mem *p = (
54e0: 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  Mem*)p4;.       
54f0: 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c     if( p->szMall
5500: 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  oc ) sqlite3DbFr
5510: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
5520: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  c);.          sq
5530: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5540: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
5550: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5560: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5570: 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20  P4_VTAB : {.    
5580: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
5590: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
55a0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28  lite3VtabUnlock(
55b0: 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20  (VTable *)p4);. 
55c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
55d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
55e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
55f0: 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
5600: 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e  d for aOp and an
5610: 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f  y p4 values allo
5620: 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  cated for the.**
5630: 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e   opcodes contain
5640: 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f  ed within. If aO
5650: 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74  p is not NULL it
5660: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
5670: 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65  ontain .** nOp e
5680: 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74  ntries. .*/.stat
5690: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
56a0: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
56b0: 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e  *db, Op *aOp, in
56c0: 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f  t nOp){.  if( aO
56d0: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
56e0: 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f  ;.    for(pOp=aO
56f0: 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d  p; pOp<&aOp[nOp]
5700: 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ; pOp++){.      
5710: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
5720: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
5730: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
5740: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
5750: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20  _COMMENTS.      
5760: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5770: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
5780: 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20  ;.#endif     .  
5790: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
57a0: 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29  3DbFree(db, aOp)
57b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20  ;.}../*.** Link 
57c0: 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f  the SubProgram o
57d0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
57e0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
57f0: 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ent into the lin
5800: 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56  ked.** list at V
5810: 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e  dbe.pSubProgram.
5820: 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73   This list is us
5830: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c  ed to delete all
5840: 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20   sub-program.** 
5850: 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65  objects when the
5860: 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   VM is no longer
5870: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f   required..*/.vo
5880: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  id sqlite3VdbeLi
5890: 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62  nkSubProgram(Vdb
58a0: 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f  e *pVdbe, SubPro
58b0: 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70  gram *p){.  p->p
58c0: 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50  Next = pVdbe->pP
58d0: 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d  rogram;.  pVdbe-
58e0: 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d  >pProgram = p;.}
58f0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
5900: 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64  he opcode at add
5910: 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a  r into OP_Noop.*
5920: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5930: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56  beChangeToNoop(V
5940: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5950: 29 7b 0a 20 20 69 66 28 20 61 64 64 72 3c 70 2d  ){.  if( addr<p-
5960: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >nOp ){.    Vdbe
5970: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
5980: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c  p[addr];.    sql
5990: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
59a0: 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c  ;.    freeP4(db,
59b0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
59c0: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65  p->p4.p);.    me
59d0: 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a  mset(pOp, 0, siz
59e0: 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20  eof(pOp[0]));.  
59f0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
5a00: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66 28  OP_Noop;.    if(
5a10: 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 20   addr==p->nOp-1 
5a20: 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d 0a  ) p->nOp--;.  }.
5a30: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
5a40: 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22  last opcode is "
5a50: 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f  op" and it is no
5a60: 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  t a jump destina
5a70: 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  tion,.** then re
5a80: 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e  move it.  Return
5a90: 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c   true if and onl
5aa0: 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77  y if an opcode w
5ab0: 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  as removed..*/.i
5ac0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nt sqlite3VdbeDe
5ad0: 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28  letePriorOpcode(
5ae0: 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b  Vdbe *p, u8 op){
5af0: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31  .  if( (p->nOp-1
5b00: 29 3e 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46  )>(p->pParse->iF
5b10: 69 78 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f  ixedOp) && p->aO
5b20: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f  p[p->nOp-1].opco
5b30: 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71  de==op ){.    sq
5b40: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
5b50: 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d  oNoop(p, p->nOp-
5b60: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  1);.    return 1
5b70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
5b80: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
5b90: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
5ba0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
5bb0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
5bc0: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
5bd0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
5be0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
5bf0: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
5c00: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
5c10: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
5c20: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
5c30: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
5c40: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
5c50: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
5c60: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
5c70: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
5c80: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
5c90: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
5ca0: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
5cb0: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
5cc0: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
5cd0: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
5ce0: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
5cf0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
5d00: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
5d10: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
5d20: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
5d30: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
5d40: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
5d50: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
5d60: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
5d70: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20  ytes of zP4..** 
5d80: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
5d90: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
5da0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
5db0: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
5dc0: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
5dd0: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
5de0: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
5df0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
5e00: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
5e10: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
5e20: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
5e30: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
5e40: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
5e50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
5e60: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
5e70: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
5e80: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
5e90: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
5ea0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5eb0: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
5ec0: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
5ed0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
5ee0: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
5ef0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
5f00: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
5f10: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
5f20: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
5f30: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
5f40: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
5f50: 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
5f60: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
5f70: 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29  if( n!=P4_VTAB )
5f80: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
5f90: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  b, n, (void*)*(c
5fa0: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
5fb0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
5fc0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
5fd0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
5fe0: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
5ff0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
6000: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
6010: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
6020: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
6030: 72 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  r];.  assert( pO
6040: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f  p->p4type==P4_NO
6050: 54 55 53 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  TUSED.       || 
6060: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
6070: 49 4e 54 33 32 0a 20 20 20 20 20 20 20 7c 7c 20  INT32.       || 
6080: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
6090: 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65  KEYINFO );.  fre
60a0: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
60b0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
60c0: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
60d0: 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  ;.  if( n==P4_IN
60e0: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
60f0: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
6100: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
6110: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
6120: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
6130: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
6140: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
6150: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
6160: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
6170: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
6180: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
6190: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
61a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
61b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
61c0: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
61d0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
61e0: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
61f0: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
6200: 4f 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  O ){.    pOp->p4
6210: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
6220: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
6230: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
6240: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
6250: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70  _VTAB ){.    pOp
6260: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
6270: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
6280: 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a  type = P4_VTAB;.
6290: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c      sqlite3VtabL
62a0: 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50  ock((VTable *)zP
62b0: 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  4);.    assert( 
62c0: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d  ((VTable *)zP4)-
62d0: 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  >db==p->db );.  
62e0: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
62f0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
6300: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
6310: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28   pOp->p4type = (
6320: 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20  signed char)n;. 
6330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
6340: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74  n==0 ) n = sqlit
6350: 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b  e3Strlen30(zP4);
6360: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
6370: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
6380: 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29  p(p->db, zP4, n)
6390: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
63a0: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
63b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
63c0: 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d   the P4 on the m
63d0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
63e0: 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65  ed opcode to the
63f0: 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65   KeyInfo for the
6400: 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e  .** index given.
6410: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6420: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
6430: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6440: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
6450: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
6460: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
6470: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
6480: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
6490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
64a0: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
64b0: 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
64c0: 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
64d0: 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20  , pIdx),.       
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
64f0: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23  4_KEYINFO);.}..#
6500: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6510: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
6520: 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ENTS./*.** Chang
6530: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
6540: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
6550: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
6560: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73  tion.  Or.** ins
6570: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20  ert a No-op and 
6580: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  add the comment 
6590: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74  to that new inst
65a0: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a  ruction.  This.*
65b0: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65  * makes the code
65c0: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20   easier to read 
65d0: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
65e0: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20  .  None of this 
65f0: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20  happens.** in a 
6600: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
6610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6620: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64   vdbeVComment(Vd
6630: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
6640: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c  r *zFormat, va_l
6650: 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72  ist ap){.  asser
6660: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
6670: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
6680: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
6690: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
66a0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
66b0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
66c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
66d0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->nOp ){.    as
66e0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a  sert( p->aOp );.
66f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6700: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b  e(p->db, p->aOp[
6710: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
6720: 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  nt);.    p->aOp[
6730: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
6740: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  nt = sqlite3VMPr
6750: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
6760: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a  mat, ap);.  }.}.
6770: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6780: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
6790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
67a0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
67b0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
67c0: 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72  p ){.    va_star
67d0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
67e0: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
67f0: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
6800: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
6810: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
6820: 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ite3VdbeNoopComm
6830: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
6840: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
6850: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
6860: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
6870: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6880: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f  AddOp0(p, OP_Noo
6890: 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  p);.    va_start
68a0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
68b0: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
68c0: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
68d0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
68e0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f  .  }.}.#endif  /
68f0: 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  * NDEBUG */..#if
6900: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
6910: 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53  COVERAGE./*.** S
6920: 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20  et the value if 
6930: 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65  the iSrcLine fie
6940: 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ld for the previ
6950: 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ously coded inst
6960: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
6970: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c   sqlite3VdbeSetL
6980: 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a  ineNumber(Vdbe *
6990: 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20  v, int iLine){. 
69a0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
69b0: 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e  p(v,-1)->iSrcLin
69c0: 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e  e = iLine;.}.#en
69d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44  dif /* SQLITE_VD
69e0: 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a  BE_COVERAGE */..
69f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6a00: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
6a10: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
6a20: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
6a30: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
6a40: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
6a50: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
6a60: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
6a70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6a80: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
6a90: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
6aa0: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
6ab0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
6ac0: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
6ad0: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
6ae0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
6af0: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
6b00: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
6b10: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
6b20: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
6b30: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
6b40: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
6b50: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
6b60: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
6b70: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
6b80: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
6b90: 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66  * after an OOM f
6ba0: 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76  ault without hav
6bb0: 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  ing to check to 
6bc0: 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72  see if the retur
6bd0: 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20  n from .** this 
6be0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c  routine is a val
6bf0: 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74  id pointer.  But
6c00: 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d   because the dum
6c10: 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a  my.opcode is 0,.
6c20: 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65  ** dummy will ne
6c30: 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74  ver be written t
6c40: 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69  o.  This is veri
6c50: 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73  fied by code ins
6c60: 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62  pection and.** b
6c70: 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56  y running with V
6c80: 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65  algrind..*/.Vdbe
6c90: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
6ca0: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
6cb0: 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38  t addr){.  /* C8
6cc0: 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  9 specifies that
6cd0: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64   the constant "d
6ce0: 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e  ummy" will be in
6cf0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
6d00: 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69  .  ** zeros, whi
6d10: 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20  ch is correct.  
6d20: 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61  MSVC generates a
6d30: 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74   warning, nevert
6d40: 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61  heless. */.  sta
6d50: 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79  tic VdbeOp dummy
6d60: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65  ;  /* Ignore the
6d70: 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62   MSVC warning ab
6d80: 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a  out no initializ
6d90: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
6da0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6db0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
6dc0: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
6dd0: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
6de0: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
6df0: 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64  ( (addr>=0 && ad
6e00: 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d  dr<p->nOp) || p-
6e10: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6e20: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  d );.  if( p->db
6e30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6e40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64  {.    return (Vd
6e50: 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20  beOp*)&dummy;.  
6e60: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6e70: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
6e80: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
6e90: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
6ea0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
6eb0: 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  TS)./*.** Return
6ec0: 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
6ed0: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
6ee0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
6ef0: 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a  he opcode pOp.**
6f00: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63   determined by c
6f10: 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73  haracter c..*/.s
6f20: 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c  tatic int transl
6f30: 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e  ateP(char c, con
6f40: 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69  st Op *pOp){.  i
6f50: 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75  f( c=='1' ) retu
6f60: 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66  rn pOp->p1;.  if
6f70: 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72  ( c=='2' ) retur
6f80: 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28  n pOp->p2;.  if(
6f90: 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e   c=='3' ) return
6fa0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20   pOp->p3;.  if( 
6fb0: 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20  c=='4' ) return 
6fc0: 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74  pOp->p4.i;.  ret
6fd0: 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a  urn pOp->p5;.}..
6fe0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
6ff0: 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22  string for the "
7000: 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f  comment" field o
7010: 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20  f a VDBE opcode 
7020: 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  listing..**.** T
7030: 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65  he Synopsis: fie
7040: 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69  ld in comments i
7050: 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75  n the vdbe.c sou
7060: 72 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f  rce file gets co
7070: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e  nverted.** to an
7080: 20 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68   extra string th
7090: 61 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  at is appended t
70a0: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63  o the sqlite3Opc
70b0: 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74  odeName().  In t
70c0: 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66  he.** absence of
70d0: 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c   other comments,
70e0: 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62   this synopsis b
70f0: 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65  ecomes the comme
7100: 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65  nt on the opcode
7110: 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c  ..** Some transl
7120: 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a  ation occurs:.**
7130: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20  .**       "PX"  
7140: 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a      ->  "r[X]".*
7150: 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20  *       "PX@PY" 
7160: 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d    ->  "r[X..X+Y-
7170: 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69  1]"  or "r[x]" i
7180: 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a  f y is 0 or 1.**
7190: 20 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22         "PX@PY+1"
71a0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22   ->  "r[X..X+Y]"
71b0: 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66      or "r[x]" if
71c0: 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20   y is 0.**      
71d0: 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22   "PY..PY"  ->  "
71e0: 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72  r[X..Y]"      or
71f0: 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a   "r[x]" if y<=x.
7200: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
7210: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20  splayComment(.  
7220: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20  const Op *pOp,  
7230: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
7240: 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64   to be commented
7250: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7260: 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76   *zP4,   /* Prev
7270: 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20  iously obtained 
7280: 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a  value for P4 */.
7290: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20    char *zTemp,  
72a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
72b0: 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69  sult here */.  i
72c0: 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20  nt nTemp        
72d0: 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c    /* Space avail
72e0: 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20  able in zTemp[] 
72f0: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
7300: 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63  ar *zOpName;.  c
7310: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f  onst char *zSyno
7320: 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e  psis;.  int nOpN
7330: 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  ame;.  int ii, j
7340: 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73  j;.  zOpName = s
7350: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
7360: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20  (pOp->opcode);. 
7370: 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74   nOpName = sqlit
7380: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61  e3Strlen30(zOpNa
7390: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61  me);.  if( zOpNa
73a0: 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b  me[nOpName+1] ){
73b0: 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d  .    int seenCom
73c0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63   = 0;.    char c
73d0: 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20  ;.    zSynopsis 
73e0: 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70  = zOpName += nOp
73f0: 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f  Name + 1;.    fo
7400: 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54  r(ii=jj=0; jj<nT
7410: 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53  emp-1 && (c = zS
7420: 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b  ynopsis[ii])!=0;
7430: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
7440: 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20  ( c=='P' ){.    
7450: 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69      c = zSynopsi
7460: 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20  s[++ii];.       
7470: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20   if( c=='4' ){. 
7480: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7490: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
74a0: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
74b0: 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20  s", zP4);.      
74c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
74d0: 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  X' ){.          
74e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
74f0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7500: 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  +jj, "%s", pOp->
7510: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
7520: 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31       seenCom = 1
7530: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7540: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
7550: 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63  1 = translateP(c
7560: 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
7570: 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20    int v2;.      
7580: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7590: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
75a0: 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76  Temp+jj, "%d", v
75b0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
75c0: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
75d0: 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20  sis+ii+1, "@P", 
75e0: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
75f0: 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20       ii += 3;.  
7600: 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20            jj += 
7610: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7620: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
7630: 20 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e         v2 = tran
7640: 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73  slateP(zSynopsis
7650: 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20  [ii], pOp);.    
7660: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e          if( strn
7670: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
7680: 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b  +1,"+1",2)==0 ){
7690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
76a0: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
76b0: 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20        v2++;.    
76c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
76d0: 20 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29        if( v2>1 )
76e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
76f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7700: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7710: 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b  +jj, "..%d", v1+
7720: 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20  v2-1);.         
7730: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
7740: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
7750: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
7760: 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26   "..P3", 4)==0 &
7770: 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a  & pOp->p3==0 ){.
7780: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
7790: 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 4;.          }
77a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
77b0: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
77c0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
77d0: 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  j);.      }else{
77e0: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a  .        zTemp[j
77f0: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
7800: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
7810: 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e  !seenCom && jj<n
7820: 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a  Temp-5 && pOp->z
7830: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  Comment ){.     
7840: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7850: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
7860: 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f  p+jj, "; %s", pO
7870: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
7880: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
7890: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
78a0: 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  jj);.    }.    i
78b0: 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54  f( jj<nTemp ) zT
78c0: 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d  emp[jj] = 0;.  }
78d0: 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43  else if( pOp->zC
78e0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71  omment ){.    sq
78f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7900: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
7910: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
7920: 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69  );.    jj = sqli
7930: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
7940: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
7950: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
7960: 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20     jj = 0;.  }. 
7970: 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65   return jj;.}.#e
7980: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
7990: 45 42 55 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64  EBUG */...#if !d
79a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
79b0: 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21  IT_EXPLAIN) || !
79c0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
79d0: 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  \.     || define
79e0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
79f0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
7a00: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43  E_DEBUG)./*.** C
7a10: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
7a20: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
7a30: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20  he P4 parameter 
7a40: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
7a50: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
7a60: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
7a70: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
7a80: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
7a90: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f  har *displayP4(O
7aa0: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
7ab0: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
7ac0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a  .  char *zP4 = z
7ad0: 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Temp;.  assert( 
7ae0: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
7af0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79  witch( pOp->p4ty
7b00: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
7b10: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
7b20: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
7b30: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
7b40: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
7b50: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  KeyInfo;.      a
7b60: 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
7b70: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
7b80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
7b90: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7ba0: 7a 54 65 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70  zTemp, "k(%d", p
7bb0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
7bc0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69  ;.      i = sqli
7bd0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
7be0: 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  p);.      for(j=
7bf0: 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  0; j<pKeyInfo->n
7c00: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
7c10: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
7c20: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
7c30: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
7c40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
7c50: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43  oll = pColl ? pC
7c60: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69  oll->zName : "ni
7c70: 6c 22 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  l";.        int 
7c80: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
7c90: 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  n30(zColl);.    
7ca0: 20 20 20 20 69 66 28 20 6e 3d 3d 36 20 26 26 20      if( n==6 && 
7cb0: 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49  memcmp(zColl,"BI
7cc0: 4e 41 52 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20  NARY",6)==0 ){. 
7cd0: 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d           zColl =
7ce0: 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "B";.          
7cf0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  n = 1;.        }
7d00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e  .        if( i+n
7d10: 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  >nTemp-6 ){.    
7d20: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
7d30: 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29  emp[i],",...",4)
7d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
7d50: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
7d60: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
7d70: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69  = ',';.        i
7d80: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
7d90: 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20  rtOrder[j] ){.  
7da0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
7db0: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
7dc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63    }.        memc
7dd0: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43  py(&zTemp[i], zC
7de0: 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20  oll, n+1);.     
7df0: 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20     i += n;.     
7e00: 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69   }.      zTemp[i
7e10: 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20  ++] = ')';.     
7e20: 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20   zTemp[i] = 0;. 
7e30: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
7e40: 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72  Temp );.      br
7e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7e60: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
7e70: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
7e80: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
7e90: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
7ea0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7eb0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25  Temp, zTemp, "(%
7ec0: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
7ed0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
7ee0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7ef0: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
7f00: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
7f10: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
7f20: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
7f30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7f40: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
7f50: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
7f60: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
7f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7f80: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
7f90: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T64: {.      sql
7fa0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7fb0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
7fc0: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  d", *pOp->p4.pI6
7fd0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
7fe0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7ff0: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  P4_INT32: {.    
8000: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8010: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8020: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
8030: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8040: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
8050: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
8060: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8070: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8080: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
8090: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
80a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
80b0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
80c0: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
80d0: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
80e0: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
80f0: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
8100: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
8110: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
8120: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
8130: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
8140: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8150: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8160: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
8170: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
8180: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
8190: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
81a0: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
81b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
81c0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
81d0: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72  .16g", pMem->u.r
81e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
81f0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
8200: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
8210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8220: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
8230: 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  mp, "NULL");.   
8240: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8250: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
8260: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
8270: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   );.        zP4 
8280: 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20  = "(blob)";.    
8290: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
82a0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
82b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
82c0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
82d0: 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20   P4_VTAB: {.    
82e0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
82f0: 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
8300: 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20  pVtab->pVtab;.  
8310: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8320: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8330: 70 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56  p, "vtab:%p", pV
8340: 74 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tab);.      brea
8350: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
8360: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
8370: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
8380: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8390: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e  Temp, zTemp, "in
83a0: 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20  tarray");.      
83b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
83c0: 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47   case P4_SUBPROG
83d0: 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAM: {.      sql
83e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
83f0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f  emp, zTemp, "pro
8400: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
8410: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8420: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
8430: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
8440: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
8450: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
8460: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
8470: 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  4 = pOp->p4.z;. 
8480: 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20       if( zP4==0 
8490: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
84a0: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   zTemp;.        
84b0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
84c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
84d0: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
84e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
84f0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
8500: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
8510: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
8520: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
8530: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
8540: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65  d..**.** The pre
8550: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
8560: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e   need to know in
8570: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d   advance the com
8580: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20  plete set of.** 
8590: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
85a0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
85b0: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20  use.  A mask of 
85c0: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a  these databases.
85d0: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ** is maintained
85e0: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
85f0: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61  .  The p->lockMa
8600: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  sk value is the 
8610: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e  subset of.** p->
8620: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74  btreeMask of dat
8630: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
8640: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e   require a lock.
8650: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8660: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
8670: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
8680: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
8690: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
86a0: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
86b0: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
86c0: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
86d0: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
86e0: 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b  k)*8 );.  DbMask
86f0: 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  Set(p->btreeMask
8700: 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31  , i);.  if( i!=1
8710: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
8720: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
8730: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
8740: 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e     DbMaskSet(p->
8750: 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  lockMask, i);.  
8760: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
8770: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
8780: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
8790: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
87a0: 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  >0./*.** If SQLi
87b0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
87c0: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
87d0: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
87e0: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
87f0: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
8800: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
8810: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
8820: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
8830: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
8840: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
8850: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
8860: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
8870: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
8880: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
8890: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
88a0: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
88b0: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
88c0: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
88d0: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
88e0: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
88f0: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
8900: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
8910: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
8920: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
8930: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
8940: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
8950: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
8960: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
8970: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
8980: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
8990: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
89a0: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
89b0: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
89c0: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
89d0: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
89e0: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
89f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
8a00: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
8a10: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
8a20: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
8a30: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
8a40: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
8a50: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
8a60: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
8a70: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
8a80: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
8a90: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
8aa0: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
8ab0: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
8ac0: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
8ad0: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
8ae0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
8af0: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
8b00: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
8b10: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
8b20: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
8b30: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
8b40: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
8b50: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
8b60: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
8b70: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
8b80: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
8b90: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
8ba0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
8bb0: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
8bc0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
8bd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
8be0: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
8bf0: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
8c00: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
8c10: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
8c20: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
8c30: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
8c40: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
8c50: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
8c60: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
8c70: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
8c80: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
8c90: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
8ca0: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
8cb0: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
8cc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8cd0: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
8ce0: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
8cf0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
8d00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8d10: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
8d20: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
8d30: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
8d40: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
8d50: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
8d60: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
8d70: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8d80: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
8d90: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8da0: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
8db0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
8dc0: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
8dd0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
8de0: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
8df0: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
8e00: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
8e10: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
8e20: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
8e30: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
8e40: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
8e50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
8e60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8e70: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
8e80: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
8e90: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
8ea0: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
8eb0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8ec0: 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74  Leave(aDb[i].pBt
8ed0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
8ee0: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
8ef0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
8f00: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
8f10: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
8f20: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
8f30: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
8f40: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
8f50: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
8f60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8f70: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
8f80: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
8f90: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
8fa0: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
8fb0: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a  tr[50];.  char z
8fc0: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74  Com[100];.  stat
8fd0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
8fe0: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
8ff0: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
9000: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e   %-13s %.2X %s\n
9010: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
9020: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
9030: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
9040: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
9050: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69  izeof(zPtr));.#i
9060: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
9070: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
9080: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d  NTS.  displayCom
9090: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a  ment(pOp, zP4, z
90a0: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d  Com, sizeof(zCom
90b0: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d  ));.#else.  zCom
90c0: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
90d0: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
90e0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
90f0: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
9100: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
9110: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
9120: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
9130: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
9140: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
9150: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
9160: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
9170: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
9180: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
9190: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
91a0: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
91b0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
91c0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
91d0: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
91e0: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
91f0: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
9200: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
9210: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
9220: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
9230: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
9240: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
9250: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9260: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
9270: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
9280: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
9290: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20      Mem *pEnd = 
92a0: 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74  &p[N];.    sqlit
92b0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
92c0: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
92d0: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
92e0: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
92f0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
9300: 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  d ){.      do{. 
9310: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a         if( p->sz
9320: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
9330: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
9340: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77  alloc);.      }w
9350: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
9360: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
9370: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
9380: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
9390: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
93a0: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
93b0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
93c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
93d0: 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70  kMemInvariants(p
93e0: 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ) );..      /* T
93f0: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
9400: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
9410: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
9420: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
9430: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
9440: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
9450: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
9460: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
9470: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
9480: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
9490: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
94a0: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
94b0: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
94c0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
94d0: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
94e0: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
94f0: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
9500: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
9510: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
9520: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
9530: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
9540: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
9550: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
9560: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
9570: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
9580: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
9590: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
95a0: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
95b0: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
95c0: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
95d0: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
95e0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
95f0: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
9600: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
9610: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
9620: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
9630: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
9640: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
9650: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
9660: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
9670: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
9680: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
9690: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
96a0: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
96b0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
96c0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
96d0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67  >flags & MEM_Agg
96e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
96f0: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
9700: 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20  EM_Dyn );.      
9710: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
9720: 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29  gs & MEM_Frame )
9730: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9740: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
9750: 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20  _RowSet );.     
9760: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
9770: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d  EM_Agg|MEM_Dyn|M
9780: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77  EM_Frame|MEM_Row
9790: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Set) ){.        
97a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
97b0: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
97c0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d  }else if( p->szM
97d0: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
97e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
97f0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
9800: 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c          p->szMal
9810: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  loc = 0;.      }
9820: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ..      p->flags
9830: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
9840: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b  ;.    }while( (+
9850: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
9860: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9870: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
9880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
9890: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
98a0: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
98b0: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
98c0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
98d0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
98e0: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
98f0: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
9900: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
9910: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
9920: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
9930: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
9940: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
9950: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
9960: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
9970: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
9980: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
9990: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
99a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
99b0: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
99c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
99d0: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
99e0: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
99f0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
9a00: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
9a10: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
9a20: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
9a30: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
9a40: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
9a50: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
9a60: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
9a70: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
9a80: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
9a90: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
9aa0: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
9ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
9ac0: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
9ad0: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
9ae0: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
9af0: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
9b00: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
9b10: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
9b20: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
9b30: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
9b40: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
9b50: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
9b60: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
9b70: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
9b80: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
9b90: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
9ba0: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
9bb0: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
9bc0: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
9bd0: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
9be0: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
9bf0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
9c00: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
9c10: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
9c20: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a  UERY PLAN..**.**
9c30: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
9c40: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
9c50: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
9c60: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
9c70: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
9c80: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
9c90: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
9ca0: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
9cb0: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
9cc0: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
9cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9ce0: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
9cf0: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
9d20: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
9d30: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
9d40: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
9d70: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
9d80: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
9d90: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9db0: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
9dc0: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
9dd0: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9df0: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
9e00: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
9e10: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
9e20: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9e40: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
9e50: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
9e60: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9e90: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
9ea0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ec0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
9ed0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
9ee0: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
9ef0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
9f00: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
9f10: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
9f20: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
9f30: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
9f40: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
9f50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9f60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
9f70: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
9f80: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
9f90: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
9fa0: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
9fb0: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
9fc0: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
9fd0: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
9fe0: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
9ff0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
a000: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
a010: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
a020: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
a030: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
a040: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
a050: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
a060: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
a070: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
a080: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
a090: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
a0a0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
a0b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
a0c0: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
a0d0: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
a0e0: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
a0f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
a100: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
a110: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
a120: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
a130: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
a140: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
a150: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a160: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
a170: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
a180: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
a190: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
a1a0: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
a1b0: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
a1c0: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
a1d0: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
a1e0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
a1f0: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
a200: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
a210: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
a220: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
a230: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
a240: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
a250: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
a260: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
a270: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
a280: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
a290: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
a2a0: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
a2b0: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
a2c0: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
a2d0: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
a2e0: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
a2f0: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
a300: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
a310: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
a320: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
a330: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
a340: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
a350: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
a360: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
a370: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
a380: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
a390: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
a3a0: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
a3b0: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
a3c0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
a3d0: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
a3e0: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
a3f0: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
a400: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
a410: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
a420: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
a430: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
a440: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
a450: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
a460: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
a470: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
a480: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
a490: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
a4a0: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
a4b0: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
a4c0: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
a4d0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
a4e0: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
a4f0: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
a500: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
a510: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
a520: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
a530: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
a540: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
a550: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
a560: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
a570: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
a580: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
a590: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
a5a0: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
a5b0: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
a5c0: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
a5d0: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
a5e0: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
a5f0: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
a600: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
a610: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
a620: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
a630: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
a640: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
a650: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
a660: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
a670: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
a680: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
a690: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
a6a0: 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
a6b0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
a6c0: 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65  p->rc));.  }else
a6d0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b  {.    char *zP4;
a6e0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
a6f0: 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29    if( i<p->nOp )
a700: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  {.      /* The o
a710: 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65  utput line numbe
a720: 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  r is small enoug
a730: 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74  h that we are st
a740: 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ill in the.     
a750: 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d   ** main program
a760: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d  . */.      pOp =
a770: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
a780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
a790: 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   We are currentl
a7a0: 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f  y listing subpro
a7b0: 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f  grams.  Figure o
a7c0: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64  ut which one and
a7d0: 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75  .      ** pick u
a7e0: 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  p the appropriat
a7f0: 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
a800: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
a810: 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  i -= p->nOp;.   
a820: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61     for(j=0; i>=a
a830: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b  pSub[j]->nOp; j+
a840: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d  +){.        i -=
a850: 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a   apSub[j]->nOp;.
a860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
a870: 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61  p = &apSub[j]->a
a880: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Op[i];.    }.   
a890: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
a8a0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  =1 ){.      pMem
a8b0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
a8c0: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  t;.      pMem->u
a8d0: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
a900: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
a910: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20     pMem++;.  .  
a920: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a930: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
a940: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
a950: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
a960: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63  char*)sqlite3Opc
a970: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
a980: 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20  ode); /* Opcode 
a990: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
a9a0: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
a9b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
a9c0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
a9d0: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
a9e0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
a9f0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
aa00: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  em++;..      /* 
aa10: 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72  When an OP_Progr
aa20: 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63  am opcode is enc
aa30: 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79  ounter (the only
aa40: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73   opcode that has
aa50: 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53  .      ** a P4_S
aa60: 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65  UBPROGRAM argume
aa70: 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20  nt), expand the 
aa80: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
aa90: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73  y of subprograms
aaa0: 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69  .      ** kept i
aab0: 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74  n p->aMem[9].z t
aac0: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70  o hold the new p
aad0: 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e  rogram - assumin
aae0: 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61  g this subprogra
aaf0: 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  m.      ** has n
ab00: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
ab10: 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  seen..      */. 
ab20: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34       if( pOp->p4
ab30: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47  type==P4_SUBPROG
ab40: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  RAM ){.        i
ab50: 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62  nt nByte = (nSub
ab60: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
ab70: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
ab80: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
ab90: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b  for(j=0; j<nSub;
aba0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
abb0: 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70   if( apSub[j]==p
abc0: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20  Op->p4.pProgram 
abd0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
abe0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
abf0: 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45  ==nSub && SQLITE
ac00: 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  _OK==sqlite3Vdbe
ac10: 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42  MemGrow(pSub, nB
ac20: 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b  yte, nSub!=0) ){
ac30: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
ac40: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
ac50: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20  *)pSub->z;.     
ac60: 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b       apSub[nSub+
ac70: 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  +] = pOp->p4.pPr
ac80: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20  ogram;.         
ac90: 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20   pSub->flags |= 
aca0: 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20  MEM_Blob;.      
acb0: 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53      pSub->n = nS
acc0: 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  ub*sizeof(SubPro
acd0: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
ace0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
acf0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
ad00: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
ad10: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
ad20: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p1;            
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ad40: 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b   P1 */.    pMem+
ad50: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
ad60: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
ad70: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
ad80: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ada0: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
adb0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
adc0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
add0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
ade0: 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20  = pOp->p3;      
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20      /* P3 */.   
ae10: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
ae20: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
ae30: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
ae40: 4d 65 6d 2c 20 33 32 29 20 29 7b 20 2f 2a 20 50  Mem, 32) ){ /* P
ae50: 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  4 */.      asser
ae60: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
ae70: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
ae80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
ae90: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
aea0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
aeb0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
aec0: 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79     zP4 = display
aed0: 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c  P4(pOp, pMem->z,
aee0: 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50   32);.    if( zP
aef0: 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20  4!=pMem->z ){.  
af00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
af10: 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a  emSetStr(pMem, z
af20: 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  P4, -1, SQLITE_U
af30: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  TF8, 0);.    }el
af40: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
af50: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
af60: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
af70: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
af80: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
af90: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
afa0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20  TE_UTF8;.    }. 
afb0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
afc0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
afd0: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
afe0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
aff0: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
b000: 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 4) ){.        
b010: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
b020: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
b030: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b040: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
b050: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
b060: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
b070: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
b080: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
b090: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
b0a0: 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  ntf(3, pMem->z, 
b0b0: 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29  "%.2x", pOp->p5)
b0c0: 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20  ;   /* P5 */.   
b0d0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
b0e0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
b0f0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66    pMem++;.  .#if
b100: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b110: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
b120: 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  TS.      if( sql
b130: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72  ite3VdbeMemClear
b140: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20  AndResize(pMem, 
b150: 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  500) ){.        
b160: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
b170: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
b180: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b190: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
b1a0: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
b1b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
b1c0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
b1d0: 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61  pMem->n = displa
b1e0: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
b1f0: 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29  4, pMem->z, 500)
b200: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
b210: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
b220: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65  .#else.      pMe
b230: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
b240: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ull;            
b250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
b260: 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  mment */.#endif.
b270: 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52      }..    p->nR
b280: 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34  esColumn = 8 - 4
b290: 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b  *(p->explain-1);
b2a0: 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  .    p->pResultS
b2b0: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
b2c0: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  ;.    p->rc = SQ
b2d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
b2e0: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
b2f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b300: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b310: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
b320: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
b330: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
b340: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
b350: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
b360: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
b370: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
b380: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
b390: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e  (Vdbe *p){.  con
b3a0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  st char *z = 0;.
b3b0: 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
b3c0: 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c  .    z = p->zSql
b3d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
b3e0: 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63  >nOp>=1 ){.    c
b3f0: 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70  onst VdbeOp *pOp
b400: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
b410: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
b420: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
b430: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
b440: 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34       z = pOp->p4
b450: 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  .z;.      while(
b460: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
b470: 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d  *z) ) z++;.    }
b480: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70  .  }.  if( z ) p
b490: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d  rintf("SQL: [%s]
b4a0: 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69  \n", z);.}.#endi
b4b0: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
b4c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
b4d0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
b4e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
b4f0: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
b500: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
b510: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
b520: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
b530: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
b540: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
b550: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
b560: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
b570: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
b580: 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65  3IoTrace==0 ) re
b590: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  turn;.  if( nOp<
b5a0: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
b5b0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
b5c0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
b5d0: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
b5e0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
b5f0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
b600: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20  char z[1000];.  
b610: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
b620: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
b630: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a   "%s", pOp->p4.z
b640: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
b650: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
b660: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
b670: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
b680: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
b690: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
b6a0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
b6b0: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20  if( z[i-1]!=' ' 
b6c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a  ){.          z[j
b6d0: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
b6e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
b6f0: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  {.        z[j++]
b700: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d   = z[i];.      }
b710: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20  .    }.    z[j] 
b720: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
b730: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c  IoTrace("SQL %s\
b740: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65  n", z);.  }.}.#e
b750: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
b760: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51  OMIT_TRACE && SQ
b770: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
b780: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ACE */../*.** Al
b790: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f  locate space fro
b7a0: 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62  m a fixed size b
b7b0: 75 66 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e  uffer and return
b7c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
b7d0: 20 74 68 61 74 20 73 70 61 63 65 2e 20 20 49 66   that space.  If
b7e0: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70   insufficient sp
b7f0: 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
b800: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
b810: 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61  *.** The pBuf pa
b820: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 69  rameter is the i
b830: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
b840: 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20  a pointer which 
b850: 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20  will.** receive 
b860: 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20  the new memory. 
b870: 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c   pBuf is normall
b880: 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66  y NULL.  If pBuf
b890: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c   is not.** NULL,
b8a0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d   it means that m
b8b0: 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73 20  emory space has 
b8c0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
b8d0: 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a  ocated and that.
b8e0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
b8f0: 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63  should not alloc
b900: 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f  ate any new memo
b910: 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69  ry.  When pBuf i
b920: 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69  s not.** NULL si
b930: 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66  mply return pBuf
b940: 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65  .  Only allocate
b950: 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63   new memory spac
b960: 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69  e when pBuf.** i
b970: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42  s NULL..**.** nB
b980: 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  yte is the numbe
b990: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
b9a0: 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a  ace needed..**.*
b9b0: 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73  * *ppFrom points
b9c0: 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70   to available sp
b9d0: 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69  ace and pEnd poi
b9e0: 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  nts to the end o
b9f0: 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62  f the.** availab
ba00: 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20  le space.  When 
ba10: 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74  space is allocat
ba20: 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61  ed, *ppFrom is a
ba30: 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20  dvanced past.** 
ba40: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61  the end of the a
ba50: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a  llocated space..
ba60: 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73  **.** *pnByte is
ba70: 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68   a counter of th
ba80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
ba90: 73 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20  s of space that 
baa0: 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74  have failed.** t
bab0: 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20  o allocate.  If 
bac0: 74 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69  there is insuffi
bad0: 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a  cient space in *
bae0: 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66  ppFrom to satisf
baf0: 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  y the.** request
bb00: 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
bb10: 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65 20   *pnByte by the 
bb20: 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65  amount of the re
bb30: 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  quest..*/.static
bb40: 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63   void *allocSpac
bb50: 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  e(.  void *pBuf,
bb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
bb70: 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  re return pointe
bb80: 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64  r will be stored
bb90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
bba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bbb0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
bbc0: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75   allocate */.  u
bbd0: 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20  8 **ppFrom,     
bbe0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41      /* IN/OUT: A
bbf0: 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70  llocate from *pp
bc00: 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45  From */.  u8 *pE
bc10: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
bc20: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
bc30: 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  yte past the end
bc40: 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66   of *ppFrom buff
bc50: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42  er */.  int *pnB
bc60: 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  yte          /* 
bc70: 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  If allocation ca
bc80: 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e  nnot be made, in
bc90: 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20  crement *pnByte 
bca0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
bcb0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
bcc0: 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b  MENT(*ppFrom) );
bcd0: 0a 20 20 69 66 28 20 70 42 75 66 20 29 20 72 65  .  if( pBuf ) re
bce0: 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79  turn pBuf;.  nBy
bcf0: 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74  te = ROUND8(nByt
bd00: 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46  e);.  if( &(*ppF
bd10: 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70  rom)[nByte] <= p
bd20: 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20  End ){.    pBuf 
bd30: 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d  = (void*)*ppFrom
bd40: 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d  ;.    *ppFrom +=
bd50: 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b   nByte;.  }else{
bd60: 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20  .    *pnByte += 
bd70: 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
bd80: 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a  urn pBuf;.}../*.
bd90: 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44  ** Rewind the VD
bda0: 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  BE back to the b
bdb0: 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70  eginning in prep
bdc0: 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72  aration for.** r
bdd0: 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f  unning it..*/.vo
bde0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
bdf0: 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23  wind(Vdbe *p){.#
be00: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
be10: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
be20: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
be30: 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69  ).  int i;.#endi
be40: 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  f.  assert( p!=0
be50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
be60: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
be70: 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a  IC_INIT );..  /*
be80: 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65   There should be
be90: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70   at least one op
bea0: 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  code..  */.  ass
beb0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
bec0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d  ..  /* Set the m
bed0: 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47  agic to VDBE_MAG
bee0: 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61  IC_RUN sooner ra
bef0: 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e  ther than later.
bf00: 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   */.  p->magic =
bf10: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
bf20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
bf30: 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b  DEBUG.  for(i=1;
bf40: 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29   i<p->nMem; i++)
bf50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
bf60: 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e  >aMem[i].db==p->
bf70: 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  db );.  }.#endif
bf80: 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20  .  p->pc = -1;. 
bf90: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
bfa0: 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63  OK;.  p->errorAc
bfb0: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
bfc0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
bfd0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
bfe0: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
bff0: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
c000: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
c010: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
c020: 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  ;.  p->iStatemen
c030: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43  t = 0;.  p->nFkC
c040: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23  onstraint = 0;.#
c050: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
c060: 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  LE.  for(i=0; i<
c070: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
c080: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
c090: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  = 0;.    p->aOp[
c0a0: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
c0b0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
c0c0: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72  ** Prepare a vir
c0d0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72  tual machine for
c0e0: 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74   execution for t
c0f0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66  he first time af
c100: 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20  ter.** creating 
c110: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
c120: 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ine.  This invol
c130: 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
c140: 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
c150: 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69   registers and i
c160: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
c170: 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e  program counter.
c180: 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44  .** After the VD
c190: 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65  BE has be preppe
c1a0: 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65  d, it can be exe
c1b0: 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  cuted by one or 
c1c0: 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  more.** calls to
c1d0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
c1e0: 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
c1f0: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
c200: 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20   called exactly 
c210: 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72  once on each vir
c220: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
c230: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
c240: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
c250: 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70  e VM has been "p
c260: 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20  ackaged" and is 
c270: 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e  ready.** to run.
c280: 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
c290: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
c2a0: 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f  further calls to
c2b0: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
c2c0: 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e  AddOp() function
c2d0: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
c2e0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
c2f0: 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74  disconnects.** t
c300: 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
c310: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68   Parse object th
c320: 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61  at helped genera
c330: 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68  te it so that th
c340: 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65  e.** the Vdbe be
c350: 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e  comes an indepen
c360: 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20  dent entity and 
c370: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
c380: 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72   can be.** destr
c390: 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  oyed..**.** Use 
c3a0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
c3b0: 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72  ewind() procedur
c3c0: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76  e to restore a v
c3d0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
c3e0: 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e  ack.** to its in
c3f0: 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65  itial state afte
c400: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75  r it has been ru
c410: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
c420: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
c430: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c450: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
c460: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
c490: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  text */.){.  sql
c4a0: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c4c0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
c4d0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
c4e0: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
c4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c500: 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
c510: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  rs */.  int nMem
c520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c530: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c540: 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65   of VM memory re
c550: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
c560: 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20   nCursor;       
c570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c580: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
c590: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
c5a0: 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c5c0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
c5d0: 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72  ents in subprogr
c5e0: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e  ams */.  int nOn
c5f0: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
c600: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c610: 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73  r of OP_Once ins
c620: 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  tructions */.  i
c630: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c650: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
c660: 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20 20  .  u8 *zCsr;    
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c680: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69    /* Memory avai
c690: 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  lable for alloca
c6a0: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 45  tion */.  u8 *zE
c6b0: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
c6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
c6d0: 74 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c 6f  t byte past allo
c6e0: 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  cated memory */.
c6f0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74   /* How much ext
c720: 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65  ra memory is nee
c730: 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
c740: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
c750: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
c760: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
c770: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
c780: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
c790: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
c7a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d  assert( pParse==
c7b0: 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64  p->pParse );.  d
c7c0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
c7d0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
c7e0: 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56  ailed==0 );.  nV
c7f0: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  ar = pParse->nVa
c800: 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72  r;.  nMem = pPar
c810: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72  se->nMem;.  nCur
c820: 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
c830: 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61  ab;.  nArg = pPa
c840: 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20  rse->nMaxArg;.  
c850: 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d 3e  nOnce = pParse->
c860: 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f 6e  nOnce;.  if( nOn
c870: 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d 20  ce==0 ) nOnce = 
c880: 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74 20  1; /* Ensure at 
c890: 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 69  least one byte i
c8a0: 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d  n p->aOnceFlag[]
c8b0: 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20   */.  .  /* For 
c8c0: 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75  each cursor requ
c8d0: 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63  ired, also alloc
c8e0: 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ate a memory cel
c8f0: 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63  l. Memory.  ** c
c900: 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75  ells (nMem+1-nCu
c910: 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63  rsor)..nMem, inc
c920: 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76  lusive, will nev
c930: 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20  er be used by.  
c940: 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  ** the vdbe prog
c950: 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65  ram. Instead the
c960: 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c  y are used to al
c970: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
c980: 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72  .  ** VdbeCursor
c990: 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74  /BtCursor struct
c9a0: 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f  ures. The blob o
c9b0: 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
c9c0: 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63  ted with .  ** c
c9d0: 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65  ursor 0 is store
c9e0: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  d in memory cell
c9f0: 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65   nMem. Memory ce
ca00: 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a  ll (nMem-1).  **
ca10: 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62   stores the blob
ca20: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
ca30: 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
ca40: 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20  r 1, etc..  **. 
ca50: 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c   ** See also: al
ca60: 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a  locateCursor()..
ca70: 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e    */.  nMem += n
ca80: 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c  Cursor;..  /* Al
ca90: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
caa0: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
cab0: 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  s, SQL variables
cac0: 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61  , VDBE cursors a
cad0: 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61  nd .  ** an arra
cae0: 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c  y to marshal SQL
caf0: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
cb00: 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a  nts in..  */.  z
cb10: 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  Csr = (u8*)&p->a
cb20: 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20  Op[p->nOp];     
cb30: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
cb40: 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61   avaliable for a
cb50: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a  llocation */.  z
cb60: 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  End = (u8*)&p->a
cb70: 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  Op[pParse->nOpAl
cb80: 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20  loc];  /* First 
cb90: 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66  byte past end of
cba0: 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65   zCsr[] */..  re
cbb0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
cbc0: 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73   &nArg);.  p->us
cbd0: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20  esStmtJournal = 
cbe0: 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d  (u8)(pParse->isM
cbf0: 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61  ultiWrite && pPa
cc00: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a  rse->mayAbort);.
cc10: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
cc20: 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30  plain && nMem<10
cc30: 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31   ){.    nMem = 1
cc40: 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  0;.  }.  memset(
cc50: 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43  zCsr, 0, zEnd-zC
cc60: 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 28  sr);.  zCsr += (
cc70: 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37  zCsr - (u8*)0)&7
cc80: 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
cc90: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
cca0: 28 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e 65  (zCsr) );.  p->e
ccb0: 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  xpired = 0;..  /
ccc0: 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67  * Memory for reg
ccd0: 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65  isters, paramete
cce0: 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c  rs, cursor, etc,
ccf0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e   is allocated in
cd00: 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73   two.  ** passes
cd10: 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  .  On the first 
cd20: 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20  pass, we try to 
cd30: 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 61  reuse unused spa
cd40: 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20  ce at the .  ** 
cd50: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
cd60: 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20  e array.  If we 
cd70: 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61  are unable to sa
cd80: 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79  tisfy all memory
cd90: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e  .  ** requiremen
cda0: 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68  ts by reusing th
cdb0: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74  e opcode array t
cdc0: 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65  ail, then the se
cdd0: 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77  cond.  ** pass w
cde0: 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ill fill in the 
cdf0: 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72 65  rest using a fre
ce00: 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  sh allocation.  
ce10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
ce20: 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63  two-pass approac
ce30: 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73  h that reuses as
ce40: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
ce50: 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20  possible from.  
ce60: 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20  ** the leftover 
ce70: 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
ce80: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
ce90: 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69  rray can signifi
cea0: 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75  cantly.  ** redu
ceb0: 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ce the amount of
cec0: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
ced0: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
cee0: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20  ment..  */.  do 
cef0: 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b  {.    nByte = 0;
cf00: 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61  .    p->aMem = a
cf10: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65  llocSpace(p->aMe
cf20: 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d  m, nMem*sizeof(M
cf30: 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  em), &zCsr, zEnd
cf40: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
cf50: 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70  ->aVar = allocSp
cf60: 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61  ace(p->aVar, nVa
cf70: 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26  r*sizeof(Mem), &
cf80: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
cf90: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72  te);.    p->apAr
cfa0: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  g = allocSpace(p
cfb0: 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69  ->apArg, nArg*si
cfc0: 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73  zeof(Mem*), &zCs
cfd0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
cfe0: 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d  ;.    p->azVar =
cff0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
d000: 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  zVar, nVar*sizeo
d010: 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c  f(char*), &zCsr,
d020: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
d030: 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61      p->apCsr = a
d040: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43  llocSpace(p->apC
d050: 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65  sr, nCursor*size
d060: 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c  of(VdbeCursor*),
d070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d080: 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 72             &zCsr
d090: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
d0a0: 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  .    p->aOnceFla
d0b0: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  g = allocSpace(p
d0c0: 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e  ->aOnceFlag, nOn
d0d0: 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  ce, &zCsr, zEnd,
d0e0: 20 26 6e 42 79 74 65 29 3b 0a 23 69 66 64 65 66   &nByte);.#ifdef
d0f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
d100: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
d110: 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61     p->anExec = a
d120: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e 45  llocSpace(p->anE
d130: 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65  xec, p->nOp*size
d140: 6f 66 28 69 36 34 29 2c 20 26 7a 43 73 72 2c 20  of(i64), &zCsr, 
d150: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 23  zEnd, &nByte);.#
d160: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e 42  endif.    if( nB
d170: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  yte ){.      p->
d180: 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
d190: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
d1a0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
d1b0: 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65    zCsr = p->pFre
d1c0: 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a  e;.    zEnd = &z
d1d0: 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77  Csr[nByte];.  }w
d1e0: 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21  hile( nByte && !
d1f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d200: 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f   );..  p->nCurso
d210: 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70  r = nCursor;.  p
d220: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f  ->nOnceFlag = nO
d230: 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56  nce;.  if( p->aV
d240: 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61  ar ){.    p->nVa
d250: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
d260: 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  .    for(n=0; n<
d270: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
d280: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
d290: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
d2a0: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
d2b0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
d2c0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61   }.  if( p->azVa
d2d0: 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 7a 56  r && pParse->nzV
d2e0: 61 72 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  ar>0 ){.    p->n
d2f0: 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  zVar = pParse->n
d300: 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79  zVar;.    memcpy
d310: 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73  (p->azVar, pPars
d320: 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56  e->azVar, p->nzV
d330: 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56  ar*sizeof(p->azV
d340: 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d  ar[0]));.    mem
d350: 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61  set(pParse->azVa
d360: 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a  r, 0, pParse->nz
d370: 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  Var*sizeof(pPars
d380: 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20  e->azVar[0]));. 
d390: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d   }.  if( p->aMem
d3a0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d   ){.    p->aMem-
d3b0: 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -;              
d3c0: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b          /* aMem[
d3d0: 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e  ] goes from 1..n
d3e0: 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d  Mem */.    p->nM
d3f0: 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20  em = nMem;      
d400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
d410: 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e      not from 0..
d420: 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f  nMem-1 */.    fo
d430: 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20  r(n=1; n<=nMem; 
d440: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
d450: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
d460: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20  EM_Undefined;.  
d470: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64      p->aMem[n].d
d480: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
d490: 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d  }.  p->explain =
d4a0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
d4b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
d4c0: 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  ewind(p);.}../*.
d4d0: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
d4e0: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
d4f0: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
d500: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
d510: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
d520: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
d530: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
d540: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
d550: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
d560: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
d570: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
d580: 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
d590: 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70  erClose(p->db, p
d5a0: 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e  Cx);.  if( pCx->
d5b0: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
d5c0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
d5d0: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ->pBt);.    /* T
d5e0: 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
d5f0: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
d600: 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
d610: 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
d620: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
d630: 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  ove. */.  }else 
d640: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
d650: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
d660: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
d670: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
d680: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
d690: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
d6a0: 42 4c 45 0a 20 20 65 6c 73 65 20 69 66 28 20 70  BLE.  else if( p
d6b0: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20  Cx->pVtabCursor 
d6c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
d6d0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
d6e0: 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70  bCursor = pCx->p
d6f0: 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20  VtabCursor;.    
d700: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
d710: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20  dule *pModule = 
d720: 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
d730: 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
d740: 20 61 73 73 65 72 74 28 20 70 56 74 61 62 43 75   assert( pVtabCu
d750: 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65  rsor->pVtab->nRe
d760: 66 3e 30 20 29 3b 0a 20 20 20 20 70 56 74 61 62  f>0 );.    pVtab
d770: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 6e  Cursor->pVtab->n
d780: 52 65 66 2d 2d 3b 0a 20 20 20 20 70 4d 6f 64 75  Ref--;.    pModu
d790: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
d7a0: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 65 6e  Cursor);.  }.#en
d7b0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  dif.}../*.** Clo
d7c0: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 69  se all cursors i
d7d0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
d7e0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ame..*/.static v
d7f0: 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  oid closeCursors
d800: 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70 29  InFrame(Vdbe *p)
d810: 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  {.  if( p->apCsr
d820: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
d830: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
d840: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
d850: 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72        VdbeCursor
d860: 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b   *pC = p->apCsr[
d870: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  i];.      if( pC
d880: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d890: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
d8a0: 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20  r(p, pC);.      
d8b0: 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20    p->apCsr[i] = 
d8c0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
d8d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
d8e0: 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  py the values st
d8f0: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65  ored in the Vdbe
d900: 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20  Frame structure 
d910: 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69  to its Vdbe. Thi
d920: 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f  s.** is used, fo
d930: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
d940: 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72  a trigger sub-pr
d950: 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20  ogram is halted 
d960: 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f  to restore.** co
d970: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69  ntrol to the mai
d980: 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e  n program..*/.in
d990: 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  t sqlite3VdbeFra
d9a0: 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72  meRestore(VdbeFr
d9b0: 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20  ame *pFrame){.  
d9c0: 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65  Vdbe *v = pFrame
d9d0: 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73  ->v;.  closeCurs
d9e0: 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23  orsInFrame(v);.#
d9f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
da00: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
da10: 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20  TUS.  v->anExec 
da20: 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63  = pFrame->anExec
da30: 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f  ;.#endif.  v->aO
da40: 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65  nceFlag = pFrame
da50: 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76  ->aOnceFlag;.  v
da60: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46  ->nOnceFlag = pF
da70: 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b  rame->nOnceFlag;
da80: 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61  .  v->aOp = pFra
da90: 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f  me->aOp;.  v->nO
daa0: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b  p = pFrame->nOp;
dab0: 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72  .  v->aMem = pFr
dac0: 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->aMem;.  v->
dad0: 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  nMem = pFrame->n
dae0: 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20  Mem;.  v->apCsr 
daf0: 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b  = pFrame->apCsr;
db00: 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  v->nCursor = 
db10: 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b  pFrame->nCursor;
db20: 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f  .  v->db->lastRo
db30: 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61  wid = pFrame->la
db40: 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43  stRowid;.  v->nC
db50: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
db60: 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62  nChange;.  v->db
db70: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
db80: 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20  me->nDbChange;. 
db90: 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e   return pFrame->
dba0: 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  pc;.}../*.** Clo
dbb0: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  se all cursors..
dbc0: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61  **.** Also relea
dbd0: 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d  se any dynamic m
dbe0: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68  emory held by th
dbf0: 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65  e VM in the Vdbe
dc00: 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a  .aMem memory .**
dc10: 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69   cell array. Thi
dc20: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61  s is necessary a
dc30: 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  s the memory cel
dc40: 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74  l array may cont
dc50: 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20  ain.** pointers 
dc60: 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  to VdbeFrame obj
dc70: 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20  ects, which may 
dc80: 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20  in turn contain 
dc90: 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f  pointers to.** o
dca0: 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  pen cursors..*/.
dcb0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
dcc0: 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65  eAllCursors(Vdbe
dcd0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
dce0: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
dcf0: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a  eFrame *pFrame;.
dd00: 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70      for(pFrame=p
dd10: 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65  ->pFrame; pFrame
dd20: 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d  ->pParent; pFram
dd30: 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  e=pFrame->pParen
dd40: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
dd50: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
dd60: 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  pFrame);.    p->
dd70: 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  pFrame = 0;.    
dd80: 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->nFrame = 0;. 
dd90: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
dda0: 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63  nFrame==0 );.  c
ddb0: 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
ddc0: 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  me(p);.  if( p->
ddd0: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
dde0: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
ddf0: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
de00: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
de10: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
de20: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
de30: 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
de40: 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
de50: 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
de60: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
de70: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
de80: 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pDel);.  }..  /
de90: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78  * Delete any aux
dea0: 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  data allocations
deb0: 20 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20   made by the VM 
dec0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78  */.  if( p->pAux
ded0: 44 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64  Data ) sqlite3Vd
dee0: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
def0: 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73  p, -1, 0);.  ass
df00: 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61  ert( p->pAuxData
df10: 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
df20: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
df30: 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 72  after a single r
df40: 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  un..*/.static vo
df50: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
df60: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
df70: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66  db = p->db;..#if
df80: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
df90: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73  .  /* Execute as
dfa0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
dfb0: 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
dfc0: 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b   the Vdbe.apCsr[
dfd0: 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65  ] and .  ** Vdbe
dfe0: 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68  .aMem[] arrays h
dff0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
e000: 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f   cleaned up.  */
e010: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
e020: 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69  p->apCsr ) for(i
e030: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
e040: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
e050: 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
e060: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
e070: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  {.    for(i=1; i
e080: 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20  <=p->nMem; i++) 
e090: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
e0a0: 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e  i].flags==MEM_Un
e0b0: 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  defined );.  }.#
e0c0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
e0d0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
e0e0: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
e0f0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
e100: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
e110: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
e120: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
e130: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
e140: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
e150: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
e160: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
e170: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
e180: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
e190: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
e1a0: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
e1b0: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
e1c0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
e1d0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
e1e0: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
e1f0: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
e200: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
e210: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
e220: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
e230: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
e240: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
e250: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
e260: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
e270: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
e280: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
e290: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
e2a0: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
e2b0: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
e2c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
e2d0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
e2e0: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
e2f0: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
e300: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
e310: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
e320: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
e330: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
e340: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
e350: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  o(db, sizeof(Mem
e360: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
e370: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
e380: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
e390: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
e3a0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
e3b0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
e3c0: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
e3d0: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
e3e0: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
e3f0: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
e400: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
e410: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
e420: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
e430: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
e440: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
e450: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
e460: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
e470: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
e480: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
e490: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
e4a0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
e4b0: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
e4c0: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
e4d0: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
e4e0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
e4f0: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
e500: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
e510: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
e520: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
e530: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
e540: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
e550: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
e560: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
e570: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
e580: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
e590: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
e5a0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
e5b0: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
e5e0: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
e5f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
e620: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
e630: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
e640: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
e670: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
e680: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
e690: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
e6a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
e6b0: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
e6c0: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
e6d0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
e6e0: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
e6f0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
e700: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
e710: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
e720: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
e730: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
e740: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
e750: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
e760: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
e770: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
e780: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e790: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
e7a0: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
e7b0: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
e7c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
e7d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
e7e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
e7f0: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
e800: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
e810: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
e820: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
e830: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
e840: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
e850: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
e860: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
e870: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
e880: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
e890: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
e8a0: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
e8b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e8c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
e8d0: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
e8e0: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
e8f0: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
e900: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e910: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
e920: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
e930: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
e940: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
e950: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
e960: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
e970: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
e980: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
e990: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
e9a0: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
e9b0: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
e9c0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
e9d0: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
e9e0: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
e9f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
ea00: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
ea10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
ea20: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
ea30: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
ea40: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  action */.  int 
ea50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ea60: 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
ea70: 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
ea80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
ea90: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
eaa0: 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
eab0: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
eac0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
ead0: 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
eae0: 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
eaf0: 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
eb00: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
eb10: 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
eb20: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
eb30: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
eb40: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
eb50: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
eb60: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
eb70: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
eb80: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
eb90: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
eba0: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
ebb0: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
ebc0: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
ebd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ebe0: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
ebf0: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
ec00: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
ec10: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
ec20: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
ec30: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
ec40: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
ec50: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
ec60: 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54  (db, p);..  /* T
ec70: 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
ec80: 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
ec90: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
eca0: 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
ecb0: 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
ecc0: 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
ecd0: 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
ece0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
ecf0: 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
ed00: 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
ed10: 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
ed20: 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
ed30: 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
ed40: 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
ed50: 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
ed60: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
ed70: 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
ed80: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
ed90: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
eda0: 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
edb0: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
edc0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
edd0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
ede0: 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
edf0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
ee00: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
ee10: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
ee20: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
ee30: 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
ee40: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d  1;.      if( i!=
ee50: 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20  1 ) nTrans++;.  
ee60: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ee70: 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Enter(pBt);.    
ee80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
ee90: 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
eea0: 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
eeb0: 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20  er(pBt));.      
eec0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
eed0: 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
eee0: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
eef0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
ef00: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
ef10: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
ef20: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
ef30: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
ef40: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
ef50: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
ef60: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
ef70: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
ef80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d   ){.    rc = db-
ef90: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
efa0: 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
efb0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
efc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
efd0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
efe0: 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d  OMMITHOOK;.    }
eff0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
f000: 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
f010: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
f020: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
f030: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
f040: 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
f050: 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
f060: 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
f070: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
f080: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
f090: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
f0a0: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
f0b0: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
f0c0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
f0d0: 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
f0e0: 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
f0f0: 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
f100: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
f110: 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61  is :memory: or a
f120: 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20   temp file.  In 
f130: 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20  .  ** that case 
f140: 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
f150: 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
f160: 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
f170: 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69  use the .  ** si
f180: 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74  mple case then t
f190: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
f1a0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
f1b0: 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  0(sqlite3BtreeGe
f1c0: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
f1d0: 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c  b[0].pBt)).   ||
f1e0: 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a   nTrans<=1.  ){.
f1f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
f200: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
f210: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
f220: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
f230: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f240: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
f250: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f260: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
f270: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
f280: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
f290: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
f2a0: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
f2b0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
f2c0: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
f2d0: 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
f2e0: 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
f2f0: 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
f300: 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
f310: 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
f320: 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
f330: 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
f340: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
f350: 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
f360: 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
f370: 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
f380: 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
f390: 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
f3a0: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
f3b0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
f3c0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
f3d0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
f3e0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
f3f0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
f400: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
f410: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
f420: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
f430: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f440: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
f450: 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20  seTwo(pBt, 0);. 
f460: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f470: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f480: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
f490: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
f4a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
f4b0: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63  /* The complex c
f4c0: 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61  ase - There is a
f4d0: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74   multi-file writ
f4e0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
f4f0: 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tive..  ** This 
f500: 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65  requires a maste
f510: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
f520: 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61  o ensure the tra
f530: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
f540: 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69   committed atomi
f550: 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  cally..  */.#ifn
f560: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f570: 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20  DISKIO.  else{. 
f580: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
f590: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
f5a0: 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
f5b0: 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  c = 0;.    char 
f5c0: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
f5d0: 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72  /* File-name for
f5e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f5f0: 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  nal */.    char 
f600: 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65  const *zMainFile
f610: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
f620: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
f630: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
f640: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
f650: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
f660: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
f670: 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
f680: 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d  int retryCount =
f690: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69   0;.    int nMai
f6a0: 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  nFile;..    /* S
f6b0: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
f6c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
f6d0: 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c   */.    nMainFil
f6e0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
f6f0: 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  n30(zMainFile);.
f700: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71      zMaster = sq
f710: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
f720: 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58   "%s-mjXXXXXX9XX
f730: 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  z", zMainFile);.
f740: 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d      if( zMaster=
f750: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
f760: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f  TE_NOMEM;.    do
f770: 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
f780: 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  ndom;.      if( 
f790: 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20  retryCount ){.  
f7a0: 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
f7b0: 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20  ount>100 ){.    
f7c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
f7d0: 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
f7e0: 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20  MJ delete: %s", 
f7f0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
f800: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
f810: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f820: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
f830: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
f840: 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43  }else if( retryC
f850: 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ount==1 ){.     
f860: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
f870: 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
f880: 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20  J collide: %s", 
f890: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
f8a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f8b0: 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a    retryCount++;.
f8c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
f8d0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
f8e0: 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64  iRandom), &iRand
f8f0: 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  om);.      sqlit
f900: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20  e3_snprintf(13, 
f910: 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69  &zMaster[nMainFi
f920: 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30  le], "-mj%06X9%0
f930: 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2X",.           
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29      (iRandom>>8)
f960: 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64  &0xffffff, iRand
f970: 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20  om&0xff);.      
f980: 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c  /* The antipenul
f990: 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72  timate character
f9a0: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
f9b0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
f9c0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22  .      ** be "9"
f9d0: 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63   to avoid name c
f9e0: 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75  ollisions when u
f9f0: 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d  sing 8+3 filenam
fa00: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  es. */.      ass
fa10: 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c  ert( zMaster[sql
fa20: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
fa30: 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b  ster)-3]=='9' );
fa40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69  .      sqlite3Fi
fa50: 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46  leSuffix3(zMainF
fa60: 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ile, zMaster);. 
fa70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
fa80: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
fa90: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
faa0: 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
fab0: 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
fac0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fad0: 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
fae0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
faf0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
fb00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
fb10: 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
fb20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
fb30: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
fb40: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
fb50: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
fb60: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
fb70: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
fb80: 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
fb90: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
fba0: 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
fbb0: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
fbc0: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
fbd0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
fbe0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fbf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fc00: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
fc10: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fc20: 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
fc30: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
fc40: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
fc50: 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
fc60: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
fc70: 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
fc80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
fc90: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
fca0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
fcb0: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
fcc0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
fcd0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
fce0: 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
fcf0: 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
fd00: 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
fd10: 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
fd20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
fd30: 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
fd40: 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
fd50: 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
fd60: 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
fd70: 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
fd80: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fd90: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
fda0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
fdb0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
fdc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
fdd0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
fde0: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
fdf0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
fe00: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
fe10: 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
fe20: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
fe30: 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  f( zFile==0 ){. 
fe40: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
fe50: 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45  e;  /* Ignore TE
fe60: 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20  MP and :memory: 
fe70: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
fe80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
fe90: 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21  ssert( zFile[0]!
fea0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
feb0: 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21  ( !needSync && !
fec0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
fed0: 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b  Disabled(pBt) ){
fee0: 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
fef0: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
ff00: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
ff10: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
ff20: 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  Master, zFile, s
ff30: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
ff40: 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
ff50: 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
ff60: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
ff70: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20  n30(zFile)+1;.  
ff80: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ff90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ffa0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
ffb0: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
ffc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
ffd0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
ffe0: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
fff0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10000 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
10010 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
10020 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
10030 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10040 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
10050 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10060 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
10070 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
10080 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
10090 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
100a0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
100b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
100c0 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26  eedSync .     &&
100d0 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65   0==(sqlite3OsDe
100e0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
100f0 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c  ics(pMaster)&SQL
10100 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
10110 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51  TIAL).     && SQ
10120 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
10130 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
10140 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e  ster, SQLITE_SYN
10150 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29  C_NORMAL)).    )
10160 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
10170 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
10180 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
10190 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
101a0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
101b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
101c0 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
101d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
101e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
101f0 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66  ync all the db f
10200 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  iles involved in
10210 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
10220 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a  . The same call.
10230 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
10240 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
10250 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69  ointer in each i
10260 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
10270 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20  l. If.    ** an 
10280 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72  error occurs her
10290 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  e, do not delete
102a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
102b0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
102c0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65  .    ** If the e
102d0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
102e0 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ng the first cal
102f0 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
10300 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
10310 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74  aseOne(), then t
10320 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65  here is a chance
10330 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
10340 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10350 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70  file will be orp
10360 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61  haned. But we ca
10370 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a  nnot delete it,.
10380 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74      ** in case t
10390 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
103a0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20  l file name was 
103b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
103c0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
103d0 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
103e0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
103f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
10400 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
10410 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
10420 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
10430 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
10440 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
10450 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
10460 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10470 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
10480 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65  eOne(pBt, zMaste
10490 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
104a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
104b0 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
104c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
104d0 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
104e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
104f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10500 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10510 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
10520 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10530 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
10540 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
10550 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
10560 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61   commits the tra
10570 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a  nsaction. After.
10580 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69      ** doing thi
10590 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
105a0 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20  is synced again 
105b0 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76  before any indiv
105c0 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61  idual.    ** tra
105d0 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61  nsaction files a
105e0 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  re deleted..    
105f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
10600 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
10610 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 65 65 64 53  , zMaster, needS
10620 79 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ync);.    sqlite
10630 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
10640 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
10650 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
10660 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
10670 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
10680 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
10690 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
106a0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
106b0 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
106c0 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
106d0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
106e0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
106f0 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
10700 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
10710 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
10720 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
10730 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
10740 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
10750 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
10760 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
10770 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
10780 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
10790 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
107a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
107b0 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
107c0 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
107d0 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
107e0 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
107f0 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
10800 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
10810 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
10820 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
10830 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
10840 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
10850 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
10860 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
10870 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oc();.    for(i=
10880 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
10890 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
108a0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
108b0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
108c0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
108d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
108e0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
108f0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
10900 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
10910 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
10920 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
10930 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
10940 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
10950 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
10960 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
10970 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
10980 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
10990 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
109a0 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69  qlite3.nVdbeActi
109b0 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  ve count variabl
109c0 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
109d0 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
109e0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
109f0 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
10a00 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
10a10 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
10a20 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
10a30 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
10a40 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
10a50 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
10a60 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
10a70 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
10a80 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
10a90 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
10aa0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
10ab0 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
10ac0 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
10ad0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
10ae0 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
10af0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
10b00 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
10b10 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
10b20 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
10b30 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  te = 0;.  int nR
10b40 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ead = 0;.  p = d
10b50 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
10b60 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
10b70 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
10b80 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  y((sqlite3_stmt*
10b90 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  )p) ){.      cnt
10ba0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
10bb0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
10bc0 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Write++;.      i
10bd0 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
10be0 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d  ) nRead++;.    }
10bf0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
10c00 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
10c10 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41   cnt==db->nVdbeA
10c20 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72  ctive );.  asser
10c30 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e  t( nWrite==db->n
10c40 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61  VdbeWrite );.  a
10c50 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62  ssert( nRead==db
10c60 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d  ->nVdbeRead );.}
10c70 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
10c80 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
10c90 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
10ca0 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
10cb0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
10cc0 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
10cd0 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
10ce0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
10cf0 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
10d00 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
10d10 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
10d20 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
10d30 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
10d40 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
10d50 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10d60 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
10d70 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
10d80 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
10d90 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
10da0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
10db0 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
10dc0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10dd0 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
10de0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
10df0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
10e00 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
10e10 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
10e20 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
10e30 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
10e40 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
10e50 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
10e60 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
10e70 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
10e80 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
10e90 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
10ea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
10eb0 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   If p->iStatemen
10ec0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
10ed0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n zero, then thi
10ee0 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20  s Vdbe opened a 
10ef0 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
10f00 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
10f10 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
10f20 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79  d here. The only
10f30 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20   exception.  ** 
10f40 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72  is that an IO er
10f50 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63  ror may have occ
10f60 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61  urred, causing a
10f70 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
10f80 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68  back..  ** In th
10f90 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74  is case (db->nSt
10fa0 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64  atement==0), and
10fb0 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
10fc0 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20  g to do..  */.  
10fd0 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  if( db->nStateme
10fe0 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
10ff0 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ent ){.    int i
11000 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
11010 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  iSavepoint = p->
11020 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20  iStatement-1;.. 
11030 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d     assert( eOp==
11040 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
11050 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
11060 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
11070 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
11080 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
11090 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53     assert( p->iS
110a0 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
110b0 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
110c0 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
110d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
110e0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
110f0 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
11100 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74  ITE_OK;.      Bt
11110 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
11120 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
11130 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
11140 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
11150 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
11160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
11170 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
11180 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
11190 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
111a0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
111b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
111c0 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
111d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
111e0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
111f0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
11200 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
11210 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
11220 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11230 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11250 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
11260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11270 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74     }.    db->nSt
11280 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70  atement--;.    p
11290 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
112a0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
112b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
112c0 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
112d0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
112e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
112f0 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
11300 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
11310 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
11320 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
11330 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11340 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
11360 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
11370 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
11380 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
11390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
113a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
113b0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
113c0 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
113d0 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
113e0 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20  estore the .    
113f0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
11400 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
11410 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20  straint counter 
11420 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
11430 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a  had when .    **
11440 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
11450 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
11460 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  pened.  */.    i
11470 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
11480 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
11490 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
114a0 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
114b0 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64  DefCons;.      d
114c0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
114d0 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
114e0 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  fImmCons;.    }.
114f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
11510 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
11520 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
11530 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
11540 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
11550 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
11560 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
11570 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
11580 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
11590 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
115a0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
115b0 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
115c0 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
115d0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
115e0 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
115f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
11600 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
11610 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
11620 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
11630 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
11640 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
11650 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
11660 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
11670 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
11680 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
11690 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
116a0 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72  IGNKEY.** and wr
116b0 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
116c0 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
116d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
116e0 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
116f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
11700 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
11710 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
11720 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
11730 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
11740 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
11750 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
11760 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  & (db->nDeferred
11770 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72  Cons+db->nDeferr
11780 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20  edImmCons)>0) . 
11790 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20    || (!deferred 
117a0 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
117b0 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  int>0) .  ){.   
117c0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
117d0 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
117e0 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72  GNKEY;.    p->er
117f0 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
11800 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
11810 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46  3VdbeError(p, "F
11820 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
11830 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
11840 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11850 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
11860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11870 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
11880 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
11890 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
118a0 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
118b0 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
118c0 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
118d0 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
118e0 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
118f0 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
11900 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
11910 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
11920 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
11930 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
11940 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11950 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
11960 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
11970 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
11980 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
11990 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
119a0 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
119b0 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
119c0 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
119d0 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
119e0 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
119f0 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
11a00 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
11a10 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
11a20 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
11a30 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
11a40 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
11a50 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
11a60 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
11a70 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
11a80 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
11a90 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
11aa0 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
11ab0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
11ac0 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
11ad0 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
11ae0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
11af0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b10 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
11b20 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
11b30 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
11b40 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
11b50 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
11b60 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
11b70 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
11b80 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
11b90 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
11ba0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
11bb0 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
11bc0 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
11bd0 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
11be0 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
11bf0 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
11c00 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
11c10 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
11c20 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
11c30 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
11c40 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
11c50 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
11c60 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
11c70 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
11c80 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
11c90 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
11ca0 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
11cb0 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
11cc0 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
11cd0 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
11ce0 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
11cf0 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
11d00 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
11d10 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
11d20 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
11d30 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
11d40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
11d50 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
11d60 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
11d70 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
11d80 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
11d90 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
11da0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11db0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
11dc0 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74  nceFlag ) memset
11dd0 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30  (p->aOnceFlag, 0
11de0 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b  , p->nOnceFlag);
11df0 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
11e00 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  rs(p);.  if( p->
11e10 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
11e20 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
11e30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11e40 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65   }.  checkActive
11e50 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
11e60 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
11e70 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
11e80 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
11e90 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20  ever started or 
11ea0 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20  if the.  ** SQL 
11eb0 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e  statement does n
11ec0 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ot read or write
11ed0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
11ee0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
11ef0 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65  c>=0 && p->bIsRe
11f00 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  ader ){.    int 
11f10 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
11f20 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
11f30 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69  m p->rc */.    i
11f40 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  nt eStatementOp 
11f50 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  = 0;.    int isS
11f60 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
11f70 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
11f80 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65  o true if a 'spe
11f90 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a  cial' error */..
11fa0 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
11fb0 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
11fc0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
11fd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
11fe0 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  nter(p);..    /*
11ff0 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
12000 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
12010 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
12020 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
12030 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
12040 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
12050 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
12060 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
12090 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
120a0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
120b0 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
120c0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
120d0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
120e0 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  as read-only and
120f0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
12100 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  is SQLITE_INTERR
12110 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e  UPT, .      ** n
12120 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  o rollback is ne
12130 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69  cessary. Otherwi
12140 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73  se, at least a s
12150 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
12160 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ** transaction m
12170 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
12180 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ck to restore th
12190 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
121a0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  .      ** consis
121b0 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
121c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76    **.      ** Ev
121d0 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
121e0 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ent is read-only
121f0 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
12200 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20  t to perform.   
12210 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e     ** a statemen
12220 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
12230 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
12240 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
12250 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  r .      ** occu
12260 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  rred while writi
12270 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
12280 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  l, sub-journal o
12290 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  r database.     
122a0 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74   ** file as part
122b0 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   of an effort to
122c0 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73   free up cache s
122d0 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69  pace (see functi
122e0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  on.      ** page
122f0 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67  rStress() in pag
12300 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62  er.c), the rollb
12310 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20  ack is required 
12320 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20  to restore .    
12330 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74    ** the pager t
12340 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  o a consistent s
12350 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
12360 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
12370 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
12380 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
12390 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
123a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
123b0 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
123c0 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73  FULL) && p->uses
123d0 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
123e0 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d           eStatem
123f0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
12400 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
12410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12420 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
12430 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
12440 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
12450 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
12460 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
12470 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
12480 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
12490 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
124a0 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
124b0 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
124c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
124d0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
124e0 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
124f0 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
12500 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
12510 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
12520 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
12530 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
12540 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68            p->nCh
12550 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
12560 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12570 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
12580 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f  for immediate fo
12590 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74  reign key violat
125a0 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ions. */.    if(
125b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
125c0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
125d0 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
125e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   0);.    }.  .  
125f0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
12600 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
12610 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20  set and this is 
12620 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20  the only active 
12630 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56  writer .    ** V
12640 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69  M, then we do ei
12650 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72  ther a commit or
12660 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65   rollback of the
12670 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
12680 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  tion. .    **.  
12690 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
126a0 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20  block also runs 
126b0 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  if one of the sp
126c0 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e  ecial errors han
126d0 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f  dled .    ** abo
126e0 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  ve has occurred.
126f0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
12700 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53   !sqlite3VtabInS
12710 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26  ync(db) .     &&
12720 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
12730 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64  .     && db->nVd
12740 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61  beWrite==(p->rea
12750 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29  dOnly==0) .    )
12760 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
12770 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
12780 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d  (p->errorAction=
12790 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53  =OE_Fail && !isS
127a0 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a  pecialError) ){.
127b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
127c0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
127d0 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  p, 1);.        i
127e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
127f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
12800 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f  ( NEVER(p->readO
12810 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
12820 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
12830 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
12840 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12850 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
12860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12870 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
12880 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
12890 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
128a0 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  { .          /* 
128b0 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
128c0 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
128d0 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
128e0 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20  as successful . 
128f0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68           ** or h
12900 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20  it an 'OR FAIL' 
12910 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
12920 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65  here are no defe
12930 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20  rred foreign.   
12940 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f         ** key co
12950 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c  nstraints to hol
12960 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  d up the transac
12970 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73  tion. This means
12980 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20   a commit .     
12990 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
129a0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  red. */.        
129b0 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69    rc = vdbeCommi
129c0 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  t(db, p);.      
129d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
129e0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
129f0 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  && p->readOnly )
12a00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12a10 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
12a20 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
12a30 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
12a40 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12a50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12a60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
12a70 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
12a80 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
12a90 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
12aa0 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  OK);.          p
12ab0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
12ac0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12ad0 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
12ae0 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20  erredCons = 0;. 
12af0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
12b00 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
12b10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  0;.          db-
12b20 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
12b30 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20  E_DeferFKs;.    
12b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
12b50 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
12b60 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
12b70 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
12b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
12b90 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
12ba0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
12bb0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
12bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12bd0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
12be0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
12bf0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d  ( eStatementOp==
12c00 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
12c10 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12c20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
12c30 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
12c40 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
12c50 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
12c60 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65  ELEASE;.      }e
12c70 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
12c80 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
12c90 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
12ca0 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
12cb0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
12cc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12cd0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
12ce0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
12cf0 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
12d00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12d10 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
12d20 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
12d30 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
12d40 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  1;.        p->nC
12d50 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
12d60 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
12d70 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74  /* If eStatement
12d80 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  Op is non-zero, 
12d90 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  then a statement
12da0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
12db0 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
12dc0 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
12dd0 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73  led back. Call s
12de0 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
12df0 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20  tatement() to.  
12e00 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74    ** do so. If t
12e10 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65  his operation re
12e20 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20  turns an error, 
12e30 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
12e40 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  statement.    **
12e50 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
12e60 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49  QLITE_OK or SQLI
12e70 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74  TE_CONSTRAINT, t
12e80 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a  hen promote the.
12e90 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73      ** current s
12ea0 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63  tatement error c
12eb0 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ode..    */.    
12ec0 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
12ed0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
12ee0 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
12ef0 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61  tatement(p, eSta
12f00 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20  tementOp);.     
12f10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
12f20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
12f30 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72  LITE_OK || (p->r
12f40 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
12f50 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20  CONSTRAINT ){.  
12f60 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
12f70 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
12f80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12f90 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
12fa0 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
12fb0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
12fc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12fd0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
12fe0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
12ff0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
13000 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
13010 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
13020 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
13030 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
13040 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
13050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13060 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
13070 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
13080 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
13090 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
130a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
130b0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
130c0 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
130d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
130e0 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
130f0 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
13100 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
13110 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
13120 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
13130 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
13140 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
13150 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
13160 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
13170 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
13180 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
13190 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
131a0 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
131b0 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
131c0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  nge = 0;.    }..
131d0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
131e0 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
131f0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
13200 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  (p);.  }..  /* W
13210 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
13220 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
13230 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
13240 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
13250 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
13260 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56  =0 ){.    db->nV
13270 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20  dbeActive--;.   
13280 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
13290 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  y ) db->nVdbeWri
132a0 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  te--;.    if( p-
132b0 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d  >bIsReader ) db-
132c0 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20  >nVdbeRead--;.  
132d0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
132e0 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e  dbeActive>=db->n
132f0 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20  VdbeRead );.    
13300 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
13310 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65  eRead>=db->nVdbe
13320 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73  Write );.    ass
13330 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72  ert( db->nVdbeWr
13340 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ite>=0 );.  }.  
13350 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
13360 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
13370 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
13380 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  (db);.  if( p->d
13390 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
133a0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
133b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
133c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75  ..  /* If the au
133d0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
133e0 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74  s set to true, t
133f0 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68  hen any locks th
13400 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a  at were held.  *
13410 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * by connection 
13420 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  db have now been
13430 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20   released. Call 
13440 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
13450 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a  nUnlocked() .  *
13460 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20  * to invoke any 
13470 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d  required unlock-
13480 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
13490 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
134a0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
134b0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
134c0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29  tionUnlocked(db)
134d0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
134e0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
134f0 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
13500 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
13510 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
13520 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
13530 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
13540 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
13550 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
13560 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
13570 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
13580 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
13590 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
135a0 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
135b0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
135c0 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
135d0 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
135e0 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
135f0 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
13600 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
13610 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
13620 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
13630 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f  opy the error co
13640 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
13650 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  sage belonging t
13660 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65  o the VDBE passe
13670 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
13680 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  t argument to it
13690 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
136a0 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20  e (so that they 
136b0 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75  will be .** retu
136c0 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  rned by calls to
136d0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
136e0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65  () and sqlite3_e
136f0 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  rrmsg())..**.** 
13700 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
13710 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65  es not clear the
13720 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65   VDBE error code
13730 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73   or message, jus
13740 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d  t.** copies them
13750 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13760 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
13770 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
13780 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70  ferError(Vdbe *p
13790 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
137a0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
137b0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
137c0 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
137d0 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69      u8 mallocFai
137e0 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63  led = db->malloc
137f0 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69  Failed;.    sqli
13800 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
13810 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20  lloc();.    if( 
13820 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62  db->pErr==0 ) db
13830 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33  ->pErr = sqlite3
13840 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20  ValueNew(db);.  
13850 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
13860 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
13870 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
13880 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
13890 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
138a0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
138b0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
138c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
138d0 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  d = mallocFailed
138e0 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64  ;.    db->errCod
138f0 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b  e = rc;.  }else{
13900 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13910 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  r(db, rc);.  }. 
13920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
13930 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
13940 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
13950 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f   If an SQLITE_CO
13960 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b  NFIG_SQLLOG hook
13970 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61   is registered a
13980 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  nd the VM has be
13990 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f  en run, .** invo
139a0 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ke it..*/.static
139b0 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65   void vdbeInvoke
139c0 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b  Sqllog(Vdbe *v){
139d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
139e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
139f0 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c  og && v->rc==SQL
13a00 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71  ITE_OK && v->zSq
13a10 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b  l && v->pc>=0 ){
13a20 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61  .    char *zExpa
13a30 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64  nded = sqlite3Vd
13a40 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76  beExpandSql(v, v
13a50 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73  ->zSql);.    ass
13a60 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74  ert( v->db->init
13a70 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
13a80 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b  if( zExpanded ){
13a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
13aa0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
13ab0 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71  og(.          sq
13ac0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
13ad0 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d  g.pSqllogArg, v-
13ae0 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20  >db, zExpanded, 
13af0 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  1.      );.     
13b00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
13b10 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29  ->db, zExpanded)
13b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
13b30 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
13b40 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29  eInvokeSqllog(x)
13b50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
13b60 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
13b70 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
13b80 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
13b90 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
13ba0 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
13bb0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
13bc0 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
13bd0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
13be0 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
13bf0 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
13c00 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
13c10 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
13c20 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
13c30 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
13c40 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
13c50 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
13c60 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
13c70 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
13c80 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
13c90 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
13ca0 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
13cb0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
13cc0 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
13cd0 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
13ce0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
13cf0 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
13d00 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
13d10 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
13d20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
13d30 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
13d40 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
13d50 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
13d60 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
13d70 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
13d80 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
13d90 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
13da0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
13db0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
13dc0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
13dd0 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
13de0 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
13df0 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
13e00 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
13e10 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
13e20 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
13e30 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
13e40 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
13e50 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
13e60 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
13e70 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
13e80 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
13e90 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
13ea0 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
13eb0 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
13ec0 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
13ed0 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
13ee0 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
13ef0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
13f00 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65  c>=0 ){.    vdbe
13f10 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b  InvokeSqllog(p);
13f20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13f30 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29  TransferError(p)
13f40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
13f50 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
13f60 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
13f70 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Msg = 0;.    if(
13f80 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
13f90 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
13fa0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
13fb0 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
13fc0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
13fd0 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
13fe0 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
13ff0 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
14000 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
14010 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
14020 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
14030 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
14040 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
14050 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
14060 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
14070 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
14080 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
14090 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
140a0 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63  ithMsg(db, p->rc
140b0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22  , p->zErrMsg ? "
140c0 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72  %s" : 0, p->zErr
140d0 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
140e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
140f0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
14100 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
14110 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
14120 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
14130 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
14140 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20    Cleanup(p);.. 
14150 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
14160 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
14170 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
14180 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
14190 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
141a0 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
141b0 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
141c0 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
141d0 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
141e0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
141f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
14200 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
14210 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
14220 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14230 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
14240 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
14250 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
14260 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
14270 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
14280 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
14290 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70         char c, p
142a0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  c = 0;.        f
142b0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
142c0 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ");.        for(
142d0 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71  i=0; (c = p->zSq
142e0 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  l[i])!=0; i++){.
142f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63            if( pc
14300 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66  =='\n' ) fprintf
14310 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
14320 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20          putc(c, 
14330 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
14340 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  pc = c;.        
14350 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  }.        if( pc
14360 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66  !='\n' ) fprintf
14370 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
14380 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
14390 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
143a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
143b0 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20   zHdr[100];.    
143c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
143d0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72  intf(sizeof(zHdr
143e0 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31  ), zHdr, "%6u %1
143f0 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20  2llu %8llu ",.  
14400 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
14410 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20  i].cnt,.        
14420 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
14430 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  les,.           
14440 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20  p->aOp[i].cnt>0 
14450 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c  ? p->aOp[i].cycl
14460 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74  es/p->aOp[i].cnt
14470 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a   : 0.        );.
14480 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
14490 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29  out, "%s", zHdr)
144a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
144b0 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74  3VdbePrintOp(out
144c0 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
144d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
144e0 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20  fclose(out);.   
144f0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
14500 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20  p->iCurrentTime 
14510 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  = 0;.  p->magic 
14520 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  = VDBE_MAGIC_INI
14530 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  T;.  return p->r
14540 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  c & db->errMask;
14550 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  .}. ./*.** Clean
14560 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61   up and delete a
14570 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
14580 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ution.  Return a
14590 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
145a0 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  is.** the result
145b0 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e   code.  Write an
145c0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
145d0 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72  text into *pzErr
145e0 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
145f0 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
14600 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
14610 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14620 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
14630 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
14640 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
14650 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
14660 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
14670 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20  dbeReset(p);.   
14680 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70   assert( (rc & p
14690 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d  ->db->errMask)==
146a0 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rc );.  }.  sqli
146b0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
146c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
146d0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ../*.** If param
146e0 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73  eter iOp is less
146f0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
14700 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   invoke the dest
14710 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c  ructor for.** al
14720 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  l auxiliary data
14730 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e   pointers curren
14740 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68  tly cached by th
14750 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a  e VM passed as.*
14760 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
14770 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ment..**.** Or, 
14780 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65  if iOp is greate
14790 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
147a0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
147b0 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  e destructor is.
147c0 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  ** only invoked 
147d0 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69  for those auxili
147e0 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
147f0 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  s created by the
14800 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69   user .** functi
14810 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  on invoked by th
14820 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70  e OP_Function op
14830 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74  code at instruct
14840 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56  ion iOp of .** V
14850 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c  M pVdbe, and onl
14860 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  y then if:.**.**
14870 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69      * the associ
14880 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61  ated function pa
14890 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33  rameter is the 3
148a0 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f  2nd or later (co
148b0 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66  unting.**      f
148c0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
148d0 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20  t), or.**.**    
148e0 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
148f0 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d  ing bit in argum
14900 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61  ent mask is clea
14910 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72  r (where the fir
14920 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74  st.**      funct
14930 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ion parameter co
14940 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74  rresponds to bit
14950 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69   0 etc.)..*/.voi
14960 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
14970 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 20  eteAuxData(Vdbe 
14980 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c  *pVdbe, int iOp,
14990 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75   int mask){.  Au
149a0 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56  xData **pp = &pV
149b0 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20  dbe->pAuxData;. 
149c0 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20   while( *pp ){. 
149d0 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78     AuxData *pAux
149e0 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20   = *pp;.    if( 
149f0 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20  (iOp<0).     || 
14a00 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20  (pAux->iOp==iOp 
14a10 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33  && (pAux->iArg>3
14a20 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41  1 || !(mask & MA
14a30 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41  SKBIT32(pAux->iA
14a40 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20  rg)))).    ){.  
14a50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
14a60 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a  ux->iArg==31 );.
14a70 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
14a80 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
14a90 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
14aa0 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
14ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
14ac0 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20  = pAux->pNext;. 
14ad0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
14ae0 65 65 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41  ee(pVdbe->db, pA
14af0 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ux);.    }else{.
14b00 20 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d        pp= &pAux-
14b10 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
14b20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
14b30 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
14b40 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
14b50 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
14b60 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14b70 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72  t,.** except for
14b80 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20   object itself, 
14b90 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76  which is preserv
14ba0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ed..**.** The di
14bb0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
14bc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
14bd0 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nd sqlite3VdbeDe
14be0 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a  lete() is that.*
14bf0 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61  * VdbeDelete() a
14c00 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20  lso unlinks the 
14c10 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  Vdbe from the li
14c20 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69  st of VMs associ
14c30 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
14c40 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14c50 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74  tion and frees t
14c60 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  he object itself
14c70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14c80 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
14c90 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
14ca0 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f  be *p){.  SubPro
14cb0 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65  gram *pSub, *pNe
14cc0 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  xt;.  int i;.  a
14cd0 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20  ssert( p->db==0 
14ce0 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a  || p->db==db );.
14cf0 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
14d00 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56  y(p->aVar, p->nV
14d10 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65  ar);.  releaseMe
14d20 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
14d30 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
14d40 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
14d50 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f  for(pSub=p->pPro
14d60 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62  gram; pSub; pSub
14d70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
14d80 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74  xt = pSub->pNext
14d90 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70  ;.    vdbeFreeOp
14da0 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e  Array(db, pSub->
14db0 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b  aOp, pSub->nOp);
14dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
14dd0 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20  ee(db, pSub);.  
14de0 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56  }.  for(i=p->nzV
14df0 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ar-1; i>=0; i--)
14e00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14e10 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b  b, p->azVar[i]);
14e20 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
14e30 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
14e40 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
14e50 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
14e60 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
14e70 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14e80 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >zSql);.  sqlite
14e90 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
14ea0 46 72 65 65 29 3b 0a 23 69 66 64 65 66 20 53 51  Free);.#ifdef SQ
14eb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
14ec0 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 66 6f  _SCANSTATUS.  fo
14ed0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61  r(i=0; i<p->nSca
14ee0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  n; i++){.    sql
14ef0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
14f00 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65  ->aScan[i].zName
14f10 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14f20 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53  DbFree(db, p->aS
14f30 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  can);.#endif.}..
14f40 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
14f50 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
14f60 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
14f70 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
14f80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
14f90 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
14fa0 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
14fb0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
14fc0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14fd0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
14fe0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  x) );.  sqlite3V
14ff0 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64  dbeClearObject(d
15000 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  b, p);.  if( p->
15010 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
15020 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
15030 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
15040 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
15050 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20  ->pVdbe==p );.  
15060 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d    db->pVdbe = p-
15070 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
15080 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
15090 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
150a0 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
150b0 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
150c0 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
150d0 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73    p->db = 0;.  s
150e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
150f0 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   p);.}../*.** Th
15100 65 20 63 75 72 73 6f 72 20 22 70 22 20 68 61 73  e cursor "p" has
15110 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20   a pending seek 
15120 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68  operation that h
15130 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
15140 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20  ** carried out. 
15150 20 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72   Seek the cursor
15160 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72   now.  If an err
15170 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
15180 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72  n.** the appropr
15190 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
151a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
151b0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
151c0 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76  andleDeferredMov
151d0 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
151e0 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72  p){.  int res, r
151f0 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
15200 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69  _TEST.  extern i
15210 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  nt sqlite3_searc
15220 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a  h_count;.#endif.
15230 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66    assert( p->def
15240 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20  erredMoveto );. 
15250 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61   assert( p->isTa
15260 62 6c 65 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ble );.  rc = sq
15270 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
15280 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75 72  Unpacked(p->pCur
15290 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74  sor, 0, p->movet
152a0 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73  oTarget, 0, &res
152b0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
152c0 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 72  turn rc;.  if( r
152d0 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53  es!=0 ) return S
152e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
152f0 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  PT;.#ifdef SQLIT
15300 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
15310 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
15320 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66  .#endif.  p->def
15330 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
15340 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75  .  p->cacheStatu
15350 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
15360 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15370 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f  _OK;.}../*.** So
15380 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76 65  mething has move
15390 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75 74  d cursor "p" out
153a0 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79 62   of place.  Mayb
153b0 65 20 74 68 65 20 72 6f 77 20 69 74 20 77 61 73  e the row it was
153c0 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 77  .** pointed to w
153d0 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  as deleted out f
153e0 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20 4f  rom under it.  O
153f0 72 20 6d 61 79 62 65 20 74 68 65 20 62 74 72 65  r maybe the btre
15400 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e  e was.** rebalan
15410 63 65 64 2e 20 20 57 68 61 74 65 76 65 72 20 74  ced.  Whatever t
15420 68 65 20 63 61 75 73 65 2c 20 74 72 79 20 74 6f  he cause, try to
15430 20 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f 20   restore "p" to 
15440 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20  the place it.** 
15450 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 62  is supposed to b
15460 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20  e pointing.  If 
15470 74 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c 65  the row was dele
15480 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
15490 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  er the.** cursor
154a0 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f 72  , set the cursor
154b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e   to point to a N
154c0 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  ULL row..*/.stat
154d0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
154e0 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76  INLINE handleMov
154f0 65 64 43 75 72 73 6f 72 28 56 64 62 65 43 75 72  edCursor(VdbeCur
15500 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  sor *p){.  int i
15510 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20 72  sDifferentRow, r
15520 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  c;.  assert( p->
15530 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
15540 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
15550 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
15560 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  ed(p->pCursor) )
15570 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
15580 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
15590 72 65 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26  re(p->pCursor, &
155a0 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b  isDifferentRow);
155b0 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75  .  p->cacheStatu
155c0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
155d0 0a 20 20 69 66 28 20 69 73 44 69 66 66 65 72 65  .  if( isDiffere
155e0 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52  ntRow ) p->nullR
155f0 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  ow = 1;.  return
15600 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
15610 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68  eck to ensure th
15620 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
15630 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f 72 65   valid.  Restore
15640 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   the cursor.** i
15650 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65 74 75  f need be.  Retu
15660 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72  rn any I/O error
15670 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74 6f 72   from the restor
15680 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
15690 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
156a0 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56 64 62  ursorRestore(Vdb
156b0 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
156c0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  f( sqlite3BtreeC
156d0 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
156e0 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >pCursor) ){.   
156f0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
15700 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
15710 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
15720 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
15730 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
15740 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74  sor p is ready t
15750 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
15760 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68  the row to which
15770 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
15780 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74  positioned.  Ret
15790 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
157a0 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  e if an OOM faul
157b0 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a  t or I/O error.*
157c0 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  * prevents us fr
157d0 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74  om positioning t
157e0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73  he cursor to its
157f0 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f   correct positio
15800 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f  n..**.** If a Mo
15810 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69  veTo operation i
15820 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  s pending on the
15830 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74   given cursor, t
15840 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d  hen do that.** M
15850 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e  oveTo now.  If n
15860 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e  o move is pendin
15870 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  g, check to see 
15880 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62  if the row has b
15890 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f  een.** deleted o
158a0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
158b0 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20  e cursor and if 
158c0 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65  it has, mark the
158d0 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c   row as.** a NUL
158e0 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  L row..**.** If 
158f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
15900 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
15910 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f  o the correct ro
15920 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68  w and that row h
15930 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64  as.** not been d
15940 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
15950 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
15960 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
15970 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
15980 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15990 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56  beCursorMoveto(V
159a0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
159b0 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
159c0 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 72 65  Moveto ){.    re
159d0 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72  turn handleDefer
159e0 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20  redMoveto(p);.  
159f0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 43 75 72 73  }.  if( p->pCurs
15a00 6f 72 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  or && sqlite3Btr
15a10 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
15a20 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a  (p->pCursor) ){.
15a30 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
15a40 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b  eMovedCursor(p);
15a50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
15a60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15a70 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
15a80 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
15a90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15aa0 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69  alType().** sqli
15ab0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
15ac0 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  eLen().** sqlite
15ad0 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29  3VdbeSerialLen()
15ae0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
15af0 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71  erialPut().** sq
15b00 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
15b10 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  et().**.** encap
15b20 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
15b30 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
15b40 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
15b50 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
15b60 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
15b70 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
15b80 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
15b90 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
15ba0 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
15bb0 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
15bc0 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
15bd0 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
15be0 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
15bf0 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
15c00 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
15c10 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
15c20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
15c30 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
15c40 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
15c50 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
15c60 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
15c70 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
15c80 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
15c90 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
15ca0 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
15cb0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
15cc0 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
15cd0 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
15ce0 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
15cf0 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
15d00 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
15d10 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
15d20 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
15d30 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
15d40 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  ob separately..*
15d50 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
15d60 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
15d70 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
15d80 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
15d90 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
15da0 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
15db0 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
15dc0 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
15dd0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
15de0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
15df0 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
15e00 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
15e30 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31    NULL.**      1
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
15e60 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
15e70 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20  .**      2      
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
15e90 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
15ea0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
15eb0 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
15ec0 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20           3      
15ed0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
15ee0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20  eger.**      4  
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
15f10 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
15f20 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20  *      5        
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20               6  
15f40 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
15f50 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
15f60 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20   6              
15f70 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
15f80 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
15f90 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20  er.**      7    
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fb0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45   8            IE
15fc0 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20  EE float.**     
15fd0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20   8              
15fe0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
15ff0 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
16000 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39  tant 0.**      9
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
16030 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
16040 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31  nt 1.**     10,1
16050 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16070 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
16080 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
16090 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
160a0 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
160b0 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
160c0 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
160d0 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
160e0 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65    text.**.** The
160f0 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77   8 and 9 types w
16100 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33  ere added in 3.3
16110 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  .0, file format 
16120 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f  4.  Prior versio
16130 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
16140 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74  will not underst
16150 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c  and those serial
16160 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   types..*/../*.*
16170 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72  * Return the ser
16180 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65  ial-type for the
16190 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
161a0 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71   pMem..*/.u32 sq
161b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
161c0 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  ype(Mem *pMem, i
161d0 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
161e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
161f0 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33  Mem->flags;.  u3
16200 32 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67  2 n;..  if( flag
16210 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
16220 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
16230 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
16240 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  Int ){.    /* Fi
16250 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72  gure out whether
16260 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c   to use 1, 2, 4,
16270 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a   6 or 8 bytes. *
16280 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  /.#   define MAX
16290 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30  _6BYTE ((((i64)0
162a0 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d  x00008000)<<32)-
162b0 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70  1).    i64 i = p
162c0 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36  Mem->u.i;.    u6
162d0 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30  4 u;.    if( i<0
162e0 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e 69   ){.      u = ~i
162f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16300 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a     u = i;.    }.
16310 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
16320 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  {.      return (
16330 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65  (i&1)==i && file
16340 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b  _format>=4) ? 8+
16350 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 20  (u32)u : 1;.    
16360 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  }.    if( u<=327
16370 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20  67 ) return 2;. 
16380 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30     if( u<=838860
16390 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  7 ) return 3;.  
163a0 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
163b0 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  647 ) return 4;.
163c0 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
163d0 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b  BYTE ) return 5;
163e0 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20  .    return 6;. 
163f0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
16400 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72  EM_Real ){.    r
16410 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
16420 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
16430 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
16440 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
16450 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61  MEM_Blob) );.  a
16460 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d  ssert( pMem->n>=
16470 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29  0 );.  n = (u32)
16480 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
16490 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
164a0 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
164b0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20  ->u.nZero;.  }. 
164c0 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
164d0 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
164e0 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
164f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16500 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
16510 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
16520 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
16530 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
16540 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
16550 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
16560 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
16570 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
16580 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65  pe>=12 ){.    re
16590 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
165a0 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
165b0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
165c0 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20  st u8 aSize[] = 
165d0 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c  { 0, 1, 2, 3, 4,
165e0 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20   6, 8, 8, 0, 0, 
165f0 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75  0, 0 };.    retu
16600 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f  rn aSize[serial_
16610 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  type];.  }.}../*
16620 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
16630 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
16640 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
16650 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
16660 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
16670 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
16680 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
16690 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
166a0 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
166b0 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
166c0 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
166d0 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
166e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
166f0 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
16700 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
16710 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
16720 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
16730 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
16740 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
16750 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
16760 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
16770 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
16780 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
16790 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
167a0 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
167b0 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
167c0 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
167d0 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
167e0 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
167f0 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
16800 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
16810 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
16820 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
16830 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
16840 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
16850 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
16860 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
16870 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
16880 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
16890 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
168a0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
168b0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
168c0 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
168d0 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
168e0 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
168f0 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
16900 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
16910 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
16920 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
16930 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
16940 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
16950 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
16960 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
16970 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
16980 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
16990 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
169a0 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
169b0 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
169c0 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
169d0 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
169e0 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
169f0 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
16a00 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
16a10 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
16a20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
16a30 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
16a40 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
16a50 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
16a60 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
16a70 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
16a80 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
16a90 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
16aa0 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
16ab0 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
16ac0 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
16ad0 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
16ae0 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
16af0 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
16b00 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
16b10 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
16b20 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
16b30 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
16b40 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
16b50 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
16b60 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
16b70 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
16b80 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
16b90 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
16ba0 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
16bb0 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
16bc0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
16bd0 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
16be0 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
16bf0 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
16c00 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
16c10 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
16c20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
16c30 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
16c40 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
16c50 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
16c60 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
16c70 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
16c80 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
16c90 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
16ca0 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
16cb0 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
16cc0 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
16cd0 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
16ce0 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
16cf0 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
16d00 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
16d10 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
16d20 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
16d30 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
16d40 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
16d50 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
16d60 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
16d70 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
16d80 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
16d90 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
16da0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
16db0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
16dc0 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
16dd0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
16de0 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
16df0 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
16e00 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
16e10 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
16e20 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
16e30 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
16e40 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
16e50 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
16e60 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
16e70 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
16e80 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
16e90 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
16ea0 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
16eb0 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72  f[].  The caller
16ec0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a   is responsible.
16ed0 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e  ** for allocatin
16ee0 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  g enough space t
16ef0 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20  o buf[] to hold 
16f00 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
16f10 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f  , exclusive.** o
16f20 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  f the pMem->u.nZ
16f30 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20  ero bytes for a 
16f40 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a  MEM_Zero value..
16f50 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
16f60 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
16f70 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
16f80 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54  n into buf[].  T
16f90 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
16fa0 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72  bytes in the zer
16fb0 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73  o-filled tail is
16fc0 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
16fd0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e   return value on
16fe0 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62  ly.** if those b
16ff0 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64  ytes were zeroed
17000 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75   in buf[]..*/ .u
17010 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
17020 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c  rialPut(u8 *buf,
17030 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20   Mem *pMem, u32 
17040 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
17050 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49  u32 len;..  /* I
17060 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20  nteger and Real 
17070 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
17080 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61  type<=7 && seria
17090 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20  l_type>0 ){.    
170a0 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69  u64 v;.    u32 i
170b0 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c  ;.    if( serial
170c0 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
170d0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
170e0 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d  (v)==sizeof(pMem
170f0 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20  ->u.r) );.      
17100 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d  memcpy(&v, &pMem
17110 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29  ->u.r, sizeof(v)
17120 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
17130 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
17140 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17150 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
17160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
17170 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62  = i = sqlite3Vdb
17180 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
17190 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
171a0 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
171b0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75      do{.      bu
171c0 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26  f[--i] = (u8)(v&
171d0 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e  0xFF);.      v >
171e0 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65  >= 8;.    }while
171f0 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ( i );.    retur
17200 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
17210 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   String or blob 
17220 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
17230 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
17240 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20  assert( pMem->n 
17250 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  + ((pMem->flags 
17260 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d  & MEM_Zero)?pMem
17270 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20  ->u.nZero:0).   
17280 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e            == (in
17290 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t)sqlite3VdbeSer
172a0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
172b0 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c  l_type) );.    l
172c0 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  en = pMem->n;.  
172d0 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
172e0 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
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 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
17310 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
17320 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
17330 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69  ../* Input "x" i
17340 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  s a sequence of 
17350 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63 74  unsigned charact
17360 65 72 73 20 74 68 61 74 20 72 65 70 72 65 73 65  ers that represe
17370 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69  nt a.** big-endi
17380 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74  an integer.  Ret
17390 75 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65  urn the equivale
173a0 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65  nt native intege
173b0 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45  r.*/.#define ONE
173c0 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20  _BYTE_INT(x)    
173d0 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65  ((i8)(x)[0]).#de
173e0 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e  fine TWO_BYTE_IN
173f0 54 28 78 29 20 20 20 20 28 32 35 36 2a 28 69 38  T(x)    (256*(i8
17400 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d  )((x)[0])|(x)[1]
17410 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f  ).#define THREE_
17420 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35  BYTE_INT(x)  (65
17430 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  536*(i8)((x)[0])
17440 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29  |((x)[1]<<8)|(x)
17450 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55  [2]).#define FOU
17460 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20  R_BYTE_UINT(x)  
17470 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32  (((u32)(x)[0]<<2
17480 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c  4)|((x)[1]<<16)|
17490 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[2]<<8)|(x)[
174a0 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52  3]).#define FOUR
174b0 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36  _BYTE_INT(x) (16
174c0 37 37 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b  777216*(i8)((x)[
174d0 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29  0])|((x)[1]<<16)
174e0 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29  |((x)[2]<<8)|(x)
174f0 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  [3])../*.** Dese
17500 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
17510 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
17520 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
17530 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
17540 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
17550 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
17560 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
17570 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
17580 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
17590 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
175a0 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20  lemented as two 
175b0 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65  separate routine
175c0 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63  s for performanc
175d0 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61  e..** The few ca
175e0 73 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65  ses that require
175f0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
17600 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20   are broken out 
17610 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a  into a separate.
17620 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68  ** routine so th
17630 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73  at in most cases
17640 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
17650 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63   moving the stac
17660 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20  k pointer.** is 
17670 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61  avoided..*/ .sta
17680 74 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e  tic u32 SQLITE_N
17690 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65  OINLINE serialGe
176a0 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t(.  const unsig
176b0 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20  ned char *buf,  
176c0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
176d0 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d  deserialize from
176e0 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
176f0 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  _type,          
17700 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
17710 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  pe to deserializ
17720 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17740 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
17750 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c  ell to write val
17760 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ue into */.){.  
17770 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54  u64 x = FOUR_BYT
17780 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75  E_UINT(buf);.  u
17790 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45  32 y = FOUR_BYTE
177a0 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20  _UINT(buf+4);.  
177b0 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b  x = (x<<32) + y;
177c0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
177d0 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==6 ){.    /* 
177e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
177f0 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65  9851-52272 Value
17800 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
17810 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74   64-bit.    ** t
17820 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
17830 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70  nteger. */.    p
17840 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
17850 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  *)&x;.    pMem->
17860 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
17870 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
17880 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
17890 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56  }else{.    /* EV
178a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33  IDENCE-OF: R-573
178b0 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69  43-49114 Value i
178c0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49  s a big-endian I
178d0 45 45 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d  EEE 754-2008 64-
178e0 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74  bit.    ** float
178f0 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72  ing point number
17900 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  . */.#if !define
17910 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
17920 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
17930 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
17940 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ).    /* Verify 
17950 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
17960 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
17970 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
17980 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65  same.    ** byte
17990 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61   order.  Or, tha
179a0 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  t if SQLITE_MIXE
179b0 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
179c0 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64  LOAT is.    ** d
179d0 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62  efined that 64-b
179e0 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  it floating poin
179f0 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20  t values really 
17a00 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a  are mixed.    **
17a10 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a   endian..    */.
17a20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
17a30 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
17a40 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
17a50 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
17a60 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
17a70 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20  0;.    u64 t2 = 
17a80 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65  t1;.    swapMixe
17a90 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
17aa0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
17ab0 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66  zeof(r1)==sizeof
17ac0 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26  (t2) && memcmp(&
17ad0 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28  r1, &t2, sizeof(
17ae0 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  r1))==0 );.#endi
17af0 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  f.    assert( si
17b00 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
17b10 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d  zeof(pMem->u.r)=
17b20 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69  =8 );.    swapMi
17b30 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78  xedEndianFloat(x
17b40 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
17b50 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69  Mem->u.r, &x, si
17b60 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d  zeof(x));.    pM
17b70 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69  em->flags = sqli
17b80 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75  te3IsNaN(pMem->u
17b90 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a  .r) ? MEM_Null :
17ba0 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20   MEM_Real;.  }. 
17bb0 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32   return 8;.}.u32
17bc0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17bd0 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
17be0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
17bf0 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
17c00 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
17c10 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
17c20 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
17c30 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
17c40 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
17c50 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
17c60 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
17c70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
17c80 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
17c90 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
17ca0 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  {.  switch( seri
17cb0 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
17cc0 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73  ase 10:   /* Res
17cd0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
17ce0 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
17cf0 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   11:   /* Reserv
17d00 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
17d10 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a  e */.    case 0:
17d20 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20   {  /* Null */. 
17d30 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
17d40 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33  -OF: R-24078-093
17d50 37 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55  75 Value is a NU
17d60 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  LL. */.      pMe
17d70 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
17d80 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
17d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17da0 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45   1: {.      /* E
17db0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
17dc0 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20  885-25196 Value 
17dd0 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73  is an 8-bit twos
17de0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20  -complement.    
17df0 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f    ** integer. */
17e00 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
17e10 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
17e20 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
17e30 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
17e40 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
17e50 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
17e60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
17e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17e80 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
17e90 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
17ea0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
17eb0 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d  NCE-OF: R-49794-
17ec0 33 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61  35026 Value is a
17ed0 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62   big-endian 16-b
17ee0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
17ef0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
17f00 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
17f10 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59  em->u.i = TWO_BY
17f20 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
17f30 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
17f40 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
17f50 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
17f60 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
17f70 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
17f80 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
17f90 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
17fa0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
17fb0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17fc0 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c  -37839-54301 Val
17fd0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
17fe0 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20  an 24-bit.      
17ff0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
18000 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
18010 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
18020 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
18030 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
18040 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
18050 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
18060 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
18070 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
18080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18090 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
180a0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
180b0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
180c0 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d  NCE-OF: R-01849-
180d0 32 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61  26079 Value is a
180e0 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62   big-endian 32-b
180f0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
18100 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
18110 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
18120 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
18130 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
18140 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
18150 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
18160 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
18170 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
18180 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
18190 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
181a0 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
181b0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
181c0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
181d0 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 61  R-50385-09674 Va
181e0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
181f0 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20  ian 48-bit.     
18200 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
18210 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
18220 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
18230 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
18240 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34  (buf+2) + (((i64
18250 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
18260 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
18270 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
18280 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
18290 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
182a0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
182b0 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
182c0 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
182d0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
182e0 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
182f0 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
18300 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
18310 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75        /* These u
18320 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  se local variabl
18330 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69  es, so do them i
18340 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75  n a separate rou
18350 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  tine.      ** to
18360 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f   avoid having to
18370 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20   move the frame 
18380 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63  pointer in the c
18390 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
183a0 20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61      return seria
183b0 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f  lGet(buf,serial_
183c0 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20  type,pMem);.    
183d0 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
183e0 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
183f0 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
18400 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
18410 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
18420 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32  E-OF: R-12976-22
18430 38 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 65  893 Value is the
18440 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20   integer 0. */. 
18450 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
18460 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31  -OF: R-18143-121
18470 32 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 20  21 Value is the 
18480 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20  integer 1. */.  
18490 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
184a0 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
184b0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
184c0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
184d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
184e0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
184f0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
18500 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33  CE-OF: R-14606-3
18510 31 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 20  1564 Value is a 
18520 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d  BLOB that is (N-
18530 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20  12)/2 bytes in. 
18540 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a       ** length..
18550 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
18560 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30  E-OF: R-28401-00
18570 31 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 73  140 Value is a s
18580 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78  tring in the tex
18590 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20  t encoding and. 
185a0 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32       ** (N-13)/2
185b0 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
185c0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  . */.      stati
185d0 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61  c const u16 aFla
185e0 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62  g[] = { MEM_Blob
185f0 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f  |MEM_Ephem, MEM_
18600 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b  Str|MEM_Ephem };
18610 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
18620 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
18630 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73      pMem->n = (s
18640 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
18650 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
18660 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69  ags = aFlag[seri
18670 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20  al_type&1];.    
18680 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e    return pMem->n
18690 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
186a0 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  turn 0;.}./*.** 
186b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
186c0 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
186d0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
186e0 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65  e for an Unpacke
186f0 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
18700 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67  ture large enoug
18710 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  h to be used wit
18720 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  h sqlite3VdbeRec
18730 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a  ordUnpack() if.*
18740 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
18750 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
18760 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72  r to KeyInfo str
18770 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e  ucture pKeyInfo.
18780 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65  .**.** The space
18790 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63   is either alloc
187a0 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ated using sqlit
187b0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20  e3DbMallocRaw() 
187c0 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a  or from within.*
187d0 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20  * the unaligned 
187e0 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69  buffer passed vi
187f0 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64  a the second and
18800 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73   third arguments
18810 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20   (presumably.** 
18820 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66  stack space). If
18830 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65   the former, the
18840 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  n *ppFree is set
18850 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68   to a pointer th
18860 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
18870 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
18880 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
18890 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
188a0 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  ee(). Or, if the
188b0 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   .** allocation 
188c0 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70  comes from the p
188d0 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75  Space/szSpace bu
188e0 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73  ffer, *ppFree is
188f0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
18900 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
18910 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
18920 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
18930 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
18940 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63  ..*/.UnpackedRec
18950 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65  ord *sqlite3Vdbe
18960 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
18970 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ord(.  KeyInfo *
18980 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
18990 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69         /* Descri
189a0 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63  ption of the rec
189b0 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ord */.  char *p
189c0 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
189d0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c           /* Unal
189e0 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69  igned space avai
189f0 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  lable */.  int s
18a00 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  zSpace,         
18a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
18a20 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69  ze of pSpace[] i
18a30 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
18a40 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20  r **ppFree      
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18a60 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75  OUT: Caller shou
18a70 6c 64 20 66 72 65 65 20 74 68 69 73 20 70 6f 69  ld free this poi
18a80 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70  nter */.){.  Unp
18a90 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20  ackedRecord *p; 
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ab0 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  Unpacked record 
18ac0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
18ad0 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20  nt nOff;        
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18af0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61  * Increment pSpa
18b00 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c  ce by nOff to al
18b10 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20  ign it */.  int 
18b20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
18b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18b40 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
18b50 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a  equired for *p *
18b60 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20  /..  /* We want 
18b70 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69  to shift the poi
18b80 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73  nter pSpace up s
18b90 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38  uch that it is 8
18ba0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20  -byte aligned.. 
18bb0 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65   ** Thus, we nee
18bc0 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61  d to calculate a
18bd0 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65   value, nOff, be
18be0 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74  tween 0 and 7, t
18bf0 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74  o shift .  ** it
18c00 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20   by.  If pSpace 
18c10 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74  is already 8-byt
18c20 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20  e aligned, nOff 
18c30 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a  should be zero..
18c40 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38    */.  nOff = (8
18c50 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54   - (SQLITE_PTR_T
18c60 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20  O_INT(pSpace) & 
18c70 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65  7)) & 7;.  nByte
18c80 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
18c90 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
18ca0 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
18cb0 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  (pKeyInfo->nFiel
18cc0 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  d+1);.  if( nByt
18cd0 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29  e>szSpace+nOff )
18ce0 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63  {.    p = (Unpac
18cf0 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69  kedRecord *)sqli
18d00 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
18d10 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79  KeyInfo->db, nBy
18d20 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65  te);.    *ppFree
18d30 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20   = (char *)p;.  
18d40 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
18d50 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
18d60 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
18d70 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e  ecord*)&pSpace[n
18d80 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65  Off];.    *ppFre
18d90 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d  e = 0;.  }..  p-
18da0 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28  >aMem = (Mem*)&(
18db0 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38  (char*)p)[ROUND8
18dc0 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
18dd0 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73  Record))];.  ass
18de0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
18df0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
18e00 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20    p->pKeyInfo = 
18e10 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e  pKeyInfo;.  p->n
18e20 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
18e30 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20  ->nField + 1;.  
18e40 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
18e50 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65  ** Given the nKe
18e60 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20  y-byte encoding 
18e70 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70  of a record in p
18e80 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20  Key[], populate 
18e90 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64  the .** Unpacked
18ea0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
18eb0 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
18ec0 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e  e fourth argumen
18ed0 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f  t with the.** co
18ee0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65  ntents of the de
18ef0 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f  coded record..*/
18f00 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64   .void sqlite3Vd
18f10 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a  beRecordUnpack(.
18f20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18f30 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f  nfo,     /* Info
18f40 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
18f50 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20  e record format 
18f60 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20  */.  int nKey,  
18f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18f80 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72  ize of the binar
18f90 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  y record */.  co
18fa0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
18fb0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61       /* The bina
18fc0 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55  ry record */.  U
18fd0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
18fe0 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
18ff0 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
19000 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
19010 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  g. */.){.  const
19020 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19030 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
19040 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
19050 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20  ey;.  int d; .  
19060 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20  u32 idx;        
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19080 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65  /* Offset in aKe
19090 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  y[] to read from
190a0 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20   */.  u16 u;    
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
190d0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
190e0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
190f0 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e   Mem *pMem = p->
19100 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61  aMem;..  p->defa
19110 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73  ult_rc = 0;.  as
19120 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
19130 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
19140 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
19150 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
19160 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
19170 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
19180 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
19190 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  & d<=nKey ){.   
191a0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
191b0 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
191c0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
191d0 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
191e0 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
191f0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
19200 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
19210 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
19220 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61      /* pMem->fla
19230 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74  gs = 0; // sqlit
19240 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
19250 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20  ) will set this 
19260 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d  for us */.    pM
19270 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em->szMalloc = 0
19280 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
19290 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
192a0 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
192b0 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
192c0 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66    pMem++;.    if
192d0 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65  ( (++u)>=p->nFie
192e0 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ld ) break;.  }.
192f0 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65    assert( u<=pKe
19300 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
19310 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  1 );.  p->nField
19320 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c   = u;.}..#if SQL
19330 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
19340 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
19350 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78  mpares two index
19360 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64   or table record
19370 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d   keys in the sam
19380 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20  e way.** as the 
19390 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
193a0 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69  dCompare() routi
193b0 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52  ne. Unlike VdbeR
193c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a  ecordCompare(),.
193d0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
193e0 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e   deserializes an
193f0 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65  d compares value
19400 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73  s using the.** s
19410 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
19420 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Get() and sqlite
19430 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75  3MemCompare() fu
19440 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75  nctions. It is u
19450 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  sed.** in assert
19460 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
19470 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
19480 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20   optimized code 
19490 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  in.** sqlite3Vdb
194a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
194b0 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73   returns results
194c0 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20   with these two 
194d0 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a  primitives..**.*
194e0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
194f0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
19500 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75  omparison is equ
19510 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72  ivalent to desir
19520 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74  edResult..** Ret
19530 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65  urn false if the
19540 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65  re is a disagree
19550 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
19560 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
19570 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e  mpareDebug(.  in
19580 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
19590 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
195a0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  eft key */.  con
195b0 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  st UnpackedRecor
195c0 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69  d *pPKey2, /* Ri
195d0 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
195e0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20   desiredResult  
195f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
19600 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a  rrect answer */.
19610 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
19620 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
19630 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
19640 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
19650 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
19660 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
19670 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
19680 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
19690 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
196a0 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
196b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
196c0 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
196d0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
196e0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
196f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
19700 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
19710 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19720 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
19730 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
19740 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
19750 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
19760 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  KeyInfo;.  if( p
19770 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29  KeyInfo->db==0 )
19780 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
19790 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
197a0 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
197b0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
197c0 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73  .  /* mem1.flags
197d0 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62   = 0;  // Will b
197e0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
197f0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19800 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41  alGet() */.  VVA
19810 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
19820 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
19830 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
19840 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
19850 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69  s */..  /* Compi
19860 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69  lers may complai
19870 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20  n that mem1.u.i 
19880 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75  is potentially u
19890 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
198a0 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74  ** We could init
198b0 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68  ialize it, as sh
198c0 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c  own here, to sil
198d0 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c  ence those compl
198e0 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20  aints..  ** But 
198f0 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e  in fact, mem1.u.
19900 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74  i will never act
19910 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e  ually be used un
19920 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64  initialized, and
19930 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65   doing .  ** the
19940 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69   unnecessary ini
19950 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20  tialization has 
19960 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67  a measurable neg
19970 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  ative performanc
19980 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73  e.  ** impact, s
19990 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
199a0 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68  e is a very high
199b0 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f   runner.  And so
199c0 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a  , we choose.  **
199d0 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   to ignore the c
199e0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
199f0 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20   and leave this 
19a00 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69  variable uniniti
19a10 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f  alized..  */.  /
19a20 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  *  mem1.u.i = 0;
19a30 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c    // not needed,
19a40 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
19a50 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
19a60 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d  g */.  .  idx1 =
19a70 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
19a80 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64  y1, szHdr1);.  d
19a90 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73  1 = szHdr1;.  as
19aa0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
19ab0 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d  nField+pKeyInfo-
19ac0 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  >nXField>=pPKey2
19ad0 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52  ->nField || CORR
19ae0 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
19af0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
19b00 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
19b10 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
19b20 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20  o->nField>0 );. 
19b30 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
19b40 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
19b50 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
19b60 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
19b70 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  1;..    /* Read 
19b80 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
19b90 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
19ba0 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
19bb0 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
19bc0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61  = getVarint32( a
19bd0 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61  Key1+idx1, seria
19be0 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20  l_type1 );..    
19bf0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
19c00 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b  here is enough k
19c10 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69  ey space remaini
19c20 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20  ng to avoid.    
19c30 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72  ** a buffer over
19c40 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73  read.  The "d1+s
19c50 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73  erial_type1+2" s
19c60 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c  ubexpression wil
19c70 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  l.    ** always 
19c80 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
19c90 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
19ca0 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72  amount of requir
19cb0 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20  ed key space..  
19cc0 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70    ** Use that ap
19cd0 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61  proximation to a
19ce0 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78  void the more ex
19cf0 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a  pensive call to.
19d00 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
19d10 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
19d20 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  ) in the common 
19d30 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
19d40 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74   if( d1+serial_t
19d50 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79  ype1+2>(u32)nKey
19d60 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c  1.     && d1+sql
19d70 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
19d80 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
19d90 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a  e1)>(u32)nKey1 .
19da0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
19db0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
19dc0 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
19dd0 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61  lues to be compa
19de0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
19df0 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
19e00 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
19e10 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
19e20 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20  pe1, &mem1);..  
19e30 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70    /* Do the comp
19e40 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  arison.    */.  
19e50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
19e60 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
19e70 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d  &pPKey2->aMem[i]
19e80 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
19e90 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  l[i]);.    if( r
19ea0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  c!=0 ){.      as
19eb0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
19ec0 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65  loc==0 );  /* Se
19ed0 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20  e comment below 
19ee0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  */.      if( pKe
19ef0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
19f00 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
19f10 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e  rc = -rc;  /* In
19f20 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20  vert the result 
19f30 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72  for DESC sort or
19f40 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  der. */.      }.
19f50 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67        goto debug
19f60 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20  CompareEnd;.    
19f70 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68  }.    i++;.  }wh
19f80 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
19f90 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
19fa0 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  ield );..  /* No
19fb0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
19fc0 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
19fd0 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
19fe0 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
19ff0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
1a000 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
1a010 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
1a020 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
1a030 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
1a040 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
1a050 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
1a060 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
1a070 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1a080 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1a090 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1a0a0 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1a0b0 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
1a0c0 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
1a0d0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
1a0e0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
1a0f0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
1a100 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
1a110 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
1a120 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72  * value.  */.  r
1a130 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  c = pPKey2->defa
1a140 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f  ult_rc;..debugCo
1a150 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20  mpareEnd:.  if( 
1a160 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30  desiredResult==0
1a170 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75   && rc==0 ) retu
1a180 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1a190 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72  redResult<0 && r
1a1a0 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c<0 ) return 1;.
1a1b0 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1a1c0 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20  ult>0 && rc>0 ) 
1a1d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1a1e0 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1a1f0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65  urn 1;.  if( pKe
1a200 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
1a210 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1a220 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
1a230 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
1a240 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1a250 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1a260 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b  r of fields (a.k
1a270 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20  .a. columns) in 
1a280 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e  the record given
1a290 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79   by.** pKey,nKey
1a2a0 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68  .  The verify th
1a2b0 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73  at this count is
1a2c0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1a2d0 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69  ual to the.** li
1a2e0 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65  mit given by pKe
1a2f0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
1a300 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1a310 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  d..**.** If this
1a320 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e   constraint is n
1a330 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74  ot satisfied, it
1a340 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1a350 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64  high-speed.** vd
1a360 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
1a370 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63  nt() and vdbeRec
1a380 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
1a390 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  () routines will
1a3a0 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  .** not work cor
1a3b0 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73  rectly.  If this
1a3c0 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66   assert() ever f
1a3d0 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c  ires, it probabl
1a3e0 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  y means.** that 
1a3f0 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65  the KeyInfo.nFie
1a400 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58  ld or KeyInfo.nX
1a410 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72  Field values wer
1a420 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e  e computed.** in
1a430 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
1a440 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41 73  atic void vdbeAs
1a450 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1a460 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e  thinLimits(.  in
1a470 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f  t nKey, const vo
1a480 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54  id *pKey,   /* T
1a490 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72  he record to ver
1a4a0 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20  ify */ .  const 
1a4b0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a4c0 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61  o       /* Compa
1a4d0 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68 69  re size with thi
1a4e0 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a  s KeyInfo */.){.
1a4f0 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30    int nField = 0
1a500 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  ;.  u32 szHdr;. 
1a510 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20   u32 idx;.  u32 
1a520 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74  notUsed;.  const
1a530 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1a540 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
1a550 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65  signed char*)pKe
1a560 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50  y;..  if( CORRUP
1a570 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  T_DB ) return;. 
1a580 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
1a590 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
1a5a0 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e  .  assert( nKey>
1a5b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a5c0 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79  szHdr<=(u32)nKey
1a5d0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   );.  while( idx
1a5e0 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64  <szHdr ){.    id
1a5f0 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
1a600 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73  (aKey+idx, notUs
1a610 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b  ed);.    nField+
1a620 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  +;.  }.  assert(
1a630 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49   nField <= pKeyI
1a640 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79  nfo->nField+pKey
1a650 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b  Info->nXField );
1a660 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1a670 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c  e vdbeAssertFiel
1a680 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1a690 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66  ts(A,B,C).#endif
1a6a0 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d  ../*.** Both *pM
1a6b0 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63  em1 and *pMem2 c
1a6c0 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61  ontain string va
1a6d0 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68  lues. Compare th
1a6e0 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
1a6f0 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
1a700 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ion sequence pCo
1a710 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65  ll. As usual, re
1a720 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
1a730 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
1a740 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a  itive value if *
1a750 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
1a760 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
1a770 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
1a780 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74   *pMem2, respect
1a790 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69  ively. Similar i
1a7a0 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20  n spirit to "rc 
1a7b0 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70  = (*pMem1) - (*p
1a7c0 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74  Mem2);"..*/.stat
1a7d0 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61  ic int vdbeCompa
1a7e0 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63  reMemString(.  c
1a7f0 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
1a800 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
1a810 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  em2,.  const Col
1a820 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75  lSeq *pColl,.  u
1a830 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20  8 *prcErr       
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a850 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  * If an OOM occu
1a860 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54  rs, set to SQLIT
1a870 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20  E_NOMEM */.){.  
1a880 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  if( pMem1->enc==
1a890 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
1a8a0 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73    /* The strings
1a8b0 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
1a8c0 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f  the correct enco
1a8d0 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a  ding.  Call the.
1a8e0 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
1a8f0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65  on function dire
1a900 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  ctly */.    retu
1a910 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70  rn pColl->xCmp(p
1a920 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d  Coll->pUser,pMem
1a930 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d  1->n,pMem1->z,pM
1a940 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29  em2->n,pMem2->z)
1a950 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1a960 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74  nt rc;.    const
1a970 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a   void *v1, *v2;.
1a980 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a      int n1, n2;.
1a990 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20      Mem c1;.    
1a9a0 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69  Mem c2;.    sqli
1a9b0 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1a9c0 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c1, pMem1->db, M
1a9d0 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
1a9e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
1a9f0 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c  (&c2, pMem1->db,
1aa00 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
1aa10 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
1aa20 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70  allowCopy(&c1, p
1aa30 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem1, MEM_Ephem)
1aa40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1aa50 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1aa60 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f  &c2, pMem2, MEM_
1aa70 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d  Ephem);.    v1 =
1aa80 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
1aa90 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
1aaa0 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c1, pColl->en
1aab0 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d  c);.    n1 = v1=
1aac0 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20  =0 ? 0 : c1.n;. 
1aad0 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56     v2 = sqlite3V
1aae0 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
1aaf0 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43  3_value*)&c2, pC
1ab00 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e  oll->enc);.    n
1ab10 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20  2 = v2==0 ? 0 : 
1ab20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70  c2.n;.    rc = p
1ab30 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
1ab40 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c  ->pUser, n1, v1,
1ab50 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73 71   n2, v2);.    sq
1ab60 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1ab70 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71  ase(&c1);.    sq
1ab80 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1ab90 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 69 66  ase(&c2);.    if
1aba0 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d  ( (v1==0 || v2==
1abb0 30 29 20 26 26 20 70 72 63 45 72 72 20 29 20 2a  0) && prcErr ) *
1abc0 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f  prcErr = SQLITE_
1abd0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72  NOMEM;.    retur
1abe0 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  n rc;.  }.}../*.
1abf0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62  ** Compare two b
1ac00 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  lobs.  Return ne
1ac10 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1ac20 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1ac30 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73   first.** is les
1ac40 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1ac50 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
1ac60 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65  n the second, re
1ac70 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49  spectively..** I
1ac80 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20  f one blob is a 
1ac90 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74  prefix of the ot
1aca0 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68  her, then the sh
1acb0 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73  orter is the les
1acc0 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  sor..*/.static S
1acd0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
1ace0 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  nt sqlite3BlobCo
1acf0 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
1ad00 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  *pB1, const Mem 
1ad10 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 20 3d  *pB2){.  int c =
1ad20 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20   memcmp(pB1->z, 
1ad30 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70  pB2->z, pB1->n>p
1ad40 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a  B2->n ? pB2->n :
1ad50 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20   pB1->n);.  if( 
1ad60 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20  c ) return c;.  
1ad70 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d 20  return pB1->n - 
1ad80 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pB2->n;.}.../*.*
1ad90 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61  * Compare the va
1ada0 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62  lues contained b
1adb0 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79  y the two memory
1adc0 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e   cells, returnin
1add0 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a  g.** negative, z
1ade0 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ero or positive 
1adf0 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  if pMem1 is less
1ae00 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
1ae10 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74   or greater.** t
1ae20 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69  han pMem2. Sorti
1ae30 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c  ng order is NULL
1ae40 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77  's first, follow
1ae50 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69  ed by numbers (i
1ae60 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72  ntegers.** and r
1ae70 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d  eals) sorted num
1ae80 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77  erically, follow
1ae90 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72  ed by text order
1aea0 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74  ed by the collat
1aeb0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
1aec0 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c  pColl and finall
1aed0 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64  y blob's ordered
1aee0 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a   by memcmp()..**
1aef0 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c  .** Two NULL val
1af00 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
1af10 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73  ed equal by this
1af20 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1af30 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  t sqlite3MemComp
1af40 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
1af50 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  Mem1, const Mem 
1af60 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f  *pMem2, const Co
1af70 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
1af80 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69   int f1, f2;.  i
1af90 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  nt combined_flag
1afa0 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31  s;..  f1 = pMem1
1afb0 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20  ->flags;.  f2 = 
1afc0 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20  pMem2->flags;.  
1afd0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d  combined_flags =
1afe0 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74   f1|f2;.  assert
1aff0 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  ( (combined_flag
1b000 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
1b010 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20  =0 );. .  /* If 
1b020 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  one value is NUL
1b030 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  L, it is less th
1b040 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66  an the other. If
1b050 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a   both values.  *
1b060 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75  * are NULL, retu
1b070 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
1b080 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1b090 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
1b0a0 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e  return (f2&MEM_N
1b0b0 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e  ull) - (f1&MEM_N
1b0c0 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ull);.  }..  /* 
1b0d0 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1b0e0 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  a number and the
1b0f0 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20 74   other is not, t
1b100 68 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  he number is les
1b110 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20  s..  ** If both 
1b120 61 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d  are numbers, com
1b130 70 61 72 65 20 61 73 20 72 65 61 6c 73 20 69 66  pare as reals if
1b140 20 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c 20   one is a real, 
1b150 6f 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a 20  or as integers. 
1b160 20 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c 75   ** if both valu
1b170 65 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e  es are integers.
1b180 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1b190 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f  ined_flags&(MEM_
1b1a0 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b  Int|MEM_Real) ){
1b1b0 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20  .    double r1, 
1b1c0 72 32 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20  r2;.    if( (f1 
1b1d0 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21  & f2 & MEM_Int)!
1b1e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1b1f0 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65  pMem1->u.i < pMe
1b200 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
1b210 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
1b220 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d  Mem1->u.i > pMem
1b230 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
1b240 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1b250 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1b260 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f1&MEM_Real)!=
1b270 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 ){.      r1 = 
1b280 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a 20 20 20 20  pMem1->u.r;.    
1b290 7d 65 6c 73 65 20 69 66 28 20 28 66 31 26 4d 45  }else if( (f1&ME
1b2a0 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1b2b0 20 20 20 72 31 20 3d 20 28 64 6f 75 62 6c 65 29     r1 = (double)
1b2c0 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20 20  pMem1->u.i;.    
1b2d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1b2e0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1b2f0 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61   if( (f2&MEM_Rea
1b300 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  l)!=0 ){.      r
1b310 32 20 3d 20 70 4d 65 6d 32 2d 3e 75 2e 72 3b 0a  2 = pMem2->u.r;.
1b320 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
1b330 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  2&MEM_Int)!=0 ){
1b340 0a 20 20 20 20 20 20 72 32 20 3d 20 28 64 6f 75  .      r2 = (dou
1b350 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b 0a  ble)pMem2->u.i;.
1b360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b370 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1b380 7d 0a 20 20 20 20 69 66 28 20 72 31 3c 72 32 20  }.    if( r1<r2 
1b390 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1b3a0 20 69 66 28 20 72 31 3e 72 32 20 29 20 72 65 74   if( r1>r2 ) ret
1b3b0 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72  urn 1;.    retur
1b3c0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
1b3d0 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
1b3e0 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
1b3f0 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c  other is a blob,
1b400 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c   the string is l
1b410 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74  ess..  ** If bot
1b420 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63  h are strings, c
1b430 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65  ompare using the
1b440 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
1b450 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1b460 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1b470 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
1b480 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72  f( (f1 & MEM_Str
1b490 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1b4a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1b4b0 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f    if( (f2 & MEM_
1b4c0 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1b4d0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1b4e0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1b4f0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32  Mem1->enc==pMem2
1b500 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  ->enc );.    ass
1b510 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1b520 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  =SQLITE_UTF8 || 
1b530 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65  .            pMe
1b540 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1b550 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31  UTF16LE || pMem1
1b560 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1b570 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  F16BE );..    /*
1b580 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
1b590 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20  equence must be 
1b5a0 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20  defined at this 
1b5b0 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20  point, even if. 
1b5c0 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64     ** the user d
1b5d0 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61  eletes the colla
1b5e0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66  tion sequence af
1b5f0 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f  ter the vdbe pro
1b600 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63  gram is.    ** c
1b610 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61  ompiled (this wa
1b620 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65  s not always the
1b630 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   case)..    */. 
1b640 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c     assert( !pCol
1b650 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l || pColl->xCmp
1b660 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f   );..    if( pCo
1b670 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
1b680 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65  rn vdbeCompareMe
1b690 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70  mString(pMem1, p
1b6a0 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b  Mem2, pColl, 0);
1b6b0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66  .    }.    /* If
1b6c0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
1b6d0 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68  was passed as th
1b6e0 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69  e collate functi
1b6f0 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  on, fall through
1b700 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62  .    ** to the b
1b710 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65  lob case and use
1b720 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20   memcmp().  */. 
1b730 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76   }. .  /* Both v
1b740 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c  alues must be bl
1b750 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73  obs.  Compare us
1b760 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  ing memcmp().  *
1b770 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
1b780 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d  e3BlobCompare(pM
1b790 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a  em1, pMem2);.}..
1b7a0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
1b7b0 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1b7c0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1b7d0 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79  n is a serial-ty
1b7e0 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65  pe that.** corre
1b7f0 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74  sponds to an int
1b800 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65  eger - all value
1b810 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
1b820 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20  9 inclusive .** 
1b830 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65  except 7. The se
1b840 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61  cond points to a
1b850 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1b860 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ng an integer va
1b870 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65  lue.** serialize
1b880 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73  d according to s
1b890 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73  erial_type. This
1b8a0 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
1b8b0 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65  alizes.** and re
1b8c0 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e  turns the value.
1b8d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76  .*/.static i64 v
1b8e0 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
1b8f0 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  nt(u32 serial_ty
1b900 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  pe, const u8 *aK
1b910 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20  ey){.  u32 y;.  
1b920 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1b930 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  DB || (serial_ty
1b940 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f  pe>=1 && serial_
1b950 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61  type<=9 && seria
1b960 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20  l_type!=7) );.  
1b970 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
1b980 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
1b990 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20  0:.    case 1:. 
1b9a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1b9b0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1b9c0 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f       return ONE_
1b9d0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1b9e0 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20      case 2:.    
1b9f0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1ba00 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1ba10 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54    return TWO_BYT
1ba20 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1ba30 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74   case 3:.      t
1ba40 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1ba50 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1ba60 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45  eturn THREE_BYTE
1ba70 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1ba80 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20  case 4: {.      
1ba90 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1baa0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1bab0 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1bac0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1bad0 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e  return (i64)*(in
1bae0 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20  t*)&y;.    }.   
1baf0 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20   case 5: {.     
1bb00 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1bb10 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1bb20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54   return FOUR_BYT
1bb30 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1bb40 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1bb50 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1bb60 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  y);.    }.    ca
1bb70 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36  se 6: {.      u6
1bb80 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
1bb90 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1bba0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1bbb0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1bbc0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1bbd0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1bbe0 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65  Key+4);.      re
1bbf0 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a  turn (i64)*(i64*
1bc00 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  )&x;.    }.  }..
1bc10 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
1bc20 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f  _type - 8);.}../
1bc30 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1bc40 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  on compares the 
1bc50 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f  two table rows o
1bc60 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  r index records.
1bc70 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
1bc80 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
1bc90 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72  nd pPKey2.  It r
1bca0 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76  eturns a negativ
1bcb0 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
1bcc0 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
1bcd0 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  f key1 is less t
1bce0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1bcf0 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
1bd00 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b  n key2.  The {nK
1bd10 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20  ey1, pKey1} key 
1bd20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a  must be a blob.*
1bd30 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
1bd40 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1bd50 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
1bd60 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
1bd70 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
1bd80 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
1bd90 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
1bda0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
1bdb0 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
1bdc0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53  * If argument bS
1bdd0 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
1bde0 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1bdf0 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
1be00 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65  as already.** de
1be10 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1be20 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1be30 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  f the keys are e
1be40 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31  qual..**.** Key1
1be50 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74   and Key2 do not
1be60 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e   have to contain
1be70 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1be80 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61   of fields. If a
1be90 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68  ll .** fields th
1bea0 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74  at appear in bot
1beb0 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  h keys are equal
1bec0 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64  , then pPKey2->d
1bed0 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a  efault_rc is .**
1bee0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1bef0 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   If database cor
1bf00 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f  ruption is disco
1bf10 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79  vered, set pPKey
1bf20 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a  2->errCode to .*
1bf30 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
1bf40 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49   and return 0. I
1bf50 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
1bf60 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a  s encountered, .
1bf70 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  ** pPKey2->errCo
1bf80 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  de is set to SQL
1bf90 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69  ITE_NOMEM and, i
1bfa0 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
1bfb0 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d  , the.** malloc-
1bfc0 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20  failed flag set 
1bfd0 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
1bfe0 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79  le (pPKey2->pKey
1bff0 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e  Info->db)..*/.in
1c000 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
1c010 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1c020 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ip(.  int nKey1,
1c030 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1c040 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1c050 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1c060 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20  ecord *pPKey2,  
1c070 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1c080 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b  key */.  int bSk
1c090 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ip              
1c0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1c0b0 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69  rue, skip the fi
1c0c0 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  rst field */.){.
1c0d0 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0f0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1c100 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1c110 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1c120 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c140 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
1c150 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70  xt field to comp
1c160 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  are */.  u32 szH
1c170 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
1c180 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1c190 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65   of record heade
1c1a0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
1c1b0 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1d0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
1c1e0 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65  st type in heade
1c1f0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
1c200 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1c210 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1c220 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20   value */.  Mem 
1c230 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e  *pRhs = pPKey2->
1c240 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e  aMem;       /* N
1c250 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  ext field of pPK
1c260 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  ey2 to compare *
1c270 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1c280 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
1c290 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73  pKeyInfo;.  cons
1c2a0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c2b0 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1c2c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1c2d0 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d  pKey1;.  Mem mem
1c2e0 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69  1;..  /* If bSki
1c2f0 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  p is true, then 
1c300 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1c310 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65  lready determine
1c320 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1c330 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e  .  ** two elemen
1c340 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61  ts in the keys a
1c350 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68  re equal. Fix th
1c360 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20  e various stack 
1c370 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a  variables so.  *
1c380 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  * that this rout
1c390 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61  ine begins compa
1c3a0 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f  ring at the seco
1c3b0 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69  nd field. */.  i
1c3c0 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( bSkip ){.    
1c3d0 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31  u32 s1;.    idx1
1c3e0 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74   = 1 + getVarint
1c3f0 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31  32(&aKey1[1], s1
1c400 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20  );.    szHdr1 = 
1c410 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31  aKey1[0];.    d1
1c420 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69   = szHdr1 + sqli
1c430 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1c440 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20  eLen(s1);.    i 
1c450 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  = 1;.    pRhs++;
1c460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
1c470 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
1c480 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
1c490 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1c4a0 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e  ;.    if( d1>(un
1c4b0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20  signed)nKey1 ){ 
1c4c0 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
1c4d0 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1c4e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c4f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1c500 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e  ;  /* Corruption
1c510 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20   */.    }.    i 
1c520 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f  = 0;.  }..  VVA_
1c530 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1c540 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1c550 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1c560 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1c570 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1c580 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1c590 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70  nField+pPKey2->p
1c5a0 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1c5b0 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  >=pPKey2->nField
1c5c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52   .       || CORR
1c5d0 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
1c5e0 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1c5f0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1c600 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1c610 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1c620 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20  o->nField>0 );. 
1c630 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
1c640 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
1c650 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
1c660 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1c670 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  ;..    /* RHS is
1c680 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20   an integer */. 
1c690 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61     if( pRhs->fla
1c6a0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
1c6b0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1c6c0 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1c6d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c6e0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1c6f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1c700 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
1c710 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1c720 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1c730 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
1c740 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c750 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1c760 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1c770 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==7 ){.        d
1c780 6f 75 62 6c 65 20 72 68 73 20 3d 20 28 64 6f 75  ouble rhs = (dou
1c790 62 6c 65 29 70 52 68 73 2d 3e 75 2e 69 3b 0a 20  ble)pRhs->u.i;. 
1c7a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c7b0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1c7c0 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1c7d0 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  ype, &mem1);.   
1c7e0 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e       if( mem1.u.
1c7f0 72 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  r<rhs ){.       
1c800 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1c810 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65      }else if( me
1c820 6d 31 2e 75 2e 72 3e 72 68 73 20 29 7b 0a 20 20  m1.u.r>rhs ){.  
1c830 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1c840 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c860 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65  i64 lhs = vdbeRe
1c870 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65  cordDecodeInt(se
1c880 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79  rial_type, &aKey
1c890 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  1[d1]);.        
1c8a0 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  i64 rhs = pRhs->
1c8b0 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  u.i;.        if(
1c8c0 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
1c8d0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1c8e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1c8f0 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
1c900 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1c910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c920 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1c930 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20  HS is real */.  
1c940 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1c950 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
1c960 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  l ){.      seria
1c970 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1c980 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  dx1];.      if( 
1c990 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
1c9a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
1c9b0 72 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72  rial types 12 or
1c9c0 20 67 72 65 61 74 65 72 20 61 72 65 20 73 74 72   greater are str
1c9d0 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28  ings and blobs (
1c9e0 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20  greater than.   
1c9f0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29       ** numbers)
1ca00 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64 20 31  . Types 10 and 1
1ca10 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  1 are currently 
1ca20 22 72 65 73 65 72 76 65 64 20 66 6f 72 20 66 75  "reserved for fu
1ca30 74 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ture .        **
1ca40 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65   use", so it doe
1ca50 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74  sn't really matt
1ca60 65 72 20 77 68 61 74 20 74 68 65 20 72 65 73 75  er what the resu
1ca70 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  lts of comparing
1ca80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d  .        ** them
1ca90 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c   to numberic val
1caa0 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20  ues are.  */.   
1cab0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1cac0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1cad0 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
1cae0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1caf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1cb00 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73        double rhs
1cb10 20 3d 20 70 52 68 73 2d 3e 75 2e 72 3b 0a 20 20   = pRhs->u.r;.  
1cb20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6c 68 73        double lhs
1cb30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1cb40 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1cb50 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1cb60 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
1cb70 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69          if( seri
1cb80 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
1cb90 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20 6d 65          lhs = me
1cba0 6d 31 2e 75 2e 72 3b 0a 20 20 20 20 20 20 20 20  m1.u.r;.        
1cbb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1cbc0 20 6c 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 6d   lhs = (double)m
1cbd0 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 20  em1.u.i;.       
1cbe0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
1cbf0 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs<rhs ){.      
1cc00 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1cc10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
1cc20 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs>rhs ){.      
1cc30 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1cc40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1cc50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1cc60 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a   is a string */.
1cc70 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1cc80 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  s->flags & MEM_S
1cc90 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  tr ){.      getV
1cca0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
1ccb0 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
1ccc0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1ccd0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1cce0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1ccf0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1cd00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1cd10 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
1cd20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70  if( !(serial_typ
1cd30 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
1cd40 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1cd50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cd60 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72     mem1.n = (ser
1cd70 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
1cd80 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
1cd90 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
1cda0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1cdb0 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
1cdc0 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
1cdd0 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  .n+1)==(unsigned
1cde0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1cdf0 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e    if( (d1+mem1.n
1ce00 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
1ce10 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ey1 ){.         
1ce20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1ce30 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
1ce40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1ce50 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ce70 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1ce80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1ce90 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ( pKeyInfo->aCol
1cea0 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  l[i] ){.        
1ceb0 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
1cec0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1ced0 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20        mem1.db = 
1cee0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1cef0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61          mem1.fla
1cf00 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20  gs = MEM_Str;.  
1cf10 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d          mem1.z =
1cf20 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64   (char*)&aKey1[d
1cf30 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  1];.          rc
1cf40 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65   = vdbeCompareMe
1cf50 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20  mString(.       
1cf60 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52         &mem1, pR
1cf70 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  hs, pKeyInfo->aC
1cf80 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d  oll[i], &pPKey2-
1cf90 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20  >errCode.       
1cfa0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65     );.        }e
1cfb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1cfc0 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65  nt nCmp = MIN(me
1cfd0 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  m1.n, pRhs->n);.
1cfe0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1cff0 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1d000 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1d010 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1d020 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d  rc==0 ) rc = mem
1d030 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a  1.n - pRhs->n; .
1d040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d050 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1d060 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  RHS is a blob */
1d070 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1d080 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1d090 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65  Blob ){.      ge
1d0a0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1d0b0 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1d0c0 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1d0d0 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1d0e0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1d0f0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1d100 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  2 || (serial_typ
1d110 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
1d120 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1d130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d140 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73     int nStr = (s
1d150 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1d160 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
1d170 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
1d180 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1d190 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
1d1a0 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
1d1b0 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
1d1c0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1d1d0 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20  if( (d1+nStr) > 
1d1e0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1d1f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
1d200 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1d210 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1d220 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1d230 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1d240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1d250 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1d260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d270 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1d280 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e  MIN(nStr, pRhs->
1d290 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
1d2a0 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1d2b0 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
1d2c0 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
1d2d0 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
1d2e0 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b   nStr - pRhs->n;
1d2f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d300 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d310 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a   RHS is null */.
1d320 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
1d330 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
1d340 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
1d350 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79   rc = (serial_ty
1d360 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  pe!=0);.    }.. 
1d370 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1d380 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
1d390 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
1d3a0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
1d3b0 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = -rc;.      }. 
1d3c0 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64 62       assert( vdb
1d3d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1d3e0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1d3f0 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b  , pPKey2, rc) );
1d400 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
1d410 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1d420 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
1d430 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  nt below */.    
1d440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d450 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20   }..    i++;.   
1d460 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20   pRhs++;.    d1 
1d470 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1d480 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1d490 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64  al_type);.    id
1d4a0 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72  x1 += sqlite3Var
1d4b0 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  intLen(serial_ty
1d4c0 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  pe);.  }while( i
1d4d0 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a  dx1<(unsigned)sz
1d4e0 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
1d4f0 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d  ->nField && d1<=
1d500 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1d510 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1d520 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1d530 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1d540 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1d550 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1d560 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1d570 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
1d580 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
1d590 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
1d5a0 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
1d5b0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
1d5c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1d5d0 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a  ase(&mem1).  */.
1d5e0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1d5f0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
1d600 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
1d610 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72  eans that one or
1d620 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79   both of the key
1d630 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
1d640 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
1d650 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
1d660 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
1d670 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
1d680 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
1d690 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
1d6a0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1d6b0 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76  _DB .       || v
1d6c0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d6d0 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1d6e0 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65  y1, pPKey2, pPKe
1d6f0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20  y2->default_rc) 
1d700 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49  .       || pKeyI
1d710 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1d720 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74  ailed.  );.  ret
1d730 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
1d740 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  ult_rc;.}.int sq
1d750 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1d760 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
1d770 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1d780 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
1d790 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1d7a0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1d7b0 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2          /* Ri
1d7c0 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
1d7d0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1d7e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1d7f0 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
1d800 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29  Key1, pPKey2, 0)
1d810 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1d820 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
1d830 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
1d840 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
1d850 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1d860 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
1d870 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
1d880 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74  pPKey2 is an int
1d890 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68  eger, and (b) th
1d8a0 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65  e .** size-of-he
1d8b0 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74  ader varint at t
1d8c0 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
1d8d0 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
1d8e0 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79  n a single.** by
1d8f0 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73  te (i.e. is less
1d900 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a   than 128)..**.*
1d910 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65  * To avoid conce
1d920 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72  rns about buffer
1d930 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73   overreads, this
1d940 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
1d950 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65   used.** on sche
1d960 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61  mas where the ma
1d970 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64  ximum valid head
1d980 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79  er size is 63 by
1d990 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a  tes or less..*/.
1d9a0 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
1d9b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1d9c0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1d9d0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1d9e0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1d9f0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1da00 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
1da10 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1da20 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
1da30 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75  Key = &((const u
1da40 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73  8*)pKey1)[*(cons
1da50 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78  t u8*)pKey1 & 0x
1da60 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  3F];.  int seria
1da70 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74  l_type = ((const
1da80 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a   u8*)pKey1)[1];.
1da90 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32    int res;.  u32
1daa0 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69   y;.  u64 x;.  i
1dab0 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61  64 v = pPKey2->a
1dac0 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36  Mem[0].u.i;.  i6
1dad0 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73  4 lhs;..  vdbeAs
1dae0 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1daf0 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
1db00 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
1db10 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73  >pKeyInfo);.  as
1db20 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65  sert( (*(u8*)pKe
1db30 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52  y1)<=0x3F || COR
1db40 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69  RUPT_DB );.  swi
1db50 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
1db60 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20   ){.    case 1: 
1db70 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
1db80 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1db90 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59      lhs = ONE_BY
1dba0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1dbb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1dbc0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1dbd0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1dbe0 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
1dbf0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1dc00 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1dc10 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1dc20 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1dc30 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1dc40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1dc50 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
1dc60 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
1dc70 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1dc80 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45  lhs = THREE_BYTE
1dc90 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1dca0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1dcb0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1dcc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1dcd0 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
1dce0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1dcf0 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  /.      y = FOUR
1dd00 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1dd10 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69  ;.      lhs = (i
1dd20 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
1dd30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1dd40 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1dd50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1dd60 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
1dd70 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1dd80 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1dd90 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1dda0 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
1ddb0 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1ddc0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1ddd0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1dde0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1ddf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1de00 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20   6: { /* 8-byte 
1de10 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1de20 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52  /.      x = FOUR
1de30 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1de40 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1de50 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1de60 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1de70 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a      lhs = *(i64*
1de80 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63  )&x;.      testc
1de90 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1dea0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1deb0 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20  .    case 8: .  
1dec0 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20      lhs = 0;.   
1ded0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1dee0 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20  se 9:.      lhs 
1def0 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
1df00 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;..    /* This c
1df10 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d  ase could be rem
1df20 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61  oved without cha
1df30 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nging the result
1df40 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20  s of running.   
1df50 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49   ** this code. I
1df60 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73  ncluding it caus
1df70 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61  es gcc to genera
1df80 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74  te a faster swit
1df90 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ch .    ** state
1dfa0 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20  ment (since the 
1dfb0 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20  range of switch 
1dfc0 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72  targets now star
1dfd0 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20  ts at zero and. 
1dfe0 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75     ** is contigu
1dff0 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f  ous) but does no
1e000 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c  t cause any dupl
1e010 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65  icate code to be
1e020 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a   generated.    *
1e030 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65  * (as gcc is cle
1e040 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  ver enough to co
1e050 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69  mbine the two li
1e060 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72  ke cases). Other
1e070 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   .    ** compile
1e080 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69  rs might be simi
1e090 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61  lar.  */ .    ca
1e0a0 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20  se 0: case 7:.  
1e0b0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1e0c0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1e0d0 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
1e0e0 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20  , pPKey2);..    
1e0f0 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
1e100 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1e110 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1e120 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1e130 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ey2);.  }..  if(
1e140 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v>lhs ){.    re
1e150 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
1e160 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68    }else if( v<lh
1e170 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
1e180 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c  PKey2->r2;.  }el
1e190 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e  se if( pPKey2->n
1e1a0 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f  Field>1 ){.    /
1e1b0 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
1e1c0 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
1e1d0 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f  ys are equal. Co
1e1e0 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69  mpare the traili
1e1f0 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ng .    ** field
1e200 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  s.  */.    res =
1e210 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1e220 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1e230 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
1e240 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65  pPKey2, 1);.  }e
1e250 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
1e260 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
1e270 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65  the two keys are
1e280 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65   equal and there
1e290 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67   are no trailing
1e2a0 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
1e2b0 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  Return pPKey2->d
1e2c0 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69  efault_rc in thi
1e2d0 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72  s case. */.    r
1e2e0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
1e2f0 61 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20 20  ault_rc;.  }..  
1e300 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
1e310 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1e320 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1e330 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72  ey2, res) );.  r
1e340 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
1e350 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e360 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
1e370 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
1e380 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1e390 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
1e3a0 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
1e3b0 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
1e3c0 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74  s a string, that
1e3d0 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66   (b) the first f
1e3e0 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65  ield.** uses the
1e3f0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1e400 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28  nce BINARY and (
1e410 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  c) that the size
1e420 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
1e430 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61  t .** at the sta
1e440 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
1e450 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
1e460 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74  ngle byte..*/.st
1e470 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1e480 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
1e490 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1e4a0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1e4b0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
1e4c0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1e4d0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
1e4e0 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1e4f0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
1e500 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
1e510 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20  8*)pKey1;.  int 
1e520 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69  serial_type;.  i
1e530 6e 74 20 72 65 73 3b 0a 0a 20 20 76 64 62 65 41  nt res;..  vdbeA
1e540 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1e550 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79  ithinLimits(nKey
1e560 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1e570 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67  ->pKeyInfo);.  g
1e580 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1e590 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  1[1], serial_typ
1e5a0 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e);.  if( serial
1e5b0 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
1e5c0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
1e5d0 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
1e5e0 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d  /nKey1) is a num
1e5f0 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f  ber or a null */
1e600 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73  .  }else if( !(s
1e610 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1e620 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d  1) ){ .    res =
1e630 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20   pPKey2->r2;    
1e640 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
1e650 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  1) is a blob */.
1e660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1e670 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e   nCmp;.    int n
1e680 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48  Str;.    int szH
1e690 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a  dr = aKey1[0];..
1e6a0 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69      nStr = (seri
1e6b0 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b  al_type-12) / 2;
1e6c0 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20  .    if( (szHdr 
1e6d0 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20  + nStr) > nKey1 
1e6e0 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d  ){.      pPKey2-
1e6f0 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1e700 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e710 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
1e720 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70   0;    /* Corrup
1e730 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
1e740 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50    nCmp = MIN( pP
1e750 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c  Key2->aMem[0].n,
1e760 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73   nStr );.    res
1e770 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1e780 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d  [szHdr], pPKey2-
1e790 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70  >aMem[0].z, nCmp
1e7a0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d  );..    if( res=
1e7b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  =0 ){.      res 
1e7c0 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d  = nStr - pPKey2-
1e7d0 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20  >aMem[0].n;.    
1e7e0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
1e7f0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65          if( pPKe
1e800 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
1e810 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
1e820 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1e830 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1e840 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1e850 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20  PKey2, 1);.     
1e860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e870 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1e880 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
1e890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1e8a0 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
1e8b0 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
1e8c0 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20  PKey2->r2;.     
1e8d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e8e0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
1e8f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1e900 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
1e910 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
1e920 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c  ey2->r2;.    }el
1e930 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  se{.      res = 
1e940 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20  pPKey2->r1;.    
1e950 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1e960 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1e970 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1e980 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65  Key1, pPKey2, re
1e990 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  s).       || COR
1e9a0 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c  RUPT_DB.       |
1e9b0 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  | pPKey2->pKeyIn
1e9c0 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
1e9d0 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75  iled.  );.  retu
1e9e0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
1e9f0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1ea00 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56  r to an sqlite3V
1ea10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1ea20 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75  () compatible fu
1ea30 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62  nction.** suitab
1ea40 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  le for comparing
1ea50 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f   serialized reco
1ea60 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63  rds to the unpac
1ea70 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65  ked record passe
1ea80 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79  d.** as the only
1ea90 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65   argument..*/.Re
1eaa0 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69  cordCompare sqli
1eab0 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
1eac0 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  re(UnpackedRecor
1ead0 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69  d *p){.  /* vari
1eae0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
1eaf0 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52  nt() and varintR
1eb00 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1eb10 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65  ng() both assume
1eb20 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73  .  ** that the s
1eb30 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
1eb40 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73  rint that occurs
1eb50 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1eb60 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a   each record.  *
1eb70 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  * fits in a sing
1eb80 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73  le byte (i.e. is
1eb90 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76   127 or less). v
1eba0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
1ebb0 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73  reInt().  ** als
1ebc0 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  o assumes that i
1ebd0 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65  t is safe to ove
1ebe0 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62  rread a buffer b
1ebf0 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a  y at least the .
1ec00 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73    ** maximum pos
1ec10 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64  sible legal head
1ec20 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62  er size plus 8 b
1ec30 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68  ytes. Because th
1ec40 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72  ere is.  ** guar
1ec50 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20  anteed to be at 
1ec60 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f  least 74 (but no
1ec70 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20  t 136) bytes of 
1ec80 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e  padding followin
1ec90 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66  g each.  ** buff
1eca0 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72  er passed to var
1ecb0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
1ecc0 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73  Int() this makes
1ecd0 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   it convenient t
1ece0 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65  o.  ** limit the
1ecf0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
1ed00 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20  der to 64 bytes 
1ed10 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74  in cases where t
1ed20 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20  he first field. 
1ed30 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65   ** is an intege
1ed40 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
1ed50 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
1ed60 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d  enforce this lim
1ed70 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65  it is to conside
1ed80 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77  r only records w
1ed90 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c  ith.  ** 13 fiel
1eda0 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74  ds or less. If t
1edb0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69  he first field i
1edc0 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68  s an integer, th
1edd0 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a  e maximum legal.
1ede0 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65    ** header size
1edf0 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20   is (12*5 + 1 + 
1ee00 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20  1) bytes.  */.  
1ee10 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f  if( (p->pKeyInfo
1ee20 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b  ->nField + p->pK
1ee30 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29  eyInfo->nXField)
1ee40 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20  <=13 ){.    int 
1ee50 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b  flags = p->aMem[
1ee60 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66  0].flags;.    if
1ee70 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ( p->pKeyInfo->a
1ee80 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a  SortOrder[0] ){.
1ee90 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b        p->r1 = 1;
1eea0 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d  .      p->r2 = -
1eeb0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1eec0 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a      p->r1 = -1;.
1eed0 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b        p->r2 = 1;
1eee0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1eef0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
1ef00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ef10 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1ef20 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20  reInt;.    }.   
1ef30 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
1ef40 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20   & MEM_Real );. 
1ef50 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
1ef60 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  gs & MEM_Null );
1ef70 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
1ef80 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
1ef90 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  );.    if( (flag
1efa0 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45  s & (MEM_Real|ME
1efb0 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29  M_Null|MEM_Blob)
1efc0 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49  )==0 && p->pKeyI
1efd0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30  nfo->aColl[0]==0
1efe0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1eff0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ( flags & MEM_St
1f000 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r );.      retur
1f010 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
1f020 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d  areString;.    }
1f030 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
1f040 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1f050 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  Compare;.}../*.*
1f060 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  * pCur points at
1f070 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
1f080 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
1f090 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1f0a0 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20  opcode..** Read 
1f0b0 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c  the rowid (the l
1f0c0 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65  ast field in the
1f0d0 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f   record) and sto
1f0e0 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e  re it in *rowid.
1f0f0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1f100 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
1f110 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20  ng works, or an 
1f120 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
1f130 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  wise..**.** pCur
1f140 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69   might be pointi
1f150 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69  ng to text obtai
1f160 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75  ned from a corru
1f170 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
1f180 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74  ..** So the cont
1f190 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  ent cannot be tr
1f1a0 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f  usted.  Do appro
1f1b0 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e  priate checks on
1f1c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   the content..*/
1f1d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1f1e0 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33  IdxRowid(sqlite3
1f1f0 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a   *db, BtCursor *
1f200 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
1f210 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
1f220 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
1f230 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
1f240 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1f250 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
1f260 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
1f270 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
1f280 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
1f290 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
1f2a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1f2b0 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
1f2c0 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47  em m, v;..  /* G
1f2d0 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
1f2e0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
1f2f0 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
1f300 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
1f310 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
1f320 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
1f330 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
1f340 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
1f350 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
1f360 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
1f370 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
1f380 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
1f390 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
1f3a0 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
1f3b0 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
1f3c0 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
1f3d0 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
1f3e0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
1f3f0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1f400 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
1f410 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
1f420 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
1f430 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
1f440 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
1f450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
1f460 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20       /* pCur is 
1f470 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
1f480 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
1f490 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ail */.  assert(
1f4a0 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
1f4b0 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
1f4c0 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
1f4d0 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
1f4e0 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
1f4f0 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
1f500 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1f510 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c  3VdbeMemInit(&m,
1f520 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20   db, 0);.  rc = 
1f530 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
1f540 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
1f550 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
1f560 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
1f570 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1f580 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  c;.  }..  /* The
1f590 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73   index entry mus
1f5a0 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68  t begin with a h
1f5b0 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20  eader size */.  
1f5c0 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
1f5d0 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64  2((u8*)m.z, szHd
1f5e0 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  r);.  testcase( 
1f5f0 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65  szHdr==3 );.  te
1f600 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d  stcase( szHdr==m
1f610 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  .n );.  if( unli
1f620 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20  kely(szHdr<3 || 
1f630 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20  (int)szHdr>m.n) 
1f640 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
1f650 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
1f660 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1f670 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68  last field of th
1f680 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62  e index should b
1f690 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74  e an integer - t
1f6a0 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56  he ROWID..  ** V
1f6b0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c  erify that the l
1f6c0 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79  ast entry really
1f6d0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   is an integer. 
1f6e0 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61  */.  (void)getVa
1f6f0 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a  rint32((u8*)&m.z
1f700 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52  [szHdr-1], typeR
1f710 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
1f720 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20  e( typeRowid==1 
1f730 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1f740 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20  ypeRowid==2 );. 
1f750 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1f760 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73  owid==3 );.  tes
1f770 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1f780 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==4 );.  testcas
1f790 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20  e( typeRowid==5 
1f7a0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1f7b0 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20  ypeRowid==6 );. 
1f7c0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1f7d0 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73  owid==8 );.  tes
1f7e0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1f7f0 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  ==9 );.  if( unl
1f800 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c  ikely(typeRowid<
1f810 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39  1 || typeRowid>9
1f820 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37   || typeRowid==7
1f830 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
1f840 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
1f850 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77  on;.  }.  lenRow
1f860 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  id = sqlite3Vdbe
1f870 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79  SerialTypeLen(ty
1f880 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
1f890 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d  case( (u32)m.n==
1f8a0 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29  szHdr+lenRowid )
1f8b0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
1f8c0 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b  ((u32)m.n<szHdr+
1f8d0 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  lenRowid) ){.   
1f8e0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
1f8f0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
1f900 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20  .  /* Fetch the 
1f910 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20  integer off the 
1f920 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
1f930 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
1f940 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1f950 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
1f960 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
1f970 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
1f980 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
1f990 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1f9a0 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
1f9b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
1f9c0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1f9d0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1f9e0 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
1f9f0 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65   after m has bee
1fa00 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  n.  ** allocated
1fa10 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62  .  Free the m ob
1fa20 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
1fa30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
1fa40 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  */.idx_rowid_cor
1fa50 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63  ruption:.  testc
1fa60 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21  ase( m.szMalloc!
1fa70 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
1fa80 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1fa90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1faa0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1fab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1fac0 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
1fad0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
1fae0 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
1faf0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
1fb00 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
1fb10 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
1fb20 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
1fb30 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
1fb40 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
1fb50 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1fb60 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
1fb70 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1fb80 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
1fb90 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
1fba0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1fbb0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
1fbc0 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
1fbd0 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
1fbe0 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
1fbf0 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
1fc00 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
1fc10 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
1fc20 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
1fc30 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
1fc40 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
1fc50 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
1fc60 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
1fc70 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
1fc80 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
1fc90 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
1fca0 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
1fcb0 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
1fcc0 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
1fcd0 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
1fce0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
1fcf0 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69  yCompare(.  sqli
1fd00 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1fd30 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ion */.  VdbeCur
1fd40 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
1fd50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fd60 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
1fd70 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
1fd80 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1fd90 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20  pUnpacked,      
1fda0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
1fdb0 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20  sion of key */. 
1fdc0 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
1fdf0 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
1fe00 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36   here */.){.  i6
1fe10 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
1fe20 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
1fe30 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d  rsor *pCur = pC-
1fe40 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20  >pCursor;.  Mem 
1fe50 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  m;..  assert( sq
1fe60 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1fe70 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
1fe80 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
1fe90 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
1fea0 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
1feb0 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
1fec0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fed0 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  );    /* pCur is
1fee0 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
1fef0 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
1ff00 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65  fail */.  /* nCe
1ff10 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79  llKey will alway
1ff20 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  s be between 0 a
1ff30 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65  nd 0xffffffff be
1ff40 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
1ff50 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65  .  ** that btree
1ff60 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
1ff70 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nd sqlite3GetVar
1ff80 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c  int32() are impl
1ff90 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28  emented */.  if(
1ffa0 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20   nCellKey<=0 || 
1ffb0 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66  nCellKey>0x7ffff
1ffc0 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  fff ){.    *res 
1ffd0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1ffe0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1fff0 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
20000 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
20010 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
20020 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
20030 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75  romBtree(pC->pCu
20040 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  rsor, 0, (u32)nC
20050 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
20060 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20070 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
20080 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
20090 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
200a0 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
200b0 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
200c0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
200d0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
200e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
200f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
20100 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
20110 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
20120 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
20130 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
20140 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
20150 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
20160 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
20170 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
20180 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
20190 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
201a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
201b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
201c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
201d0 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
201e0 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
201f0 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
20200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
20210 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
20220 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
20230 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
20240 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
20250 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
20260 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20270 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
20280 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
20290 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
202a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
202b0 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
202c0 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
202d0 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
202e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
202f0 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
20300 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
20310 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
20320 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
20330 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
20340 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
20350 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
20360 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
20370 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
20380 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
20390 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
203a0 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
203b0 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
203c0 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
203d0 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
203e0 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
203f0 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
20400 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
20410 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
20420 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
20430 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
20440 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
20450 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
20460 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
20470 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
20480 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
20490 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
204a0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
204b0 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
204c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
204d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
204e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
204f0 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
20500 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
20510 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
20520 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
20530 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
20540 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
20550 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
20560 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
20570 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a  the value bound.
20580 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  ** parameter iVa
20590 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70  r of VM v. Excep
205a0 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  t, if the value 
205b0 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
205c0 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73  return .** 0 ins
205d0 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20  tead. Unless it 
205e0 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61  is NULL, apply a
205f0 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65  ffinity aff (one
20600 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   of the SQLITE_A
20610 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  FF_*.** constant
20620 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  s) to the value 
20630 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
20640 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   it..**.** The r
20650 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75  eturned value mu
20660 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
20670 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
20680 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
20690 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ()..*/.sqlite3_v
206a0 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62  alue *sqlite3Vdb
206b0 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56  eGetBoundValue(V
206c0 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
206d0 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73  , u8 aff){.  ass
206e0 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
206f0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65   if( v ){.    Me
20700 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56  m *pMem = &v->aV
20710 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20  ar[iVar-1];.    
20720 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c  if( 0==(pMem->fl
20730 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  ags & MEM_Null) 
20740 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20750 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73  _value *pRet = s
20760 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76  qlite3ValueNew(v
20770 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
20780 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
20790 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
207a0 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c  opy((Mem *)pRet,
207b0 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
207c0 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
207d0 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20  yAffinity(pRet, 
207e0 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
207f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20800 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20   return pRet;.  
20810 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20820 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   0;.}../*.** Con
20830 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61  figure SQL varia
20840 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74  ble iVar so that
20850 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76   binding a new v
20860 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61  alue to it signa
20870 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ls.** to sqlite3
20880 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68  _reoptimize() th
20890 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20  at re-preparing 
208a0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61  the statement ma
208b0 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  y result.** in a
208c0 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c   better query pl
208d0 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  an..*/.void sqli
208e0 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
208f0 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  k(Vdbe *v, int i
20900 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Var){.  assert( 
20910 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
20920 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76  iVar>32 ){.    v
20930 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66  ->expmask = 0xff
20940 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b  ffffff;.  }else{
20950 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
20960 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69  |= ((u32)1 << (i
20970 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Var-1));.  }.}..
20980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20990 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
209a0 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
209b0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
209c0 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74  xt from an sqlit
209d0 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20  e3_vtab.zErrMsg 
209e0 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20  (text stored.** 
209f0 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
20a00 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
20a10 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56  malloc) into a V
20a20 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  dbe.zErrMsg (tex
20a30 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
20a40 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
20a50 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
20a60 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  loc)..*/.void sq
20a70 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45  lite3VtabImportE
20a80 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73  rrmsg(Vdbe *p, s
20a90 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
20aa0 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ab){.  sqlite3 *
20ab0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71  db = p->db;.  sq
20ac0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
20ad0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
20ae0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
20af0 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
20b00 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
20b10 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
20b20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
20b30 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
20b40 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  g = 0;.}.#endif 
20b50 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
20b60 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a     IRTUALTABLE */.