/ Hex Artifact Content
Login

Artifact 27feae106f3f4db298e65d37a9da4962aaff724b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   );.  return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
0420: 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e 67  the error string
0430: 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65 2e   stored in Vdbe.
0440: 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64 20  zErrMsg.*/.void 
0450: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
0460: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0470: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
0480: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
0490: 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  p;.  sqlite3DbFr
04a0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45 72  ee(p->db, p->zEr
04b0: 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61 72  rMsg);.  va_star
04c0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
04d0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
04e0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
04f0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
0500: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
0510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  ;.}../*.** Remem
0520: 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69  ber the SQL stri
0530: 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65  ng for a prepare
0540: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  d statement..*/.
0550: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0560: 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20  SetSql(Vdbe *p, 
0570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
0580: 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70  nt n, int isPrep
0590: 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74  areV2){.  assert
05a0: 28 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31  ( isPrepareV2==1
05b0: 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d   || isPrepareV2=
05c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
05d0: 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64   ) return;.#if d
05e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
05f0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
0600: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
0610: 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66  BLE_SQLLOG).  if
0620: 28 20 21 69 73 50 72 65 70 61 72 65 56 32 20 29  ( !isPrepareV2 )
0630: 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a   return;.#endif.
0640: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
0650: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
0660: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
0670: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
0680: 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72  );.  p->isPrepar
0690: 65 56 32 20 3d 20 28 75 38 29 69 73 50 72 65 70  eV2 = (u8)isPrep
06a0: 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  areV2;.}../*.** 
06b0: 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61  Return the SQL a
06c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
06d0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
06e0: 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ent.*/.const cha
06f0: 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73  r *sqlite3_sql(s
0700: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
0710: 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d  mt){.  Vdbe *p =
0720: 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a   (Vdbe *)pStmt;.
0730: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 70    return (p && p
0740: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 29 20 3f  ->isPrepareV2) ?
0750: 20 70 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a   p->zSql : 0;.}.
0760: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20  ./*.** Swap all 
0770: 63 6f 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20  content between 
0780: 74 77 6f 20 56 44 42 45 20 73 74 72 75 63 74 75  two VDBE structu
0790: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
07a0: 69 74 65 33 56 64 62 65 53 77 61 70 28 56 64 62  ite3VdbeSwap(Vdb
07b0: 65 20 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29  e *pA, Vdbe *pB)
07c0: 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70  {.  Vdbe tmp, *p
07d0: 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d  Tmp;.  char *zTm
07e0: 70 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a  p;.  tmp = *pA;.
07f0: 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a    *pA = *pB;.  *
0800: 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70  pB = tmp;.  pTmp
0810: 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pA->pNext;.  
0820: 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e  pA->pNext = pB->
0830: 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65  pNext;.  pB->pNe
0840: 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d  xt = pTmp;.  pTm
0850: 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20  p = pA->pPrev;. 
0860: 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d   pA->pPrev = pB-
0870: 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50  >pPrev;.  pB->pP
0880: 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54  rev = pTmp;.  zT
0890: 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20  mp = pA->zSql;. 
08a0: 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e   pA->zSql = pB->
08b0: 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c  zSql;.  pB->zSql
08c0: 20 3d 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69   = zTmp;.  pB->i
08d0: 73 50 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d  sPrepareV2 = pA-
08e0: 3e 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a  >isPrepareV2;.}.
08f0: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68  ./*.** Resize th
0900: 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79  e Vdbe.aOp array
0910: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61   so that it is a
0920: 74 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d  t least nOp elem
0930: 65 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20  ents larger .** 
0940: 74 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74  than its current
0950: 20 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75   size. nOp is gu
0960: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
0970: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
0980: 6c 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a  l.** to 1024/siz
0990: 65 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49  eof(Op)..**.** I
09a0: 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  f an out-of-memo
09b0: 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ry error occurs 
09c0: 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74  while resizing t
09d0: 68 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e  he array, return
09e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
09f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56  . In this case V
0a00: 64 62 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73  dbe.aOp and Pars
0a10: 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69  e.nOpAlloc remai
0a20: 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  n .** unchanged 
0a30: 28 74 68 69 73 20 69 73 20 73 6f 20 74 68 61 74  (this is so that
0a40: 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72   any opcodes alr
0a50: 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63  eady allocated c
0a60: 61 6e 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63  an be .** correc
0a70: 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20  tly deallocated 
0a80: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72  along with the r
0a90: 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29  est of the Vdbe)
0aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0ab0: 67 72 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65  growOpArray(Vdbe
0ac0: 20 2a 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20   *v, int nOp){. 
0ad0: 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20   VdbeOp *pNew;. 
0ae0: 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70   Parse *p = v->p
0af0: 50 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65  Parse;..  /* The
0b00: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0b10: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70  LLOC_STRESS comp
0b20: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
0b30: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66  is designed to f
0b40: 6f 72 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66  orce.  ** more f
0b50: 72 65 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73  requent reallocs
0b60: 20 61 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69   and hence provi
0b70: 64 65 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  de more opportun
0b80: 69 74 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20  ities for .  ** 
0b90: 73 69 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61  simulated OOM fa
0ba0: 75 6c 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45  ults.  SQLITE_TE
0bb0: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
0bc0: 53 20 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75  S is generally u
0bd0: 73 65 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  sed.  ** during 
0be0: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57  testing only.  W
0bf0: 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  ith SQLITE_TEST_
0c00: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67  REALLOC_STRESS g
0c10: 72 6f 77 20 74 68 65 20 6f 70 20 61 72 72 61 79  row the op array
0c20: 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e  .  ** by the min
0c30: 69 6d 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71  imum* amount req
0c40: 75 69 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  uired until the 
0c50: 73 69 7a 65 20 72 65 61 63 68 65 73 20 35 31 32  size reaches 512
0c60: 2e 20 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f  .  Normal.  ** o
0c70: 70 65 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75  peration (withou
0c80: 74 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  t SQLITE_TEST_RE
0c90: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73  ALLOC_STRESS) is
0ca0: 20 74 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63   to double the c
0cb0: 75 72 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65  urrent.  ** size
0cc0: 20 6f 66 20 74 68 65 20 6f 70 20 61 72 72 61 79   of the op array
0cd0: 20 6f 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73   or add 1KB of s
0ce0: 70 61 63 65 2c 20 77 68 69 63 68 65 76 65 72 20  pace, whichever 
0cf0: 69 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23  is smaller. */.#
0d00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
0d10: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
0d20: 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70  .  int nNew = (p
0d30: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20  ->nOpAlloc>=512 
0d40: 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20  ? p->nOpAlloc*2 
0d50: 3a 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f  : p->nOpAlloc+nO
0d60: 70 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  p);.#else.  int 
0d70: 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c  nNew = (p->nOpAl
0d80: 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  loc ? p->nOpAllo
0d90: 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34  c*2 : (int)(1024
0da0: 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20  /sizeof(Op)));. 
0db0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
0dc0: 52 28 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  R(nOp);.#endif..
0dd0: 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28    assert( nOp<=(
0de0: 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29  1024/sizeof(Op))
0df0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
0e00: 65 77 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  ew>=(p->nOpAlloc
0e10: 2b 6e 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20  +nOp) );.  pNew 
0e20: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
0e30: 6f 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70  oc(p->db, v->aOp
0e40: 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70  , nNew*sizeof(Op
0e50: 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  ));.  if( pNew )
0e60: 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  {.    p->nOpAllo
0e70: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
0e80: 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70  locSize(p->db, p
0e90: 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b  New)/sizeof(Op);
0ea0: 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e  .    v->aOp = pN
0eb0: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
0ec0: 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f   (pNew ? SQLITE_
0ed0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  OK : SQLITE_NOME
0ee0: 4d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  M);.}..#ifdef SQ
0ef0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
0f10: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  st a convenient 
0f20: 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
0f30: 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77  reakpoint that w
0f40: 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65  ill.** fire afte
0f50: 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73  r each opcode is
0f60: 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69   inserted and di
0f70: 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a  splayed using.**
0f80: 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64   "PRAGMA vdbe_ad
0f90: 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f  doptrace=on"..*/
0fa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
0fb0: 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69  t_addop_breakpoi
0fc0: 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nt(void){.  stat
0fd0: 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  ic int n = 0;.  
0fe0: 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n++;.}.#endif../
0ff0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
1000: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
1010: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
1020: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
1030: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
1040: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
1050: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
1060: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
1070: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
1080: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
1090: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
10a0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
10b0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
10c0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
10d0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
10e0: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
10f0: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
1100: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
1110: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1120: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
1130: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
1140: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
1150: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
1160: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
1170: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
1180: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
1190: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69  ** operand..*/.i
11a0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
11b0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
11c0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
11d0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
11e0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
11f0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
1200: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
1210: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1220: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1230: 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f  ssert( op>0 && o
1240: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
1250: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1260: 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66  loc<=i ){.    if
1270: 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c  ( growOpArray(p,
1280: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   1) ){.      ret
1290: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
12a0: 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70  .  p->nOp++;.  p
12b0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
12c0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
12d0: 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e   (u8)op;.  pOp->
12e0: 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70  p5 = 0;.  pOp->p
12f0: 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70  1 = p1;.  pOp->p
1300: 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70  2 = p2;.  pOp->p
1310: 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70  3 = p3;.  pOp->p
1320: 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  4.p = 0;.  pOp->
1330: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
1340: 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  SED;.#ifdef SQLI
1350: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
1360: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70  N_COMMENTS.  pOp
1370: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
1380: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1390: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
13a0: 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20   p->db->flags & 
13b0: 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
13c0: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74  Trace ){.    int
13d0: 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72   jj, kk;.    Par
13e0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
13f0: 70 50 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28  pParse;.    for(
1400: 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49  jj=kk=0; jj<SQLI
1410: 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a  TE_N_COLCACHE; j
1420: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  j++){.      stru
1430: 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20  ct yColCache *x 
1440: 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
1450: 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20  che + jj;.      
1460: 69 66 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50  if( x->iLevel>pP
1470: 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1480: 6c 20 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20  l || x->iReg==0 
1490: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14a0: 20 20 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d    printf(" r[%d]
14b0: 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52  ={%d:%d}", x->iR
14c0: 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78  eg, x->iTable, x
14d0: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
14e0: 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20    kk++;.    }.  
14f0: 20 20 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74    if( kk ) print
1500: 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c  f("\n");.    sql
1510: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
1520: 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  0, i, &p->aOp[i]
1530: 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f  );.    test_addo
1540: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a  p_breakpoint();.
1550: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
1560: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
1570: 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30   pOp->cycles = 0
1580: 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30  ;.  pOp->cnt = 0
1590: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
15a0: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
15b0: 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63  RAGE.  pOp->iSrc
15c0: 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Line = 0;.#endif
15d0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69  .  return i;.}.i
15e0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
15f0: 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp0(Vdbe *p, in
1600: 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  t op){.  return 
1610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1620: 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30  3(p, op, 0, 0, 0
1630: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1640: 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20  VdbeAddOp1(Vdbe 
1650: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1660: 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p1){.  return sq
1670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1680: 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29  p, op, p1, 0, 0)
1690: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
16a0: 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a  dbeAddOp2(Vdbe *
16b0: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
16c0: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65  1, int p2){.  re
16d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
16e0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
16f0: 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  , p2, 0);.}.../*
1700: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
1710: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
1720: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
1730: 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  a pointer..*/.in
1740: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1750: 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Op4(.  Vdbe *p, 
1760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1770: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
1780: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1790: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
17a0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
17b0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17d0: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
17e0: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
17f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1800: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1810: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1820: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
1830: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  and */.  const c
1840: 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20  har *zP4,    /* 
1850: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
1860: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
1870: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
1880: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
1890: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
18a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18b0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
18c0: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
18d0: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
18e0: 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b  r, zP4, p4type);
18f0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1900: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1910: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1920: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1930: 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36  e with a P4_INT6
1940: 34 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73  4 type..*/.int s
1950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1960: 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c  Dup8(.  Vdbe *p,
1970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1980: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1990: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
19a0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
19b0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
19c0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e0: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
19f0: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1a00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1a10: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1a20: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1a30: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1a40: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1a50: 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a  u8 *zP4,      /*
1a60: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1a70: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
1a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
1a90: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
1aa0: 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79  {.  char *p4copy
1ab0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1ac0: 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62  ocRaw(sqlite3Vdb
1ad0: 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66  eDb(p), 8);.  if
1ae0: 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70  ( p4copy ) memcp
1af0: 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38  y(p4copy, zP4, 8
1b00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1b10: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
1b20: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c   op, p1, p2, p3,
1b30: 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29   p4copy, p4type)
1b40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1b50: 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  n OP_ParseSchema
1b60: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
1b70: 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e  outine is broken
1b80: 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c   out from.** sql
1b90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29  ite3VdbeAddOp4()
1ba0: 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20   since it needs 
1bb0: 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f  to also needs to
1bc0: 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73   mark all btrees
1bd0: 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65  .** as having be
1be0: 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  en used..**.** T
1bf0: 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67  he zWhere string
1c00: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1c10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1c20: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
1c30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c40: 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73  will take owners
1c50: 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  hip of the alloc
1c60: 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  ated memory..*/.
1c70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1c80: 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
1c90: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
1ca0: 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29  b, char *zWhere)
1cb0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74  {.  int j;.  int
1cc0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1cd0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f  dbeAddOp3(p, OP_
1ce0: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
1cf0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
1d00: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
1d10: 2c 20 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20  , addr, zWhere, 
1d20: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66  P4_DYNAMIC);.  f
1d30: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d  or(j=0; j<p->db-
1d40: 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74  >nDb; j++) sqlit
1d50: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
1d60: 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, j);.}../*.** 
1d70: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1d80: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1d90: 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69  p4 value as an i
1da0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  nteger..*/.int s
1db0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1dc0: 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Int(.  Vdbe *p, 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1de0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
1df0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1e00: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1e10: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
1e20: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e40: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
1e50: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
1e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1e70: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1e80: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1e90: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
1ea0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20  and */.  int p4 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61  The P4 operand a
1ed0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1ee0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
1ef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f00: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1f10: 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p3);.  sqlite3V
1f20: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1f30: 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ddr, SQLITE_INT_
1f40: 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49  TO_PTR(p4), P4_I
1f50: 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  NT32);.  return 
1f60: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
1f70: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
1f80: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
1f90: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1fa0: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1fb0: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
1fc0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
1fd0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
1fe0: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1ff0: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
2000: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
2010: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
2020: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
2030: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
2040: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
2050: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
2060: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
2070: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
2080: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
2090: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
20a0: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
20b0: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
20c0: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
20d0: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
20e0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
20f0: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
2100: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
2110: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
2120: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
2130: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
2140: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
2150: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
2160: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
2170: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
2180: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
2190: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
21a0: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
21b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
21c0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
21d0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
21e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
21f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
2200: 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *v){.  Parse *p
2210: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
2220: 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65  int i = p->nLabe
2230: 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76  l++;.  assert( v
2240: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2250: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2260: 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30  ( (i & (i-1))==0
2270: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
2280: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
2290: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
22a0: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20  , p->aLabel, .  
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a       (i*2+1)*siz
22e0: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
22f0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
2300: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
2310: 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31  ->aLabel[i] = -1
2320: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
2330: 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  1-i;.}../*.** Re
2340: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
2350: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
2360: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2370: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
2380: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
2390: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
23a0: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
23b0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
23c0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
23d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
23e0: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  abel()..*/.void 
23f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2400: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c  veLabel(Vdbe *v,
2410: 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65   int x){.  Parse
2420: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
2430: 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b  .  int j = -1-x;
2440: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
2450: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2460: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
2470: 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  ( j<p->nLabel );
2480: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6a 3e  .  if( ALWAYS(j>
2490: 3d 30 29 20 26 26 20 70 2d 3e 61 4c 61 62 65 6c  =0) && p->aLabel
24a0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
24b0: 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  l[j] = v->nOp;. 
24c0: 20 7d 0a 20 20 70 2d 3e 69 46 69 78 65 64 4f 70   }.  p->iFixedOp
24d0: 20 3d 20 76 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d   = v->nOp - 1;.}
24e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
24f0: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
2500: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
2510: 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76  n one time..*/.v
2520: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
2530: 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20  unOnlyOnce(Vdbe 
2540: 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c  *p){.  p->runOnl
2550: 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69  yOnce = 1;.}..#i
2560: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2570: 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65  G /* sqlite3Asse
2580: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67  rtMayAbort() log
2590: 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ic */../*.** The
25a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
25b0: 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  and function are
25c0: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
25d0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
25e0: 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62  odes.** in a Vdb
25f0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61  e main program a
2600: 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73  nd each of the s
2610: 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69  ub-programs (tri
2620: 67 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a  ggers) it may .*
2630: 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c  * invoke directl
2640: 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e  y or indirectly.
2650: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73   It should be us
2660: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
2670: 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  *.**   Op *pOp;.
2680: 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20  **   VdbeOpIter 
2690: 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d  sIter;.**.**   m
26a0: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
26b0: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
26c0: 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20  .**   sIter.v = 
26d0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
26f0: 20 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64   v is of type Vd
2700: 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28  be* .**   while(
2710: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65   (pOp = opIterNe
2720: 78 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a  xt(&sIter)) ){.*
2730: 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65  *     // Do some
2740: 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a  thing with pOp.*
2750: 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74  *   }.**   sqlit
2760: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
2770: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a  sIter.apSub);.**
2780: 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72   .*/.typedef str
2790: 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56  uct VdbeOpIter V
27a0: 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63  dbeOpIter;.struc
27b0: 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20  t VdbeOpIter {. 
27c0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
27e0: 64 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74  dbe to iterate t
27f0: 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64  hrough the opcod
2800: 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72  es of */.  SubPr
2810: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20  ogram **apSub;  
2820: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2830: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  f subprograms */
2840: 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20  .  int nSub;    
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2860: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2870: 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20  es in apSub */. 
2880: 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20   int iAddr;     
2890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
28a0: 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69  ddress of next i
28b0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65  nstruction to re
28c0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  turn */.  int iS
28d0: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
28e0: 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e       /* 0 = main
28f0: 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69   program, 1 = fi
2900: 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  rst sub-program 
2910: 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69  etc. */.};.stati
2920: 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74  c Op *opIterNext
2930: 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b  (VdbeOpIter *p){
2940: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e  .  Vdbe *v = p->
2950: 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20  v;.  Op *pRet = 
2960: 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20  0;.  Op *aOp;.  
2970: 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20  int nOp;..  if( 
2980: 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62  p->iSub<=p->nSub
2990: 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   ){..    if( p->
29a0: 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iSub==0 ){.     
29b0: 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20   aOp = v->aOp;. 
29c0: 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f       nOp = v->nO
29d0: 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
29e0: 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53      aOp = p->apS
29f0: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61  ub[p->iSub-1]->a
2a00: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
2a10: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
2a20: 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  -1]->nOp;.    }.
2a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
2a40: 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20  Addr<nOp );..   
2a50: 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e   pRet = &aOp[p->
2a60: 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69  iAddr];.    p->i
2a70: 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Addr++;.    if( 
2a80: 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b  p->iAddr==nOp ){
2a90: 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b  .      p->iSub++
2aa0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72  ;.      p->iAddr
2ab0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 0;.    }.  . 
2ac0: 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74     if( pRet->p4t
2ad0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
2ae0: 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AM ){.      int 
2af0: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62  nByte = (p->nSub
2b00: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
2b10: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69  ogram*);.      i
2b20: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
2b30: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20  j=0; j<p->nSub; 
2b40: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
2b50: 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70  ( p->apSub[j]==p
2b60: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  Ret->p4.pProgram
2b70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2b80: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  }.      if( j==p
2b90: 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ->nSub ){.      
2ba0: 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c    p->apSub = sql
2bb0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
2bc0: 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70  ree(v->db, p->ap
2bd0: 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Sub, nByte);.   
2be0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53       if( !p->apS
2bf0: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
2c00: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
2c10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c20: 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e     p->apSub[p->n
2c30: 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70  Sub++] = pRet->p
2c40: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
2c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2c70: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
2c80: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72   Check if the pr
2c90: 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20  ogram stored in 
2ca0: 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65  the VM associate
2cb0: 64 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61  d with pParse ma
2cc0: 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42  y.** throw an AB
2cd0: 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63  ORT exception (c
2ce0: 61 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65  ausing the state
2cf0: 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e  ment, but not en
2d00: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2d10: 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  .** to be rolled
2d20: 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e   back). This con
2d30: 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69  dition is true i
2d40: 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  f the main progr
2d50: 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62  am or any.** sub
2d60: 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69  -programs contai
2d70: 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  ns any of the fo
2d80: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2d90: 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68   *  OP_Halt with
2da0: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
2db0: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
2dc0: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
2dd0: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74  P_HaltIfNull wit
2de0: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
2df0: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
2e00: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
2e10: 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20  OP_Destroy.**   
2e20: 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a  *  OP_VUpdate.**
2e30: 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65     *  OP_VRename
2e40: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f  .**   *  OP_FkCo
2e50: 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30  unter with P2==0
2e60: 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65   (immediate fore
2e70: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
2e80: 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43  nt).**   *  OP_C
2e90: 72 65 61 74 65 54 61 62 6c 65 20 61 6e 64 20 4f  reateTable and O
2ea0: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  P_InitCoroutine 
2eb0: 28 66 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c  (for CREATE TABL
2ec0: 45 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29  E AS SELECT ...)
2ed0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63  .**.** Then chec
2ee0: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
2ef0: 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f   of Parse.mayAbo
2f00: 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e  rt is true if an
2f10: 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65  .** ABORT may be
2f20: 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73   thrown, or fals
2f30: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74  e otherwise. Ret
2f40: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
2f50: 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72  oes.** match, or
2f60: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
2f70: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2f80: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
2f90: 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72  e used as.** par
2fa0: 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73  t of an assert s
2fb0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
2fc0: 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61  compiler. Simila
2fd0: 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  r to:.**.**   as
2fe0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
2ff0: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
3000: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
3010: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
3020: 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   );.*/.int sqlit
3030: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
3040: 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e  bort(Vdbe *v, in
3050: 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69  t mayAbort){.  i
3060: 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b  nt hasAbort = 0;
3070: 0a 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e  .  int hasFkCoun
3080: 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ter = 0;.  int h
3090: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  asCreateTable = 
30a0: 30 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74  0;.  int hasInit
30b0: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20  Coroutine = 0;. 
30c0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65   Op *pOp;.  Vdbe
30d0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20  OpIter sIter;.  
30e0: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
30f0: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
3100: 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  ;.  sIter.v = v;
3110: 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  ..  while( (pOp 
3120: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
3130: 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ter))!=0 ){.    
3140: 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70  int opcode = pOp
3150: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66  ->opcode;.    if
3160: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73  ( opcode==OP_Des
3170: 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  troy || opcode==
3180: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
3190: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
31a0: 20 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f   .     || ((opco
31b0: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
31c0: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
31d0: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
31e0: 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d  ((pOp->p1&0xff)=
31f0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
3200: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
3210: 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b  E_Abort)).    ){
3220: 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20  .      hasAbort 
3230: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
3240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3250: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74  opcode==OP_Creat
3260: 65 54 61 62 6c 65 20 29 20 68 61 73 43 72 65 61  eTable ) hasCrea
3270: 74 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  teTable = 1;.   
3280: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3290: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20  InitCoroutine ) 
32a0: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
32b0: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
32c0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
32d0: 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70  N_KEY.    if( op
32e0: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
32f0: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
3300: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29   && pOp->p2==1 )
3310: 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75  {.      hasFkCou
3320: 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  nter = 1;.    }.
3330: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
3340: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
3350: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
3360: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
3370: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
3380: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
3390: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
33a0: 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49  occurred..  ** I
33b0: 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c  f malloc failed,
33c0: 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28   then the while(
33d0: 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79  ) loop above may
33e0: 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74   not have iterat
33f0: 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ed.  ** through 
3400: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  all opcodes and 
3410: 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20  hasAbort may be 
3420: 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  set incorrectly.
3430: 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75   Return.  ** tru
3440: 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20  e for this case 
3450: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61  to prevent the a
3460: 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63  ssert() in the c
3470: 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a  allers frame.  *
3480: 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20  * from failing. 
3490: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76   */.  return ( v
34a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
34b0: 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d  ed || hasAbort==
34c0: 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46  mayAbort || hasF
34d0: 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20  kCounter.       
34e0: 20 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72         || (hasCr
34f0: 65 61 74 65 54 61 62 6c 65 20 26 26 20 68 61 73  eateTable && has
3500: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29  InitCoroutine) )
3510: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
3520: 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65  LITE_DEBUG - the
3530: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
3540: 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f  yAbort() functio
3550: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70  n */../*.** Loop
3560: 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f   through the pro
3570: 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  gram looking for
3580: 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20   P2 values that 
3590: 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  are negative.** 
35a0: 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  on jump instruct
35b0: 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68  ions.  Each such
35c0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
35d0: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a  l.  Resolve the.
35e0: 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  ** label by sett
35f0: 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65  ing the P2 value
3600: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
3610: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
3620: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3630: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
3640: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
3650: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
3660: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
3670: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
3680: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
3690: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
36a0: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
36b0: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
36c0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67  _Function, OP_Ag
36d0: 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c  gStep or OP_VFil
36e0: 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  ter opcode. This
36f0: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
3700: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
3710: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
3720: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
3730: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
3740: 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c   Op.opflags fiel
3750: 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20  d is set on all 
3760: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  opcodes..*/.stat
3770: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
3780: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
3790: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
37a0: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
37b0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
37c0: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
37d0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65  Op *pOp;.  Parse
37e0: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
37f0: 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  arse;.  int *aLa
3800: 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c  bel = pParse->aL
3810: 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f  abel;.  p->readO
3820: 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49  nly = 1;.  p->bI
3830: 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66  sReader = 0;.  f
3840: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
3850: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
3860: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
3870: 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f    u8 opcode = pO
3880: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20  p->opcode;..    
3890: 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65  /* NOTE: Be sure
38a0: 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63   to update mkopc
38b0: 6f 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64  odeh.awk when ad
38c0: 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67  ding or removing
38d0: 0a 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72  .    ** cases fr
38e0: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
38f0: 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  */.    switch( o
3900: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63  pcode ){.      c
3910: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
3920: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  on: {.        if
3930: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
3940: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
3950: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
3960: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  thru */.      }.
3970: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75        case OP_Au
3980: 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20  toCommit:.      
3990: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
39a0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  t: {.        p->
39b0: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
39c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
39d0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
39e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
39f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
3a00: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
3a10: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
3a20: 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  uum:.      case 
3a30: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20  OP_JournalMode: 
3a40: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61  {.        p->rea
3a50: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
3a60: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
3a70: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3a80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
3a90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3aa0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
3ab0: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61     case OP_VUpda
3ac0: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  te: {.        if
3ad0: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
3ae0: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
3af0: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
3b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3b10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46        case OP_VF
3b20: 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20  ilter: {.       
3b30: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
3b40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
3b50: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
3b60: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
3b70: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
3b80: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
3b90: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
3ba0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  .        if( n>n
3bb0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
3bc0: 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  gs = n;.        
3bd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
3be0: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
3bf0: 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20   OP_Next:.      
3c00: 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70  case OP_NextIfOp
3c10: 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  en:.      case O
3c20: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
3c30: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
3c40: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3c50: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
3c60: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3c70: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
3c80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3c90: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3ca0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
3cb0: 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70  case OP_PrevIfOp
3cc0: 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  en: {.        pO
3cd0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
3ce0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
3cf0: 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70  vious;.        p
3d00: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3d10: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
3d20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3d30: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e      }..    pOp->
3d40: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  opflags = sqlite
3d50: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
3d60: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28  opcode];.    if(
3d70: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
3d80: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
3d90: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
3da0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31        assert( -1
3db0: 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73 65 2d  -pOp->p2<pParse-
3dc0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
3dd0: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
3de0: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
3df0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
3e00: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
3e10: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b  pParse->aLabel);
3e20: 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  .  pParse->aLabe
3e30: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  l = 0;.  pParse-
3e40: 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >nLabel = 0;.  *
3e50: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
3e60: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
3e70: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
3e80: 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a  =0 || DbMaskAllZ
3e90: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
3ea0: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ) );.}../*.** Re
3eb0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
3ec0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3ed0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
3ee0: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
3ef0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3f00: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
3f10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3f20: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3f30: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
3f40: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
3f50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3f60: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
3f70: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
3f80: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69  f opcodes associ
3f90: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
3fa0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
3fb0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
3fc0: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  nt. It is the ca
3fd0: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
3fe0: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e  lity.** to arran
3ff0: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ge for the retur
4000: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20  ned array to be 
4010: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
4020: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76   using the .** v
4030: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29  dbeFreeOpArray()
4040: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
4050: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
4060: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20  g, *pnOp is set 
4070: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
4080: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
4090: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61  returned.** arra
40a0: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41  y. Also, *pnMaxA
40b0: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  rg is set to the
40c0: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63   larger of its c
40d0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
40e0: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20   .** the number 
40f0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
4100: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
4110: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f  rray required to
4120: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a   execute the .**
4130: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61   returned progra
4140: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  m..*/.VdbeOp *sq
4150: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41  lite3VdbeTakeOpA
4160: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
4170: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e  t *pnOp, int *pn
4180: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f  MaxArg){.  VdbeO
4190: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
41a0: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26  .  assert( aOp &
41b0: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  & !p->db->malloc
41c0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20  Failed );..  /* 
41d0: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74  Check that sqlit
41e0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
41f0: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
4200: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   on this VM */. 
4210: 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41   assert( DbMaskA
4220: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
4230: 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ask) );..  resol
4240: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e  veP2Values(p, pn
4250: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70  MaxArg);.  *pnOp
4260: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
4270: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  aOp = 0;.  retur
4280: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aOp;.}../*.** 
4290: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
42a0: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
42b0: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
42c0: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74  stack.  Return t
42d0: 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  he.** address of
42e0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
42f0: 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69  tion added..*/.i
4300: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
4310: 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c  dOpList(Vdbe *p,
4320: 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70   int nOp, VdbeOp
4330: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c  List const *aOp,
4340: 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20   int iLineno){. 
4350: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
4360: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
4370: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
4380: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
4390: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65   nOp > p->pParse
43a0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
43b0: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70  owOpArray(p, nOp
43c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
43d0: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
43e0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c  p->nOp;.  if( AL
43f0: 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20  WAYS(nOp>0) ){. 
4400: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
4410: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
4420: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
4430: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
4440: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
4450: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
4460: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
4470: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
4480: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
4490: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
44a0: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
44b0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
44c0: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p1;.      if( 
44d0: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p2<0 ){.        
44e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
44f0: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
4500: 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  ut->opcode] & OP
4510: 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20  FLG_JUMP );.    
4520: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
4530: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a  ddr + ADDR(p2);.
4540: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4550: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
4560: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
4570: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
4580: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
4590: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
45a0: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75  TUSED;.      pOu
45b0: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
45c0: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
45d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
45e0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
45f0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70 4f 75  MMENTS.      pOu
4600: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
4610: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4620: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
4630: 41 47 45 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  AGE.      pOut->
4640: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
4650: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20  no+i;.#else.    
4660: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
4670: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4680: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
4690: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
46a0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
46b0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
46c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
46d0: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64  ePrintOp(0, i+ad
46e0: 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  dr, &p->aOp[i+ad
46f0: 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  dr]);.      }.#e
4700: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
4710: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
4720: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
4730: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
4740: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
4750: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f  MT_SCANSTATUS)./
4760: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72  *.** Add an entr
4770: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  y to the array o
4780: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67  f counters manag
4790: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74  ed by sqlite3_st
47a0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e  mt_scanstatus().
47b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
47c0: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a  VdbeScanStatus(.
47d0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73    /* VM to add s
4800: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a  canstatus() to *
4810: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c  /.  int addrExpl
4820: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
4830: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4840: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72  f OP_Explain (or
4850: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64   0) */.  int add
4860: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  rLoop,          
4870: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
4880: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e  ess of loop coun
4890: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64  ter */ .  int ad
48a0: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20  drVisit,        
48b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
48c0: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73  ress of rows vis
48d0: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ited counter */.
48e0: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20    LogEst nEst,  
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
4910: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
4920: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rows */.  const 
4930: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
4940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
4950: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e  e of table or in
4960: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  dex being scanne
4970: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  d */.){.  int nB
4980: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b  yte = (p->nScan+
4990: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e  1) * sizeof(Scan
49a0: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53  Status);.  ScanS
49b0: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61  tatus *aNew;.  a
49c0: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75  New = (ScanStatu
49d0: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c  s*)sqlite3DbReal
49e0: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53  loc(p->db, p->aS
49f0: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  can, nByte);.  i
4a00: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53  f( aNew ){.    S
4a10: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20  canStatus *pNew 
4a20: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e  = &aNew[p->nScan
4a30: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ++];.    pNew->a
4a40: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64  ddrExplain = add
4a50: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e  rExplain;.    pN
4a60: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61  ew->addrLoop = a
4a70: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65  ddrLoop;.    pNe
4a80: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61  w->addrVisit = a
4a90: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e  ddrVisit;.    pN
4aa0: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b  ew->nEst = nEst;
4ab0: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  .    pNew->zName
4ac0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
4ad0: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  up(p->db, zName)
4ae0: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d  ;.    p->aScan =
4af0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   aNew;.  }.}.#en
4b00: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
4b10: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
4b20: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
4b30: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
4b40: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
4b50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4b60: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
4b70: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
4b80: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
4b90: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
4ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4bb0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
4bc0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
4bd0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
4be0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
4bf0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4c00: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
4c10: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
4c20: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
4c30: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
4c40: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
4c50: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4c60: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
4c70: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4c80: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4c90: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
4ca0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
4cb0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
4cc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4cd0: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
4ce0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
4cf0: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
4d00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4d10: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
4d20: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
4d30: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4d40: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4d50: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4d60: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4d70: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
4d80: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4d90: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4da0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
4db0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
4dc0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
4dd0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4de0: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
4df0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
4e00: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4e10: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
4e20: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
4e30: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
4e40: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
4e50: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4e60: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
4e70: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
4e80: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
4e90: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
4ea0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4eb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
4ec0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
4ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
4ee0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
4ef0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4f00: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
4f10: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
4f20: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
4f30: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4f40: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4f50: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
4f60: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
4f70: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
4f80: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
4f90: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
4fa0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
4fb0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
4fc0: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
4fd0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
4fe0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4ff0: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
5000: 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69  ;.  p->pParse->i
5010: 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70  FixedOp = p->nOp
5020: 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   - 1;.}.../*.** 
5030: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
5040: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
5050: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
5060: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
5070: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
5080: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
5090: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
50a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
50b0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
50c0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
50d0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
50e0: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
50f0: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66  Def) && (pDef->f
5100: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
5110: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
5120: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
5130: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
5140: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
5150: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
5160: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
5170: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
5180: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
5190: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
51a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
51b0: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
51c0: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
51d0: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
51e0: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65  ( p4 ){.    asse
51f0: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77  rt( db );.    sw
5200: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
5210: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
5220: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 20  NCCTX: {.       
5230: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
5240: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 28 73 71 6c  nction(db, ((sql
5250: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
5260: 29 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  )->pFunc);.     
5270: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5280: 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  gh into the next
5290: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d   case */.      }
52a0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
52b0: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
52c0: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
52d0: 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a  case P4_DYNAMIC:
52e0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
52f0: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
5300: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5310: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
5320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5330: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
5340: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
5350: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5360: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
5370: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
5380: 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20  (KeyInfo*)p4);. 
5390: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
53a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
53b0: 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20   P4_MPRINTF: {. 
53c0: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
53d0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
53e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34   sqlite3_free(p4
53f0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5410: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
5420: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
5430: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
5440: 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70  (db, (FuncDef*)p
5450: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5460: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5470: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
5480: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
5490: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
54a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
54b0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
54c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34  qlite3_value*)p4
54d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
54e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20  {.          Mem 
54f0: 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20  *p = (Mem*)p4;. 
5500: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
5510: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
5520: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
5530: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
5540: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5550: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
5560: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
5570: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5580: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
5590: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
55a0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
55b0: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
55c0: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
55d0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
55e0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
55f0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
5600: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
5610: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
5620: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
5630: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
5640: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
5650: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
5660: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
5670: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
5680: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
5690: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
56a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
56b0: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
56c0: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
56d0: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
56e0: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
56f0: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
5700: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
5710: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
5720: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
5730: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
5740: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
5750: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
5760: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
5770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
5780: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f  ree(db, pOp->zCo
5790: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20  mment);.#endif  
57a0: 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
57b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
57c0: 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , aOp);.}../*.**
57d0: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
57e0: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
57f0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
5800: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
5810: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
5820: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
5830: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
5840: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
5850: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
5860: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
5870: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
5880: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
5890: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
58a0: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
58b0: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
58c0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
58d0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
58e0: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
58f0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
5900: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
5910: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
5920: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
5930: 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Noop.*/.void sql
5940: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
5950: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
5960: 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 61  t addr){.  if( a
5970: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ddr<p->nOp ){.  
5980: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
5990: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
59a0: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
59b0: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65 65   p->db;.    free
59c0: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
59d0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
59e0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20      memset(pOp, 
59f0: 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d  0, sizeof(pOp[0]
5a00: 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63  ));.    pOp->opc
5a10: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
5a20: 20 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d 3e     if( addr==p->
5a30: 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d 2d  nOp-1 ) p->nOp--
5a40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
5a50: 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64  f the last opcod
5a60: 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74  e is "op" and it
5a70: 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64   is not a jump d
5a80: 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74  estination,.** t
5a90: 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20  hen remove it.  
5aa0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
5ab0: 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70  nd only if an op
5ac0: 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64  code was removed
5ad0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5ae0: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
5af0: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
5b00: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d  8 op){.  if( (p-
5b10: 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72  >nOp-1)>(p->pPar
5b20: 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26  se->iFixedOp) &&
5b30: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5b40: 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a  ].opcode==op ){.
5b50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5b60: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70  hangeToNoop(p, p
5b70: 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65  ->nOp-1);.    re
5b80: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
5b90: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5ba0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
5bb0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
5bc0: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
5bd0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
5be0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
5bf0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5c00: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
5c10: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
5c20: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
5c30: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
5c40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c50: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
5c60: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
5c70: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
5c80: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
5c90: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
5ca0: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
5cb0: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
5cc0: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
5cd0: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
5ce0: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
5cf0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
5d00: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
5d10: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
5d20: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
5d30: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
5d40: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
5d50: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
5d60: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
5d70: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
5d80: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
5d90: 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  4..** .** Other 
5da0: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
5db0: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
5dc0: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
5dd0: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
5de0: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
5df0: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
5e00: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
5e10: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
5e20: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
5e30: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
5e40: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
5e50: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
5e60: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
5e70: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
5e80: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
5e90: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
5ea0: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
5eb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5ec0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
5ed0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
5ee0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
5ef0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
5f00: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
5f10: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
5f20: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
5f30: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
5f40: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5f50: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
5f60: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62   p->aOp==0 || db
5f70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5f80: 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f  {.    if( n!=P4_
5f90: 56 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72  VTAB ){.      fr
5fa0: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
5fb0: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
5fc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
5fd0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
5fe0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
5ff0: 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d   assert( addr<p-
6000: 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64  >nOp );.  if( ad
6010: 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72  dr<0 ){.    addr
6020: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
6030: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
6040: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65  Op[addr];.  asse
6050: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
6060: 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20  =P4_NOTUSED.    
6070: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
6080: 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20  e==P4_INT32.    
6090: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
60a0: 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b  e==P4_KEYINFO );
60b0: 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f  .  freeP4(db, pO
60c0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
60d0: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
60e0: 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d  .p = 0;.  if( n=
60f0: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
6100: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
6110: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
6120: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
6130: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
6140: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
6150: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
6160: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
6170: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
6180: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
6190: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
61a0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
61b0: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
61c0: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
61d0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
61e0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
61f0: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
6200: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
6210: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70  KEYINFO ){.    p
6220: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
6230: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
6240: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
6250: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
6260: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n==P4_VTAB ){. 
6270: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
6280: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
6290: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
62a0: 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65  VTAB;.    sqlite
62b0: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
62c0: 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73  e *)zP4);.    as
62d0: 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a  sert( ((VTable *
62e0: 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62  )zP4)->db==p->db
62f0: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
6300: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
6310: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
6320: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
6330: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
6340: 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r)n;.  }else{.  
6350: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
6360: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6370: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
6380: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
6390: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
63a0: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
63b0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
63c0: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  AMIC;.  }.}../*.
63d0: 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e  ** Set the P4 on
63e0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
63f0: 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20  ly added opcode 
6400: 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66  to the KeyInfo f
6410: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  or the.** index 
6420: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
6430: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
6440: 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
6450: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
6460: 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  x){.  Vdbe *v = 
6470: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
6480: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
6490: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
64a0: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
64b0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
64c0: 31 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  1, (char*)sqlite
64d0: 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
64e0: 70 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20  pParse, pIdx),. 
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6500: 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
6510: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
6520: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
6530: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a  N_COMMENTS./*.**
6540: 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d   Change the comm
6550: 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  ent on the most 
6560: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
6570: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a  nstruction.  Or.
6580: 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f  ** insert a No-o
6590: 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f  p and add the co
65a0: 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65  mment to that ne
65b0: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  w instruction.  
65c0: 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68  This.** makes th
65d0: 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f  e code easier to
65e0: 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62   read during deb
65f0: 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66  ugging.  None of
6600: 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a   this happens.**
6610: 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   in a production
6620: 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
6630: 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d  c void vdbeVComm
6640: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
6650: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
6660: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
6670: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
6680: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
6690: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
66a0: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
66b0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
66c0: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
66d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
66e0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a    if( p->nOp ){.
66f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
6700: 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Op );.    sqlite
6710: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
6720: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
6730: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70  zComment);.    p
6740: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
6750: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74  zComment = sqlit
6760: 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62  e3VMPrintf(p->db
6770: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
6780: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
6790: 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64  e3VdbeComment(Vd
67a0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
67b0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
67c0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
67d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76    if( p ){.    v
67e0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
67f0: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
6800: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
6810: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
6820: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  nd(ap);.  }.}.vo
6830: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f  id sqlite3VdbeNo
6840: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  opComment(Vdbe *
6850: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
6860: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
6870: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
6880: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
6890: 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20  e3VdbeAddOp0(p, 
68a0: 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61  OP_Noop);.    va
68b0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
68c0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
68d0: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
68e0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
68f0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
6900: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
6910: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
6920: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f  _VDBE_COVERAGE./
6930: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
6940: 75 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69  ue if the iSrcLi
6950: 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65  ne field for the
6960: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65   previously code
6970: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
6980: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6990: 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28  beSetLineNumber(
69a0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69  Vdbe *v, int iLi
69b0: 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  ne){.  sqlite3Vd
69c0: 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69  beGetOp(v,-1)->i
69d0: 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b  SrcLine = iLine;
69e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
69f0: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
6a00: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E */../*.** Retu
6a10: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
6a20: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
6a30: 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65  s.  If the addre
6a40: 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a  ss is -1, then.*
6a50: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * return the mos
6a60: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
6a70: 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ted opcode..**.*
6a80: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
6a90: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
6aa0: 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f  as occurred prio
6ab0: 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67  r to the calling
6ac0: 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   of this.** rout
6ad0: 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ine, then a poin
6ae0: 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56  ter to a dummy V
6af0: 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65  dbeOp will be re
6b00: 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70  turned.  That op
6b10: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61  code.** is reada
6b20: 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74  ble but not writ
6b30: 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20  able, though it 
6b40: 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69  is cast to a wri
6b50: 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20  table value..** 
6b60: 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20  The return of a 
6b70: 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c  dummy opcode all
6b80: 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ows the call to 
6b90: 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f  continue functio
6ba0: 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e  ning.** after an
6bb0: 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f   OOM fault witho
6bc0: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65  ut having to che
6bd0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
6be0: 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a   return from .**
6bf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6c00: 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
6c10: 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
6c20: 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20  he dummy.opcode 
6c30: 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77  is 0,.** dummy w
6c40: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69  ill never be wri
6c50: 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69  tten to.  This i
6c60: 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f  s verified by co
6c70: 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e  de inspection an
6c80: 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20  d.** by running 
6c90: 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a  with Valgrind..*
6ca0: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
6cb0: 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20  3VdbeGetOp(Vdbe 
6cc0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
6cd0: 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65   /* C89 specifie
6ce0: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74  s that the const
6cf0: 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c  ant "dummy" will
6d00: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
6d10: 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f  to all.  ** zero
6d20: 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72  s, which is corr
6d30: 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72  ect.  MSVC gener
6d40: 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20  ates a warning, 
6d50: 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f  nevertheless. */
6d60: 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70  .  static VdbeOp
6d70: 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f   dummy;  /* Igno
6d80: 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e  re the MSVC warn
6d90: 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69  ing about no ini
6da0: 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73  tializer */.  as
6db0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
6dc0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
6dd0: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
6de0: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
6df0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
6e00: 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30  assert( (addr>=0
6e10: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
6e20: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
6e30: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
6e40: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6e50: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
6e60: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
6e70: 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  my;.  }else{.   
6e80: 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b   return &p->aOp[
6e90: 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  addr];.  }.}..#i
6ea0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6eb0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
6ec0: 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20  COMMENTS)./*.** 
6ed0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
6ee0: 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20  r value for one 
6ef0: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
6f00: 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20  s to the opcode 
6f10: 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  pOp.** determine
6f20: 64 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63  d by character c
6f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6f40: 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20  translateP(char 
6f50: 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70  c, const Op *pOp
6f60: 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20  ){.  if( c=='1' 
6f70: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31  ) return pOp->p1
6f80: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29  ;.  if( c=='2' )
6f90: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b   return pOp->p2;
6fa0: 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20  .  if( c=='3' ) 
6fb0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a  return pOp->p3;.
6fc0: 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72    if( c=='4' ) r
6fd0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b  eturn pOp->p4.i;
6fe0: 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70  .  return pOp->p
6ff0: 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  5;.}../*.** Comp
7000: 75 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72  ute a string for
7010: 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66   the "comment" f
7020: 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f  ield of a VDBE o
7030: 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a  pcode listing..*
7040: 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69  *.** The Synopsi
7050: 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d  s: field in comm
7060: 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65  ents in the vdbe
7070: 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67  .c source file g
7080: 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a  ets converted.**
7090: 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72   to an extra str
70a0: 69 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65  ing that is appe
70b0: 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69  nded to the sqli
70c0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e  te3OpcodeName().
70d0: 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65    In the.** abse
70e0: 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d  nce of other com
70f0: 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f  ments, this syno
7100: 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65  psis becomes the
7110: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
7120: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20  opcode..** Some 
7130: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75  translation occu
7140: 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rs:.**.**       
7150: 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72  "PX"      ->  "r
7160: 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50  [X]".**       "P
7170: 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58  X@PY"   ->  "r[X
7180: 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72  ..X+Y-1]"  or "r
7190: 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f  [x]" if y is 0 o
71a0: 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  r 1.**       "PX
71b0: 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e  @PY+1" ->  "r[X.
71c0: 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b  .X+Y]"    or "r[
71d0: 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a  x]" if y is 0.**
71e0: 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20         "PY..PY" 
71f0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20   ->  "r[X..Y]"  
7200: 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66      or "r[x]" if
7210: 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20   y<=x.*/.static 
7220: 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  int displayComme
7230: 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a  nt(.  const Op *
7240: 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pOp,     /* The 
7250: 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d  opcode to be com
7260: 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  mented */.  cons
7270: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f  t char *zP4,   /
7280: 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74  * Previously obt
7290: 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20  ained value for 
72a0: 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  P4 */.  char *zT
72b0: 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  emp,       /* Wr
72c0: 69 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20  ite result here 
72d0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20  */.  int nTemp  
72e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
72f0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54   available in zT
7300: 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f  emp[] */.){.  co
7310: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  nst char *zOpNam
7320: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
7330: 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e  *zSynopsis;.  in
7340: 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74  t nOpName;.  int
7350: 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61   ii, jj;.  zOpNa
7360: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
7370: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
7380: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
7390: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
73a0: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
73b0: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
73c0: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
73d0: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
73e0: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
73f0: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
7400: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
7410: 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b      for(ii=jj=0;
7420: 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28   jj<nTemp-1 && (
7430: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69  c = zSynopsis[ii
7440: 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20  ])!=0; ii++){.  
7450: 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29      if( c=='P' )
7460: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53  {.        c = zS
7470: 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20  ynopsis[++ii];. 
7480: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34         if( c=='4
7490: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
74a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
74b0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
74c0: 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a  jj, "%s", zP4);.
74d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
74e0: 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  ( c=='X' ){.    
74f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7500: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
7510: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
7520: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
7530: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43  .          seenC
7540: 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  om = 1;.        
7550: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
7560: 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c   int v1 = transl
7570: 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20  ateP(c, pOp);.  
7580: 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a          int v2;.
7590: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
75a0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
75b0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
75c0: 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20  %d", v1);.      
75d0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
75e0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
75f0: 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20  "@P", 2)==0 ){. 
7600: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
7610: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   3;.            
7620: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
7630: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
7640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20  .            v2 
7650: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79  = translateP(zSy
7660: 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29  nopsis[ii], pOp)
7670: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
7680: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
7690: 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29  sis+ii+1,"+1",2)
76a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
76b0: 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20       ii += 2;.  
76c0: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b              v2++
76d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
76f0: 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  v2>1 ){.        
7700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7710: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
7720: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64   zTemp+jj, "..%d
7730: 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20  ", v1+v2-1);.   
7740: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7750: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
7760: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
7770: 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34  +ii+1, "..P3", 4
7780: 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )==0 && pOp->p3=
7790: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
77a0: 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20    ii += 4;.     
77b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
77c0: 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  .        jj += s
77d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
77e0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
77f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
7800: 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a  Temp[jj++] = c;.
7810: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7820: 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26    if( !seenCom &
7830: 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20  & jj<nTemp-5 && 
7840: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
7850: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7860: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
7870: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25  , zTemp+jj, "; %
7880: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
7890: 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20  t);.      jj += 
78a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
78b0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d  zTemp+jj);.    }
78c0: 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d  .    if( jj<nTem
78d0: 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20  p ) zTemp[jj] = 
78e0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
78f0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
7900: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7910: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7920: 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  p, "%s", pOp->zC
7930: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20  omment);.    jj 
7940: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7950: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73  0(zTemp);.  }els
7960: 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  e{.    zTemp[0] 
7970: 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b  = 0;.    jj = 0;
7980: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a  .  }.  return jj
7990: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
79a0: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a  LITE_DEBUG */...
79b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
79c0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
79d0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44  ) || !defined(ND
79e0: 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20  EBUG) \.     || 
79f0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
7a00: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
7a10: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
7a20: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
7a30: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
7a40: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
7a50: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
7a60: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
7a70: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
7a80: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
7a90: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
7aa0: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
7ab0: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
7ac0: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
7ad0: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
7ae0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73  P4 = zTemp;.  as
7af0: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
7b00: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
7b10: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
7b20: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
7b30: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
7b40: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
7b50: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70   *pKeyInfo = pOp
7b60: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
7b70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
7b80: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
7b90: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r!=0 );.      sq
7ba0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7bb0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28  Temp, zTemp, "k(
7bc0: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
7bd0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20  Field);.      i 
7be0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7bf0: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  0(zTemp);.      
7c00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
7c10: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
7c20: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
7c30: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
7c40: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
7c50: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
7c60: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
7c70: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
7c80: 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20   : "nil";.      
7c90: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
7ca0: 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
7cb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d  ;.        if( n=
7cc0: 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f  =6 && memcmp(zCo
7cd0: 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d  ll,"BINARY",6)==
7ce0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
7cf0: 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20  Coll = "B";.    
7d00: 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
7d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
7d20: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29  f( i+n>nTemp-6 )
7d30: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
7d40: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
7d50: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
7d60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7d70: 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70   }.        zTemp
7d80: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
7d90: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
7da0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
7db0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
7dc0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
7dd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7de0: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
7df0: 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b  i], zColl, n+1);
7e00: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b  .        i += n;
7e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
7e20: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b  Temp[i++] = ')';
7e30: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20  .      zTemp[i] 
7e40: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
7e50: 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20  t( i<nTemp );.  
7e60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7e70: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c  .    case P4_COL
7e80: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
7e90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
7ea0: 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20  Op->p4.pColl;.  
7eb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7ec0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7ed0: 70 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43  p, "(%.20s)", pC
7ee0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
7ef0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7f00: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
7f10: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
7f20: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
7f30: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
7f40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7f50: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7f60: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
7f70: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
7f80: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
7f90: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
7fa0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
7fb0: 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a  case P4_FUNCCTX:
7fc0: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
7fd0: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
7fe0: 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20  .pCtx->pFunc;.  
7ff0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8000: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8010: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
8020: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
8030: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
8040: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
8050: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
8060: 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  64: {.      sqli
8070: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8080: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64  mp, zTemp, "%lld
8090: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34  ", *pOp->p4.pI64
80a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
80b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
80c0: 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20  4_INT32: {.     
80d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
80e0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
80f0: 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29  "%d", pOp->p4.i)
8100: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8110: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
8120: 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _REAL: {.      s
8130: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8140: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
8150: 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  .16g", *pOp->p4.
8160: 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  pReal);.      br
8170: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8180: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
8190: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
81a0: 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20  pOp->p4.pMem;.  
81b0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
81c0: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
81d0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
81e0: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
81f0: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
8200: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
8210: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8220: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
8230: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
8240: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
8250: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
8260: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
8270: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
8280: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8290: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
82a0: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29  16g", pMem->u.r)
82b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
82c0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
82d0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
82e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
82f0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8300: 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  p, "NULL");.    
8310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8320: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
8330: 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
8340: 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  );.        zP4 =
8350: 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20   "(blob)";.     
8360: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
8370: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
8380: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
8390: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
83a0: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
83b0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
83c0: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
83d0: 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20  Vtab->pVtab;.   
83e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
83f0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8400: 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74  , "vtab:%p", pVt
8410: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ab);.      break
8420: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8430: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
8440: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAY: {.      sql
8450: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8460: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74  emp, zTemp, "int
8470: 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62  array");.      b
8480: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8490: 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52  case P4_SUBPROGR
84a0: 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AM: {.      sqli
84b0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
84c0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67  mp, zTemp, "prog
84d0: 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ram");.      bre
84e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
84f0: 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b  se P4_ADVANCE: {
8500: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  .      zTemp[0] 
8510: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
8520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
8530: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34  ult: {.      zP4
8540: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
8550: 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29      if( zP4==0 )
8560: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
8570: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a  zTemp;.        z
8580: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
8590: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
85a0: 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20   assert( zP4!=0 
85b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b  );.  return zP4;
85c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
85d0: 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20   Declare to the 
85e0: 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54  Vdbe that the BT
85f0: 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62  ree object at db
8600: 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64  ->aDb[i] is used
8610: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70  ..**.** The prep
8620: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
8630: 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20  need to know in 
8640: 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70  advance the comp
8650: 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61  lete set of.** a
8660: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
8670: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  s that will be u
8680: 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74  se.  A mask of t
8690: 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a  hese databases.*
86a0: 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  * is maintained 
86b0: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e  in p->btreeMask.
86c0: 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73    The p->lockMas
86d0: 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  k value is the s
86e0: 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62  ubset of.** p->b
86f0: 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61  treeMask of data
8700: 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bases that will 
8710: 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a  require a lock..
8720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
8730: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
8740: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
8750: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
8760: 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20  i<p->db->nDb && 
8770: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44  i<(int)sizeof(yD
8780: 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73  bMask)*8 );.  as
8790: 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a  sert( i<(int)siz
87a0: 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  eof(p->btreeMask
87b0: 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53  )*8 );.  DbMaskS
87c0: 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  et(p->btreeMask,
87d0: 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20   i);.  if( i!=1 
87e0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  && sqlite3BtreeS
87f0: 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61  harable(p->db->a
8800: 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20  Db[i].pBt) ){.  
8810: 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c    DbMaskSet(p->l
8820: 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d  ockMask, i);.  }
8830: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
8840: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
8850: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
8860: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
8870: 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  0./*.** If SQLit
8880: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
8890: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
88a0: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
88b0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
88c0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
88d0: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
88e0: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
88f0: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
8900: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
8910: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
8920: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
8930: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
8940: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
8950: 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20  it also.** sets 
8960: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
8970: 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f  member of each o
8980: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  f the BtShared s
8990: 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72  tructures, ensur
89a0: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ing.** that the 
89b0: 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e  correct busy-han
89c0: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  dler callback is
89d0: 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75   invoked if requ
89e0: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ired..**.** If S
89f0: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
8a00: 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73  eadsafe but does
8a10: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
8a20: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
8a30: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
8a40: 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b  Enter() is invok
8a50: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
8a60: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
8a70: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
8a80: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
8a90: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
8aa0: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
8ab0: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
8ac0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
8ad0: 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  VM..**.** If SQL
8ae0: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
8af0: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
8b00: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
8b10: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
8b20: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
8b30: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
8b40: 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73   The p->btreeMas
8b50: 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74  k field is a bit
8b60: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65  mask of all btre
8b70: 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70  es that the prep
8b80: 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65  ared .** stateme
8b90: 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75  nt p will ever u
8ba0: 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68  se.  Let N be th
8bb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
8bc0: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
8bd0: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
8be0: 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74  g to btrees that
8bf0: 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
8c00: 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e  e.  Then the run
8c10: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  time of.** this 
8c20: 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20  routine is N*N. 
8c30: 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72   But as N is rar
8c40: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c  ely more than 1,
8c50: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
8c60: 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  .** be a problem
8c70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8c80: 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20  3VdbeEnter(Vdbe 
8c90: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
8ca0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
8cb0: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
8cc0: 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  b;.  if( DbMaskA
8cd0: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
8ce0: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
8cf0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
8d00: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
8d10: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
8d20: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
8d30: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
8d40: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
8d50: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
8d60: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
8d70: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
8d80: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
8d90: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8da0: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69  BtreeEnter(aDb[i
8db0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
8dc0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
8dd0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8de0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
8df0: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
8e00: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
8e10: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68  Unlock all of th
8e20: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75  e btrees previou
8e30: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20  sly locked by a 
8e40: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
8e50: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73  dbeEnter()..*/.s
8e60: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
8e70: 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c  NLINE void vdbeL
8e80: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
8e90: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
8ea0: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
8eb0: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64  ;.  int nDb;.  d
8ec0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
8ed0: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
8ee0: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
8ef0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
8f00: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
8f10: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
8f20: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
8f30: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
8f40: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
8f50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
8f60: 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  ve(aDb[i].pBt);.
8f70: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64      }.  }.}.void
8f80: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
8f90: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
8fa0: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
8fb0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
8fc0: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
8fd0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
8fe0: 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a  vdbeLeave(p);.}.
8ff0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
9000: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
9010: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
9020: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
9030: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
9040: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
9050: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
9060: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
9070: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9080: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c  3VdbePrintOp(FIL
9090: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c  E *pOut, int pc,
90a0: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61   Op *pOp){.  cha
90b0: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
90c0: 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20  Ptr[50];.  char 
90d0: 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61  zCom[100];.  sta
90e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
90f0: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
9100: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
9110: 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c  d %-13s %.2X %s\
9120: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
9130: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
9140: 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  t;.  zP4 = displ
9150: 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP4(pOp, zPtr, 
9160: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23  sizeof(zPtr));.#
9170: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
9180: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
9190: 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f  ENTS.  displayCo
91a0: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
91b0: 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f  zCom, sizeof(zCo
91c0: 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f  m));.#else.  zCo
91d0: 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  m[0] = 0;.#endif
91e0: 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73  .  /* NB:  The s
91f0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
9200: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  () function is i
9210: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f  mplemented by co
9220: 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20  de created.  ** 
9230: 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  by the mkopcodeh
9240: 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64  .awk and mkopcod
9250: 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77  ec.awk scripts w
9260: 68 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65  hich extract the
9270: 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  .  ** informatio
9280: 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e  n from the vdbe.
9290: 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f  c source text */
92a0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
92b0: 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a   zFormat1, pc, .
92c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63        sqlite3Opc
92d0: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
92e0: 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode), pOp->p1, p
92f0: 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p2, pOp->p3,
9300: 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20   zP4, pOp->p5,. 
9310: 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20       zCom.  );. 
9320: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
9330: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
9340: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
9350: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
9360: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
9370: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
9380: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
9390: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
93a0: 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d  .    Mem *pEnd =
93b0: 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69   &p[N];.    sqli
93c0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
93d0: 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66  .    u8 malloc_f
93e0: 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
93f0: 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66  ocFailed;.    if
9400: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
9410: 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a  ed ){.      do{.
9420: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73          if( p->s
9430: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
9440: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
9450: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d  Malloc);.      }
9460: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
9470: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
9480: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  n;.    }.    do{
9490: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
94a0: 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20  &p[1])==pEnd || 
94b0: 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62  p[0].db==p[1].db
94c0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
94d0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
94e0: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
94f0: 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  p) );..      /* 
9500: 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65  This block is re
9510: 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20  ally an inlined 
9520: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
9530: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
9540: 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ().      ** that
9550: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
9560: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
9570: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t the memory cel
9580: 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20  l value is .    
9590: 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74    ** being set t
95a0: 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c  o NULL after rel
95b0: 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d  easing any dynam
95c0: 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ic resources..  
95d0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
95e0: 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f  The justificatio
95f0: 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e  n for duplicatin
9600: 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61  g code is that a
9610: 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20  ccording to .   
9620: 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c     ** callgrind,
9630: 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63   this causes a c
9640: 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65  ertain test case
9650: 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20   to hit the CPU 
9660: 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65  4.7 .      ** pe
9670: 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20  rcent less (x86 
9680: 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69  linux, gcc versi
9690: 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74  on 4.1.2, -O6) t
96a0: 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a  han if .      **
96b0: 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61   sqlite3MemRelea
96c0: 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64  se() were called
96d0: 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68   from here. With
96e0: 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73   -O2, this jumps
96f0: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36  .      ** to 6.6
9700: 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65   percent. The te
9710: 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72  st case is inser
9720: 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69  ting 1000 rows i
9730: 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20  nto a table .   
9740: 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e     ** with no in
9750: 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69  dexes using a si
9760: 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e  ngle prepared IN
9770: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  SERT statement, 
9780: 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a  bind() .      **
9790: 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e   and reset(). In
97a0: 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65  serts are groupe
97b0: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63  d into a transac
97c0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
97d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
97e0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67  ->flags & MEM_Ag
97f0: 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  g );.      testc
9800: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
9810: 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20  MEM_Dyn );.     
9820: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
9830: 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20  ags & MEM_Frame 
9840: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
9850: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
9860: 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20  M_RowSet );.    
9870: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
9880: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
9890: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
98a0: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
98b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
98c0: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
98d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a   }else if( p->sz
98e0: 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  Malloc ){.      
98f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9900: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
9910: 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61  .        p->szMa
9920: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  lloc = 0;.      
9930: 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67  }..      p->flag
9940: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
9950: 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  d;.    }while( (
9960: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
9970: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9980: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
9990: 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d;.  }.}../*.** 
99a0: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
99b0: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
99c0: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
99d0: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
99e0: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
99f0: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
9a00: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
9a10: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
9a20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9a30: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
9a40: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
9a50: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
9a60: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
9a70: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
9a80: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
9a90: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
9aa0: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
9ab0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
9ac0: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
9ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
9ae0: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
9af0: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
9b00: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
9b10: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
9b20: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Mem);.  sqlite3D
9b30: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
9b40: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
9b50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
9b60: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
9b70: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
9b80: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
9b90: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
9ba0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
9bb0: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
9bc0: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
9bd0: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
9be0: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
9bf0: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
9c00: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
9c10: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
9c20: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
9c30: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
9c40: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
9c50: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
9c60: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
9c70: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
9c80: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
9c90: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
9ca0: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
9cb0: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
9cc0: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
9cd0: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
9ce0: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
9cf0: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
9d00: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
9d10: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
9d20: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
9d30: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a  QUERY PLAN..**.*
9d40: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
9d50: 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20  n==1, first the 
9d60: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20  main program is 
9d70: 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63  listed, then eac
9d80: 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67  h of.** the trig
9d90: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
9da0: 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62  are listed one b
9db0: 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y one..*/.int sq
9dc0: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
9dd0: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
9de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9df0: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69  e VDBE */.){.  i
9e00: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e20: 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e      /* Stop when
9e30: 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68   row count reach
9e40: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74  es this */.  int
9e50: 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20   nSub = 0;      
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
9e80: 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f  ub-vdbes seen so
9e90: 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f   far */.  SubPro
9ea0: 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30  gram **apSub = 0
9eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
9ec0: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76  * Array of sub-v
9ed0: 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  dbes */.  Mem *p
9ee0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f00: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f  * Memory cell ho
9f10: 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  ld array of subp
9f20: 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rogs */.  sqlite
9f30: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20  3 *db = p->db;  
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f50: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
9f60: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
9f70: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
9fa0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
9fb0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9fd0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
9fe0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
9ff0: 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20  ->aMem[1];      
a000: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
a010: 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65  Mem of result se
a020: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
a030: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
a040: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
a050: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
a060: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
a070: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
a080: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
a090: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
a0a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
a0b0: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
a0c0: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
a0d0: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
a0e0: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
a0f0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
a100: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
a110: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
a120: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
a130: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
a140: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
a150: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
a160: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
a170: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
a180: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
a190: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
a1a0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
a1b0: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
a1c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
a1d0: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
a1e0: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
a1f0: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
a200: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
a210: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
a220: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
a230: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
a240: 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61  .  */.    db->ma
a250: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
a260: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a270: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
a280: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
a290: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
a2a0: 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20  s reaches nRow, 
a2b0: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20  that means the. 
a2c0: 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20   ** listing has 
a2d0: 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c  finished and sql
a2e0: 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75  ite3_step() shou
a2f0: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
a300: 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77  _DONE..  ** nRow
a310: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
a320: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
a330: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  s in the main pr
a340: 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a  ogram, plus.  **
a350: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
a360: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
a370: 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75  n all trigger su
a380: 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e  bprograms encoun
a390: 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61  tered.  ** so fa
a3a0: 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  r.  The nRow val
a3b0: 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ue will increase
a3c0: 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20   as new trigger 
a3d0: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a  subprograms are.
a3e0: 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64    ** encountered
a3f0: 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c  , but p->pc will
a400: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63   eventually catc
a410: 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20  h up to nRow..  
a420: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e  */.  nRow = p->n
a430: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  Op;.  if( p->exp
a440: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  lain==1 ){.    /
a450: 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65  * The first 8 me
a460: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75  mory cells are u
a470: 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75  sed for the resu
a480: 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77  lt set.  So we w
a490: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  ill.    ** comma
a4a0: 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65  ndeer the 9th ce
a4b0: 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f  ll to use as sto
a4c0: 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61  rage for an arra
a4d0: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20  y of pointers.  
a4e0: 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20    ** to trigger 
a4f0: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68  subprograms.  Th
a500: 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e  e VDBE is guaran
a510: 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20  teed to have at 
a520: 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63  least 9.    ** c
a530: 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ells.  */.    as
a540: 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20  sert( p->nMem>9 
a550: 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70  );.    pSub = &p
a560: 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69  ->aMem[9];.    i
a570: 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d  f( pSub->flags&M
a580: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
a590: 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74   /* On the first
a5a0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
a5b0: 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69  _step(), pSub wi
a5c0: 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20  ll hold a NULL. 
a5d0: 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   It is.      ** 
a5e0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
a5f0: 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f   BLOB by the P4_
a600: 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65  SUBPROGRAM proce
a610: 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f  ssing logic belo
a620: 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20  w */.      nSub 
a630: 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66  = pSub->n/sizeof
a640: 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61  (Vdbe*);.      a
a650: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
a660: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
a670: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
a680: 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a  ; i<nSub; i++){.
a690: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70        nRow += ap
a6a0: 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[i]->nOp;.   
a6b0: 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
a6c0: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
a6d0: 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20   }while( i<nRow 
a6e0: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
a6f0: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
a700: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
a710: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f   );.  if( i>=nRo
a720: 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  w ){.    p->rc =
a730: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
a740: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
a750: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
a760: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
a770: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
a780: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
a790: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
a7a0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
a7b0: 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28  qlite3VdbeError(
a7c0: 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  p, sqlite3ErrStr
a7d0: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
a7e0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34  e{.    char *zP4
a7f0: 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  ;.    Op *pOp;. 
a800: 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20     if( i<p->nOp 
a810: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
a820: 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62  output line numb
a830: 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  er is small enou
a840: 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73  gh that we are s
a850: 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20  till in the.    
a860: 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61    ** main progra
a870: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20  m. */.      pOp 
a880: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
a890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
a8a0: 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74  * We are current
a8b0: 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72  ly listing subpr
a8c0: 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20  ograms.  Figure 
a8d0: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e  out which one an
a8e0: 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20  d.      ** pick 
a8f0: 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  up the appropria
a900: 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  te opcode. */.  
a910: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
a920: 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20   i -= p->nOp;.  
a930: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d      for(j=0; i>=
a940: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a  apSub[j]->nOp; j
a950: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d  ++){.        i -
a960: 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  = apSub[j]->nOp;
a970: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
a980: 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e  Op = &apSub[j]->
a990: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aOp[i];.    }.  
a9a0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
a9b0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ==1 ){.      pMe
a9c0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
a9d0: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
a9e0: 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20  u.i = i;        
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72          /* Progr
aa10: 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  am counter */.  
aa20: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20      pMem++;.  . 
aa30: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
aa40: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   = MEM_Static|ME
aa50: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
aa60: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
aa70: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70  (char*)sqlite3Op
aa80: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
aa90: 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65  code); /* Opcode
aaa0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
aab0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
aac0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
aad0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
aae0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
aaf0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
ab00: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
ab10: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  Mem++;..      /*
ab20: 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67   When an OP_Prog
ab30: 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e  ram opcode is en
ab40: 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c  counter (the onl
ab50: 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61  y opcode that ha
ab60: 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f  s.      ** a P4_
ab70: 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d  SUBPROGRAM argum
ab80: 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65  ent), expand the
ab90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
aba0: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
abb0: 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20  s.      ** kept 
abc0: 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20  in p->aMem[9].z 
abd0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20  to hold the new 
abe0: 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69  program - assumi
abf0: 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72  ng this subprogr
ac00: 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  am.      ** has 
ac10: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
ac20: 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a   seen..      */.
ac30: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
ac40: 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f  4type==P4_SUBPRO
ac50: 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  GRAM ){.        
ac60: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75  int nByte = (nSu
ac70: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
ac80: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
ac90: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
aca0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62   for(j=0; j<nSub
acb0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
acc0: 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d    if( apSub[j]==
acd0: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
ace0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
acf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
ad00: 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54  j==nSub && SQLIT
ad10: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62  E_OK==sqlite3Vdb
ad20: 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e  eMemGrow(pSub, n
ad30: 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29  Byte, nSub!=0) )
ad40: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  {.          apSu
ad50: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
ad60: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
ad70: 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62        apSub[nSub
ad80: 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ++] = pOp->p4.pP
ad90: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
ada0: 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d    pSub->flags |=
adb0: 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20   MEM_Blob;.     
adc0: 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e       pSub->n = n
add0: 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  Sub*sizeof(SubPr
ade0: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
adf0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ae00: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
ae10: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
ae20: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
ae30: 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  ->p1;           
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae50: 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P1 */.    pMem
ae60: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
ae70: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
ae80: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
ae90: 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20  pOp->p2;        
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70    /* P2 */.    p
aec0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
aed0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
aee0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
aef0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20   = pOp->p3;     
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20       /* P3 */.  
af20: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69    pMem++;..    i
af30: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
af40: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
af50: 70 4d 65 6d 2c 20 33 32 29 20 29 7b 20 2f 2a 20  pMem, 32) ){ /* 
af60: 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  P4 */.      asse
af70: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
af80: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
af90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
afa0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
afb0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
afc0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
afd0: 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61      zP4 = displa
afe0: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
aff0: 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  , 32);.    if( z
b000: 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20  P4!=pMem->z ){. 
b010: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b020: 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20  MemSetStr(pMem, 
b030: 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zP4, -1, SQLITE_
b040: 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65  UTF8, 0);.    }e
b050: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
b060: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
b070: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
b080: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
b090: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
b0a0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
b0b0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a  ITE_UTF8;.    }.
b0c0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
b0d0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
b0e0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =1 ){.      if( 
b0f0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
b100: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
b110: 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20  m, 4) ){.       
b120: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
b130: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
b140: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
b150: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
b160: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
b170: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
b180: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
b190: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
b1a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
b1b0: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
b1c0: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
b1d0: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
b1e0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
b1f0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
b200: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
b210: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b220: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
b230: 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71  NTS.      if( sq
b240: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
b250: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
b260: 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20   500) ){.       
b270: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
b280: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
b290: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
b2a0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
b2b0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
b2c0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
b2d0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
b2e0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c   pMem->n = displ
b2f0: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
b300: 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30  P4, pMem->z, 500
b310: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
b320: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
b330: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d  ;.#else.      pM
b340: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
b350: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
b360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
b370: 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66  omment */.#endif
b380: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e  .    }..    p->n
b390: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20  ResColumn = 8 - 
b3a0: 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29  4*(p->explain-1)
b3b0: 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74  ;.    p->pResult
b3c0: 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Set = &p->aMem[1
b3d0: 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ];.    p->rc = S
b3e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
b3f0: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
b400: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b410: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
b420: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
b430: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
b440: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
b450: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
b460: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
b470: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
b480: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
b490: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
b4a0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f  l(Vdbe *p){.  co
b4b0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
b4c0: 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29  .  if( p->zSql )
b4d0: 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71  {.    z = p->zSq
b4e0: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
b4f0: 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20  ->nOp>=1 ){.    
b500: 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f  const VdbeOp *pO
b510: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
b520: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
b530: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
b540: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
b550: 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70        z = pOp->p
b560: 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  4.z;.      while
b570: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
b580: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
b590: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20  }.  }.  if( z ) 
b5a0: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
b5b0: 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64  ]\n", z);.}.#end
b5c0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
b5d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
b5e0: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
b5f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
b600: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
b610: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
b620: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
b630: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
b640: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
b650: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
b660: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
b670: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
b680: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
b690: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
b6a0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
b6b0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
b6c0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
b6d0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
b6e0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
b6f0: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
b700: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
b710: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
b720: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
b730: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
b740: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
b750: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
b760: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
b770: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
b780: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
b790: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
b7a0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
b7b0: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
b7c0: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
b7d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
b7e0: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
b7f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
b800: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
b810: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
b820: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
b830: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
b840: 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73  3IoTrace("SQL %s
b850: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
b860: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
b870: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
b880: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
b890: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  RACE */../*.** A
b8a0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72  llocate space fr
b8b0: 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20  om a fixed size 
b8c0: 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75 72  buffer and retur
b8d0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
b8e0: 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20 49  * that space.  I
b8f0: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  f insufficient s
b900: 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
b910: 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  e, return NULL..
b920: 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70  **.** The pBuf p
b930: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
b940: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  initial value of
b950: 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68   a pointer which
b960: 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65   will.** receive
b970: 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   the new memory.
b980: 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c    pBuf is normal
b990: 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75  ly NULL.  If pBu
b9a0: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
b9b0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
b9c0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73  memory space has
b9d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
b9e0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61 74  located and that
b9f0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
ba00: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f   should not allo
ba10: 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d  cate any new mem
ba20: 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20  ory.  When pBuf 
ba30: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73  is not.** NULL s
ba40: 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75  imply return pBu
ba50: 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74  f.  Only allocat
ba60: 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61  e new memory spa
ba70: 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20  ce when pBuf.** 
ba80: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e  is NULL..**.** n
ba90: 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62  Byte is the numb
baa0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
bab0: 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  pace needed..**.
bac0: 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74  ** *ppFrom point
bad0: 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73  s to available s
bae0: 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f  pace and pEnd po
baf0: 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20  ints to the end 
bb00: 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61  of the.** availa
bb10: 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e  ble space.  When
bb20: 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61   space is alloca
bb30: 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20  ted, *ppFrom is 
bb40: 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a  advanced past.**
bb50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
bb60: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
bb70: 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69  .**.** *pnByte i
bb80: 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74  s a counter of t
bb90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
bba0: 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61 74  es of space that
bbb0: 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20   have failed.** 
bbc0: 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66  to allocate.  If
bbd0: 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66 66   there is insuff
bbe0: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20  icient space in 
bbf0: 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73  *ppFrom to satis
bc00: 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  fy the.** reques
bc10: 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  t, then incremen
bc20: 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65  t *pnByte by the
bc30: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72   amount of the r
bc40: 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  equest..*/.stati
bc50: 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61  c void *allocSpa
bc60: 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  ce(.  void *pBuf
bc70: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
bc80: 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  ere return point
bc90: 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  er will be store
bca0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
bcb0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
bcc0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
bcd0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
bce0: 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20  u8 **ppFrom,    
bcf0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
bd00: 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70  Allocate from *p
bd10: 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70  pFrom */.  u8 *p
bd20: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
bd30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
bd40: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  byte past the en
bd50: 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66  d of *ppFrom buf
bd60: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  fer */.  int *pn
bd70: 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Byte          /*
bd80: 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63   If allocation c
bd90: 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69  annot be made, i
bda0: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
bdb0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
bdc0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
bdd0: 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29  NMENT(*ppFrom) )
bde0: 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20 72  ;.  if( pBuf ) r
bdf0: 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42  eturn pBuf;.  nB
be00: 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79  yte = ROUND8(nBy
be10: 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70  te);.  if( &(*pp
be20: 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20  From)[nByte] <= 
be30: 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66  pEnd ){.    pBuf
be40: 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f   = (void*)*ppFro
be50: 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b  m;.    *ppFrom +
be60: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65  = nByte;.  }else
be70: 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d  {.    *pnByte +=
be80: 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65   nByte;.  }.  re
be90: 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a  turn pBuf;.}../*
bea0: 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56  .** Rewind the V
beb0: 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20  DBE back to the 
bec0: 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65  beginning in pre
bed0: 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  paration for.** 
bee0: 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76  running it..*/.v
bef0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
bf00: 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a  ewind(Vdbe *p){.
bf10: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
bf20: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
bf30: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
bf40: 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64  E).  int i;.#end
bf50: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  if.  assert( p!=
bf60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bf70: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
bf80: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
bf90: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
bfa0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
bfb0: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
bfc0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
bfd0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
bfe0: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
bff0: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
c000: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
c010: 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20  . */.  p->magic 
c020: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
c030: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
c040: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31  _DEBUG.  for(i=1
c050: 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
c060: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c070: 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d  ->aMem[i].db==p-
c080: 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >db );.  }.#endi
c090: 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  f.  p->pc = -1;.
c0a0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c0b0: 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  _OK;.  p->errorA
c0c0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
c0d0: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
c0e0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
c0f0: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
c100: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
c110: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
c120: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
c130: 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  5;.  p->iStateme
c140: 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b  nt = 0;.  p->nFk
c150: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a  Constraint = 0;.
c160: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
c170: 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ILE.  for(i=0; i
c180: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
c190: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
c1a0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70   = 0;.    p->aOp
c1b0: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
c1c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
c1d0: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
c1e0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
c1f0: 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20  r execution for 
c200: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
c210: 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67  fter.** creating
c220: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
c230: 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f  hine.  This invo
c240: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
c250: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
c260: 67 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  g registers and 
c270: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
c280: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
c290: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
c2a0: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
c2b0: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
c2c0: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
c2d0: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
c2e0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
c2f0: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
c300: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
c310: 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79  e called exactly
c320: 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69   once on each vi
c330: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
c340: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
c350: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
c360: 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22  he VM has been "
c370: 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73  packaged" and is
c380: 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e   ready.** to run
c390: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
c3a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
c3b0: 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74   further calls t
c3c0: 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  o .** sqlite3Vdb
c3d0: 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f  eAddOp() functio
c3e0: 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ns are prohibite
c3f0: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
c400: 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20   disconnects.** 
c410: 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
c420: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74  e Parse object t
c430: 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72  hat helped gener
c440: 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74  ate it so that t
c450: 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62  he.** the Vdbe b
c460: 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65  ecomes an indepe
c470: 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64  ndent entity and
c480: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
c490: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74  t can be.** dest
c4a0: 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  royed..**.** Use
c4b0: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
c4c0: 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75  Rewind() procedu
c4d0: 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20  re to restore a 
c4e0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
c4f0: 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69  back.** to its i
c500: 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74  nitial state aft
c510: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  er it has been r
c520: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  un..*/.void sqli
c530: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
c540: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
c570: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
c580: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
c590: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
c5a0: 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ntext */.){.  sq
c5b0: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c5d0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
c5e0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
c5f0: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
c600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c610: 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74  umber of paramet
c620: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ers */.  int nMe
c630: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
c640: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c650: 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72  r of VM memory r
c660: 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e  egisters */.  in
c670: 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20  t nCursor;      
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c690: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
c6a0: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
c6b0: 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20  int nArg;       
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c6d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
c6e0: 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67  ments in subprog
c6f0: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  rams */.  int nO
c700: 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  nce;            
c710: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c720: 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e  er of OP_Once in
c730: 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
c740: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c760: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
c770: 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20  /.  u8 *zCsr;   
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c790: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
c7a0: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  ilable for alloc
c7b0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  ation */.  u8 *z
c7c0: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
c7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
c7e0: 73 74 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c  st byte past all
c7f0: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  ocated memory */
c800: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c820: 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78    /* How much ex
c830: 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65  tra memory is ne
c840: 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eded */..  asser
c850: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
c860: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
c870: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
c880: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
c890: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
c8a0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
c8b0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d   assert( pParse=
c8c0: 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20  =p->pParse );.  
c8d0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
c8e0: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
c8f0: 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  Failed==0 );.  n
c900: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56  Var = pParse->nV
c910: 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61  ar;.  nMem = pPa
c920: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75  rse->nMem;.  nCu
c930: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
c940: 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50  Tab;.  nArg = pP
c950: 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20  arse->nMaxArg;. 
c960: 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d   nOnce = pParse-
c970: 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f  >nOnce;.  if( nO
c980: 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d  nce==0 ) nOnce =
c990: 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74   1; /* Ensure at
c9a0: 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
c9b0: 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b  in p->aOnceFlag[
c9c0: 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  ] */.  .  /* For
c9d0: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
c9e0: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
c9f0: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
ca00: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
ca10: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
ca20: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
ca30: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
ca40: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
ca50: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
ca60: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
ca70: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
ca80: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
ca90: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
caa0: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
cab0: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
cac0: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
cad0: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
cae0: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
caf0: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
cb00: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
cb10: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
cb20: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
cb30: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
cb40: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
cb50: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
cb60: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
cb70: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
cb80: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
cb90: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
cba0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
cbb0: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
cbc0: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
cbd0: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
cbe0: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
cbf0: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
cc00: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
cc10: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ents in..  */.  
cc20: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zCsr = (u8*)&p->
cc30: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20  aOp[p->nOp];    
cc40: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
cc50: 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20  y avaliable for 
cc60: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
cc70: 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zEnd = (u8*)&p->
cc80: 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f 70 41  aOp[pParse->nOpA
cc90: 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74  lloc];  /* First
cca0: 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f   byte past end o
ccb0: 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72  f zCsr[] */..  r
ccc0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
ccd0: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75  , &nArg);.  p->u
cce0: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
ccf0: 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73   (u8)(pParse->is
cd00: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
cd10: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
cd20: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
cd30: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
cd40: 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20  0 ){.    nMem = 
cd50: 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  10;.  }.  memset
cd60: 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a  (zCsr, 0, zEnd-z
cd70: 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20  Csr);.  zCsr += 
cd80: 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26  (zCsr - (u8*)0)&
cd90: 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  7;.  assert( EIG
cda0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
cdb0: 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e  T(zCsr) );.  p->
cdc0: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20  expired = 0;..  
cdd0: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65  /* Memory for re
cde0: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74  gisters, paramet
cdf0: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63  ers, cursor, etc
ce00: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  , is allocated i
ce10: 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  n two.  ** passe
ce20: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
ce30: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
ce40: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70   reuse unused sp
ce50: 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ace at the .  **
ce60: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
ce70: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
ce80: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
ce90: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
cea0: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
ceb0: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
cec0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
ced0: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
cee0: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
cef0: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
cf00: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72   rest using a fr
cf10: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  esh allocation. 
cf20: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
cf30: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
cf40: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
cf50: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
cf60: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
cf70: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
cf80: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
cf90: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
cfa0: 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66  array can signif
cfb0: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
cfc0: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
cfd0: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
cfe0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
cff0: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
d000: 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30   {.    nByte = 0
d010: 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  ;.    p->aMem = 
d020: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d  allocSpace(p->aM
d030: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
d040: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
d050: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
d060: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53  p->aVar = allocS
d070: 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56  pace(p->aVar, nV
d080: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  ar*sizeof(Mem), 
d090: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
d0a0: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41  yte);.    p->apA
d0b0: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
d0c0: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
d0d0: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43  izeof(Mem*), &zC
d0e0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
d0f0: 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  );.    p->azVar 
d100: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
d110: 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  azVar, nVar*size
d120: 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72  of(char*), &zCsr
d130: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
d140: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  .    p->apCsr = 
d150: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
d160: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
d170: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
d180: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d190: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73              &zCs
d1a0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
d1b0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c  ;.    p->aOnceFl
d1c0: 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ag = allocSpace(
d1d0: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f  p->aOnceFlag, nO
d1e0: 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  nce, &zCsr, zEnd
d1f0: 2c 20 26 6e 42 79 74 65 29 3b 0a 23 69 66 64 65  , &nByte);.#ifde
d200: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d210: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
d220: 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
d230: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e  allocSpace(p->an
d240: 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a  Exec, p->nOp*siz
d250: 65 6f 66 28 69 36 34 29 2c 20 26 7a 43 73 72 2c  eof(i64), &zCsr,
d260: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
d270: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e  #endif.    if( n
d280: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  Byte ){.      p-
d290: 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >pFree = sqlite3
d2a0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
d2b0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20   nByte);.    }. 
d2c0: 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72     zCsr = p->pFr
d2d0: 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26  ee;.    zEnd = &
d2e0: 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d  zCsr[nByte];.  }
d2f0: 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20  while( nByte && 
d300: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
d310: 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73  d );..  p->nCurs
d320: 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
d330: 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e  p->nOnceFlag = n
d340: 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61  Once;.  if( p->a
d350: 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  Var ){.    p->nV
d360: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
d370: 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e  ;.    for(n=0; n
d380: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
d390: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
d3a0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
d3b0: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
d3c0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
d3d0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56    }.  if( p->azV
d3e0: 61 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 7a  ar && pParse->nz
d3f0: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  Var>0 ){.    p->
d400: 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  nzVar = pParse->
d410: 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70  nzVar;.    memcp
d420: 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72  y(p->azVar, pPar
d430: 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a  se->azVar, p->nz
d440: 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a  Var*sizeof(p->az
d450: 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65  Var[0]));.    me
d460: 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56  mset(pParse->azV
d470: 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  ar, 0, pParse->n
d480: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72  zVar*sizeof(pPar
d490: 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  se->azVar[0]));.
d4a0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65    }.  if( p->aMe
d4b0: 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  m ){.    p->aMem
d4c0: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
d4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
d4e0: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
d4f0: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e  nMem */.    p->n
d500: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20  Mem = nMem;     
d510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
d520: 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e       not from 0.
d530: 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66  .nMem-1 */.    f
d540: 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b  or(n=1; n<=nMem;
d550: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
d560: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
d570: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
d580: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
d590: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
d5a0: 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20   }.  p->explain 
d5b0: 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
d5c0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
d5d0: 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a  Rewind(p);.}../*
d5e0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
d5f0: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
d600: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
d610: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
d620: 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
d630: 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
d640: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
d650: 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
d660: 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
d670: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
d680: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d690: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
d6a0: 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20  terClose(p->db, 
d6b0: 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d  pCx);.  if( pCx-
d6c0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
d6d0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
d6e0: 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20  x->pBt);.    /* 
d6f0: 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  The pCx->pCursor
d700: 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61   will be close a
d710: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66  utomatically, if
d720: 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20   it exists, by. 
d730: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
d740: 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65  bove. */.  }else
d750: 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f   if( pCx->pCurso
d760: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
d770: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
d780: 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pCx->pCursor);.
d790: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
d7a0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
d7b0: 41 42 4c 45 0a 20 20 65 6c 73 65 20 69 66 28 20  ABLE.  else if( 
d7c0: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
d7d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
d7e0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
d7f0: 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e  abCursor = pCx->
d800: 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20  pVtabCursor;.   
d810: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
d820: 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
d830: 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
d840: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
d850: 20 20 61 73 73 65 72 74 28 20 70 56 74 61 62 43    assert( pVtabC
d860: 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 6e 52  ursor->pVtab->nR
d870: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 56 74 61  ef>0 );.    pVta
d880: 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e  bCursor->pVtab->
d890: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 70 4d 6f 64  nRef--;.    pMod
d8a0: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61  ule->xClose(pVta
d8b0: 62 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 65  bCursor);.  }.#e
d8c0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ndif.}../*.** Cl
d8d0: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
d8e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
d8f0: 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rame..*/.static 
d900: 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72  void closeCursor
d910: 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70  sInFrame(Vdbe *p
d920: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ){.  if( p->apCs
d930: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
d940: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d950: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
d960: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
d970: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
d980: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
d990: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
d9a0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
d9b0: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
d9c0: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
d9d0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
d9e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
d9f0: 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73  opy the values s
da00: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62  tored in the Vdb
da10: 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65  eFrame structure
da20: 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68   to its Vdbe. Th
da30: 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66  is.** is used, f
da40: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
da50: 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70   a trigger sub-p
da60: 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64  rogram is halted
da70: 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63   to restore.** c
da80: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61  ontrol to the ma
da90: 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69  in program..*/.i
daa0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  nt sqlite3VdbeFr
dab0: 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46  ameRestore(VdbeF
dac0: 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20  rame *pFrame){. 
dad0: 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d   Vdbe *v = pFram
dae0: 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72  e->v;.  closeCur
daf0: 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a  sorsInFrame(v);.
db00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
db10: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
db20: 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63  ATUS.  v->anExec
db30: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65   = pFrame->anExe
db40: 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61  c;.#endif.  v->a
db50: 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d  OnceFlag = pFram
db60: 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20  e->aOnceFlag;.  
db70: 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70  v->nOnceFlag = p
db80: 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67  Frame->nOnceFlag
db90: 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  ;.  v->aOp = pFr
dba0: 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
dbb0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
dbc0: 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
dbd0: 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
dbe0: 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
dbf0: 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
dc00: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
dc10: 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
dc20: 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
dc30: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
dc40: 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
dc50: 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
dc60: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
dc70: 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64  >nChange;.  v->d
dc80: 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  b->nChange = pFr
dc90: 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a  ame->nDbChange;.
dca0: 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d    return pFrame-
dcb0: 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  >pc;.}../*.** Cl
dcc0: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ose all cursors.
dcd0: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65  .**.** Also rele
dce0: 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ase any dynamic 
dcf0: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74  memory held by t
dd00: 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62  he VM in the Vdb
dd10: 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a  e.aMem memory .*
dd20: 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68  * cell array. Th
dd30: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
dd40: 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  as the memory ce
dd50: 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e  ll array may con
dd60: 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73  tain.** pointers
dd70: 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62   to VdbeFrame ob
dd80: 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79  jects, which may
dd90: 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e   in turn contain
dda0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
ddb0: 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f  open cursors..*/
ddc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
ddd0: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
dde0: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
ddf0: 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  pFrame ){.    Vd
de00: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
de10: 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d  .    for(pFrame=
de20: 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d  p->pFrame; pFram
de30: 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61  e->pParent; pFra
de40: 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  me=pFrame->pPare
de50: 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nt);.    sqlite3
de60: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
de70: 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d  (pFrame);.    p-
de80: 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20  >pFrame = 0;.   
de90: 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a   p->nFrame = 0;.
dea0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
deb0: 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20  >nFrame==0 );.  
dec0: 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
ded0: 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ame(p);.  if( p-
dee0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c  >aMem ){.    rel
def0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d  easeMemArray(&p-
df00: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65  >aMem[1], p->nMe
df10: 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  m);.  }.  while(
df20: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b   p->pDelFrame ){
df30: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
df40: 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72  pDel = p->pDelFr
df50: 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c  ame;.    p->pDel
df60: 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50  Frame = pDel->pP
df70: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
df80: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
df90: 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20  e(pDel);.  }..  
dfa0: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75  /* Delete any au
dfb0: 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e  xdata allocation
dfc0: 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d  s made by the VM
dfd0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75   */.  if( p->pAu
dfe0: 78 44 61 74 61 20 29 20 73 71 6c 69 74 65 33 56  xData ) sqlite3V
dff0: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
e000: 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73  (p, -1, 0);.  as
e010: 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74  sert( p->pAuxDat
e020: 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  a==0 );.}../*.**
e030: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
e040: 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20   after a single 
e050: 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  run..*/.static v
e060: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
e070: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
e080: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69  *db = p->db;..#i
e090: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
e0a0: 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61  G.  /* Execute a
e0b0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
e0c0: 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
e0d0: 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72  t the Vdbe.apCsr
e0e0: 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62  [] and .  ** Vdb
e0f0: 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20  e.aMem[] arrays 
e100: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
e110: 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a  n cleaned up.  *
e120: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  /.  int i;.  if(
e130: 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28   p->apCsr ) for(
e140: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
e150: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
e160: 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29  p->apCsr[i]==0 )
e170: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
e180: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
e190: 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29  i<=p->nMem; i++)
e1a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
e1b0: 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55  [i].flags==MEM_U
e1c0: 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a  ndefined );.  }.
e1d0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
e1e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
e1f0: 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
e200: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
e210: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
e220: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
e230: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
e240: 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
e250: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
e260: 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
e270: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
e280: 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
e290: 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
e2a0: 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
e2b0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
e2c0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
e2d0: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
e2e0: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
e2f0: 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
e300: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
e310: 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
e320: 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
e330: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
e340: 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
e350: 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
e360: 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  {.  Mem *pColNam
e370: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  e;.  int n;.  sq
e380: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
e390: 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  b;..  releaseMem
e3a0: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
e3b0: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
e3c0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
e3d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e3e0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
e3f0: 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a   n = nResColumn*
e400: 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e  COLNAME_N;.  p->
e410: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31  nResColumn = (u1
e420: 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20  6)nResColumn;.  
e430: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43  p->aColName = pC
e440: 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73  olName = (Mem*)s
e450: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
e460: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  ro(db, sizeof(Me
e470: 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
e480: 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
e490: 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
e4a0: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70  n-- > 0 ){.    p
e4b0: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d  ColName->flags =
e4c0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70   MEM_Null;.    p
e4d0: 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d  ColName->db = p-
e4e0: 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  >db;.    pColNam
e4f0: 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e++;.  }.}../*.*
e500: 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
e510: 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c  f the idx'th col
e520: 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e  umn to be return
e530: 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74  ed by the SQL st
e540: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d  atement..** zNam
e550: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  e must be a poin
e560: 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  ter to a nul ter
e570: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
e580: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
e590: 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74  must be made aft
e5a0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
e5b0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
e5c0: 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ls()..**.** The 
e5d0: 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c  final parameter,
e5e0: 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f   xDel, must be o
e5f0: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e  ne of SQLITE_DYN
e600: 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41  AMIC, SQLITE_STA
e610: 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  TIC.** or SQLITE
e620: 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69  _TRANSIENT. If i
e630: 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41  t is SQLITE_DYNA
e640: 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75  MIC, then the bu
e650: 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ffer pointed.** 
e660: 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c  to by zName will
e670: 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c   be freed by sql
e680: 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65  ite3DbFree() whe
e690: 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65  n the vdbe is de
e6a0: 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20  stroyed..*/.int 
e6b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
e6c0: 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70  lName(.  Vdbe *p
e6d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e6e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
e6f0: 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72  e being configur
e700: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c  ed */.  int idx,
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e720: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
e730: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d  x of column zNam
e740: 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  e applies to */.
e750: 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20    int var,      
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e770: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
e780: 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74   COLNAME_* const
e790: 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ants */.  const 
e7a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
e7b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
e7c0: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
e7d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20  containing name 
e7e0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  */.  void (*xDel
e7f0: 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20  )(void*)        
e800: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
e810: 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74  management strat
e820: 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f  egy for zName */
e830: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
e840: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
e850: 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
e860: 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
e870: 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
e880: 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70  AME_N );.  if( p
e890: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e8a0: 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
e8b0: 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c  ( !zName || xDel
e8c0: 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  !=SQLITE_DYNAMIC
e8d0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
e8e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
e8f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
e900: 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
e910: 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
e920: 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
e930: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
e940: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
e950: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
e960: 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
e970: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78  , SQLITE_UTF8, x
e980: 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Del);.  assert( 
e990: 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20  rc!=0 || !zName 
e9a0: 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c  || (pColName->fl
e9b0: 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30  ags&MEM_Term)!=0
e9c0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
e9d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
e9e0: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
e9f0: 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
ea00: 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
ea10: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
ea20: 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
ea30: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
ea40: 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
ea50: 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
ea60: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
ea70: 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
ea80: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
ea90: 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
eaa0: 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
eab0: 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
eac0: 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
ead0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
eae0: 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
eaf0: 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
eb00: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
eb10: 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
eb20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
eb30: 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
eb40: 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
eb50: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  saction */.  int
eb60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
eb70: 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d  .  int needXcomm
eb80: 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  it = 0;..#ifdef 
eb90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
eba0: 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69  UALTABLE.  /* Wi
ebb0: 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20  th this option, 
ebc0: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
ebd0: 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
ebe0: 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20  be simply .  ** 
ebf0: 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69  SQLITE_OK so p i
ec00: 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a  s not used. .  *
ec10: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
ec20: 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a  ETER(p);.#endif.
ec30: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69  .  /* Before doi
ec40: 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
ec50: 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63  , call the xSync
ec60: 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  () callback for 
ec70: 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  any.  ** virtual
ec80: 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77   module tables w
ec90: 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74  ritten in this t
eca0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
ecb0: 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20   has to.  ** be 
ecc0: 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65  done before dete
ecd0: 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20  rmining whether 
ece0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
ecf0: 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72   file is .  ** r
ed00: 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78  equired, as an x
ed10: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
ed20: 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63  may add an attac
ed30: 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a  hed database.  *
ed40: 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  * to the transac
ed50: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
ed60: 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  = sqlite3VtabSyn
ed70: 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20  c(db, p);..  /* 
ed80: 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d  This loop determ
ed90: 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20  ines (a) if the 
eda0: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75  commit hook shou
edb0: 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e  ld be invoked an
edc0: 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d  d.  ** (b) how m
edd0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  any database fil
ede0: 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69  es have open wri
edf0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c  te transactions,
ee00: 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75   not .  ** inclu
ee10: 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61  ding the temp da
ee20: 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69  tabase. (b) is i
ee30: 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65  mportant because
ee40: 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20   if more than . 
ee50: 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65   ** one database
ee60: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65   file has an ope
ee70: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
ee80: 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f  ion, a master jo
ee90: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
eea0: 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
eeb0: 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74  an atomic commit
eec0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d  ..  */ .  for(i=
eed0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
eee0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
eef0: 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20  ++){ .    Btree 
ef00: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
ef10: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73  ].pBt;.    if( s
ef20: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
ef30: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
ef40: 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
ef50: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21   1;.      if( i!
ef60: 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20  =1 ) nTrans++;. 
ef70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ef80: 33 42 74 72 65 65 45 78 63 6c 75 73 69 76 65 4c  3BtreeExclusiveL
ef90: 6f 63 6b 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ock(pBt);.    }.
efa0: 20 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d 3e 62    }..  if( db->b
efb0: 55 6e 6c 6f 63 6b 65 64 20 26 26 20 28 72 63 20  Unlocked && (rc 
efc0: 26 20 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f  & 0xFF)==SQLITE_
efd0: 42 55 53 59 20 29 7b 0a 20 20 20 20 2f 2a 20 41  BUSY ){.    /* A
efe0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72  n SQLITE_BUSY or
eff0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41   SQLITE_BUSY_SNA
f000: 50 53 48 4f 54 20 77 61 73 20 65 6e 63 6f 75 6e  PSHOT was encoun
f010: 74 65 72 65 64 20 77 68 69 6c 65 20 0a 20 20 20  tered while .   
f020: 20 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74   ** attempting t
f030: 6f 20 74 61 6b 65 20 74 68 65 20 57 52 49 54 45  o take the WRITE
f040: 52 20 6c 6f 63 6b 20 6f 6e 20 61 20 77 61 6c 20  R lock on a wal 
f050: 66 69 6c 65 2e 20 52 65 6c 65 61 73 65 20 74 68  file. Release th
f060: 65 0a 20 20 20 20 2a 2a 20 57 52 49 54 45 52 20  e.    ** WRITER 
f070: 6c 6f 63 6b 73 20 6f 6e 20 61 6c 6c 20 77 61 6c  locks on all wal
f080: 20 66 69 6c 65 73 20 61 6e 64 20 72 65 74 75 72   files and retur
f090: 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 20  n early.  */.   
f0a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
f0b0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
f0c0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
f0d0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
f0e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
f0f0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
f100: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  t) ){.        sq
f110: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
f120: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pBt);.        sq
f130: 6c 69 74 65 33 50 61 67 65 72 44 72 6f 70 45 78  lite3PagerDropEx
f140: 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69  clusiveLock(sqli
f150: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
f160: 74 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  t));.        sql
f170: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
f180: 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Bt);.      }.   
f190: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
f1a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f1b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f1c0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
f1d0: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
f1e0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
f1f0: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
f200: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
f210: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
f220: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
f230: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63  llback ){.    rc
f240: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
f250: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
f260: 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20  itArg);.    if( 
f270: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
f280: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
f290: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b  AINT_COMMITHOOK;
f2a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f2b0: 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65   The simple case
f2c0: 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20   - no more than 
f2d0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
f2e0: 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  e (not counting 
f2f0: 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61  the.  ** TEMP da
f300: 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72  tabase) has a tr
f310: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
f320: 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .   There is no 
f330: 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  need for the.  *
f340: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
f350: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
f360: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
f370: 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  of sqlite3BtreeG
f380: 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20  etFilename() is 
f390: 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20  a zero length.  
f3a0: 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65  ** string, it me
f3b0: 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ans the main dat
f3c0: 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79  abase is :memory
f3d0: 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65  : or a temp file
f3e0: 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74  .  In .  ** that
f3f0: 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20   case we do not 
f400: 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d  support atomic m
f410: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
f420: 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20  s, so use the . 
f430: 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20   ** simple case 
f440: 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  then too..  */. 
f450: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
f460: 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42  trlen30(sqlite3B
f470: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
f480: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29  db->aDb[0].pBt))
f490: 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31  .   || nTrans<=1
f4a0: 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  .  ){.    for(i=
f4b0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
f4c0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
f4d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
f4e0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
f4f0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
f500: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
f510: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
f520: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
f530: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
f540: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
f550: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
f560: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
f570: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
f580: 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20   complete phase 
f590: 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  1. .    ** If on
f5a0: 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f  e of the BtreeCo
f5b0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
f5c0: 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73  alls fails, this
f5d0: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20   indicates an.  
f5e0: 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68    ** IO error wh
f5f0: 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ile deleting or 
f600: 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75  truncating a jou
f610: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73  rnal file. It is
f620: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a   unlikely,.    *
f630: 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70  * but could happ
f640: 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  en. In this case
f650: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
f660: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
f670: 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  he error..    */
f680: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
f690: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
f6a0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
f6b0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
f6c0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
f6d0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
f6e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f6f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
f700: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
f710: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
f720: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
f730: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f740: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
f750: 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  mit(db);.    }. 
f760: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d   }..  /* The com
f770: 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72  plex case - Ther
f780: 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c  e is a multi-fil
f790: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
f7a0: 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a  ion active..  **
f7b0: 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61   This requires a
f7c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f7d0: 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74  file to ensure t
f7e0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
f7f0: 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  s.  ** committed
f800: 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a   atomically..  *
f810: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
f820: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
f830: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
f840: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d  _vfs *pVfs = db-
f850: 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e  >pVfs;.    int n
f860: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
f870: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
f880: 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
f890: 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
f8a0: 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
f8b0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
f8c0: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
f8d0: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
f8e0: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
f8f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
f900: 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
f910: 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
f920: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  = 0;.    int res
f930: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43  ;.    int retryC
f940: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ount = 0;.    in
f950: 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20  t nMainFile;..  
f960: 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
f970: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f980: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d  e name */.    nM
f990: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
f9a0: 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46  3Strlen30(zMainF
f9b0: 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ile);.    zMaste
f9c0: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
f9d0: 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58  tf(db, "%s-mjXXX
f9e0: 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46  XXX9XXz", zMainF
f9f0: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ile);.    if( zM
fa00: 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72  aster==0 ) retur
fa10: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
fa20: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
fa30: 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
fa40: 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
fa50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
fa60: 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29  retryCount>100 )
fa70: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
fa80: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
fa90: 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a  ULL, "MJ delete:
faa0: 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
fab0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
fac0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
fad0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
fae0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
faf0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
fb00: 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b  retryCount==1 ){
fb10: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
fb20: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
fb30: 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a  LL, "MJ collide:
fb40: 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
fb50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fb60: 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75  }.      retryCou
fb70: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
fb80: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
fb90: 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
fba0: 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
fbb0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
fbc0: 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e  f(13, &zMaster[n
fbd0: 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25  MainFile], "-mj%
fbe0: 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20  06X9%02X",.     
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64            (iRand
fc10: 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c  om>>8)&0xffffff,
fc20: 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a   iRandom&0xff);.
fc30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74        /* The ant
fc40: 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61  ipenultimate cha
fc50: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61  racter of the ma
fc60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
fc70: 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e must.      ** 
fc80: 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20  be "9" to avoid 
fc90: 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  name collisions 
fca0: 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66  when using 8+3 f
fcb0: 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20  ilenames. */.   
fcc0: 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74     assert( zMast
fcd0: 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  er[sqlite3Strlen
fce0: 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d  30(zMaster)-3]==
fcf0: 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  '9' );.      sql
fd00: 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
fd10: 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74  zMainFile, zMast
fd20: 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
fd30: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
fd40: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
fd50: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
fd60: 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
fd70: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
fd80: 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
fd90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
fda0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
fdb0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
fdc0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
fdd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fde0: 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
fdf0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
fe00: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
fe10: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
fe20: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
fe30: 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
fe40: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
fe50: 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
fe60: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
fe70: 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
fe80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fe90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
fea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
feb0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
fec0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
fed0: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
fee0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
fef0: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
ff00: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
ff10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
ff20: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
ff30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ff40: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
ff50: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
ff60: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
ff70: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
ff80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ff90: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
ffa0: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
ffb0: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
ffc0: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
ffd0: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
ffe0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
fff0: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
10000 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
10010 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
10020 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
10030 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
10040 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
10050 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
10060 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
10070 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
10080 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
10090 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
100a0 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
100b0 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
100c0 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
100d0 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
100e0 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
100f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
10100 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
10110 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
10120 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
10130 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
10140 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
10150 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
10160 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e      if( !needSyn
10170 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72  c && !sqlite3Btr
10180 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70  eeSyncDisabled(p
10190 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
101a0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
101b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
101c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
101d0 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46  rite(pMaster, zF
101e0 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ile, sqlite3Strl
101f0 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f  en30(zFile)+1, o
10200 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
10210 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65  offset += sqlite
10220 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
10230 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
10240 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10250 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10260 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
10270 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
10280 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
10290 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
102a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
102b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
102c0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
102d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
102e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
102f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
10300 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
10310 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
10320 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
10330 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20  NTIAL device.   
10340 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20   ** flag is set 
10350 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  this is not requ
10360 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
10370 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20   if( needSync . 
10380 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74      && 0==(sqlit
10390 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
103a0 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
103b0 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
103c0 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20  SEQUENTIAL).    
103d0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
103e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
103f0 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49  nc(pMaster, SQLI
10400 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29  TE_SYNC_NORMAL))
10410 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
10420 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
10430 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
10440 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
10450 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
10460 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
10470 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
10480 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
10490 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
104a0 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
104b0 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
104c0 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
104d0 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
104e0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
104f0 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
10500 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
10510 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
10520 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
10530 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
10540 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
10550 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
10560 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
10570 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
10580 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
10590 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
105a0 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  st call to.    *
105b0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
105c0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20  mmitPhaseOne(), 
105d0 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
105e0 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a  chance that the.
105f0 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
10600 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
10610 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  be orphaned. But
10620 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
10630 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20  e it,.    ** in 
10640 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20  case the master 
10650 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
10660 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
10670 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
10680 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72     ** file befor
10690 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63  e the failure oc
106a0 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  curred..    */. 
106b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
106c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
106d0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
106e0 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
106f0 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
10700 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
10710 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10720 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
10730 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
10740 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
10750 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
10760 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
10770 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
10780 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
10790 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20  BUSY );.    if( 
107a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
107b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
107c0 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
107d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
107e0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
107f0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
10800 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10810 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
10820 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
10830 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
10840 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
10850 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
10860 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
10870 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
10880 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
10890 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
108a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
108b0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
108c0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
108d0 20 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20   needSync);.    
108e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
108f0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
10900 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
10910 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
10920 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10930 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
10940 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
10950 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
10960 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
10970 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
10980 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
10990 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
109a0 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
109b0 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
109c0 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
109d0 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
109e0 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
109f0 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
10a00 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
10a10 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
10a20 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
10a30 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
10a40 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
10a50 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
10a60 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
10a70 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
10a80 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
10a90 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
10aa0 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
10ab0 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
10ac0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
10ad0 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
10ae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
10af0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
10b00 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
10b10 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
10b20 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
10b30 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
10b40 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
10b50 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
10b60 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
10b70 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
10b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
10b90 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
10ba0 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
10bb0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
10bc0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
10bd0 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
10be0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
10bf0 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
10c00 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
10c10 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
10c20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10c30 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
10c40 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
10c50 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64   the sqlite3.nVd
10c60 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76  beActive count v
10c70 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
10c80 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
10c90 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
10ca0 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
10cb0 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
10cc0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
10cd0 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
10ce0 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
10cf0 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
10d00 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
10d10 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
10d20 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
10d30 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
10d40 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
10d50 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
10d60 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
10d70 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
10d80 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
10d90 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
10da0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
10db0 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
10dc0 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
10dd0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
10de0 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20  t nWrite = 0;.  
10df0 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20  int nRead = 0;. 
10e00 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
10e10 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
10e20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
10e30 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33  mt_busy((sqlite3
10e40 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20  _stmt*)p) ){.   
10e50 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
10e60 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  if( p->readOnly=
10e70 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20  =0 ) nWrite++;. 
10e80 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52       if( p->bIsR
10e90 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b  eader ) nRead++;
10ea0 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
10eb0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
10ec0 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
10ed0 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20  nVdbeActive );. 
10ee0 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
10ef0 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
10f00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  );.  assert( nRe
10f10 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ad==db->nVdbeRea
10f20 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  d );.}.#else.#de
10f30 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
10f40 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
10f50 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
10f60 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
10f70 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
10f80 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65  t opened a state
10f90 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
10fa0 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f  ,.** close it no
10fb0 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20  w. Argument eOp 
10fc0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
10fd0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10fe0 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  K or.** SAVEPOIN
10ff0 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74  T_RELEASE. If it
11000 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
11010 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65  LLBACK, then the
11020 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
11030 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
11040 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70  led back. If eOp
11050 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
11060 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20  LEASE, then the 
11070 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72  .** statement tr
11080 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
11090 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
110a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
110b0 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
110c0 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
110d0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
110e0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
110f0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
11100 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
11110 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
11120 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
11130 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
11140 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
11150 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11160 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74  ..  /* If p->iSt
11170 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74  atement is great
11180 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
11190 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65  en this Vdbe ope
111a0 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74  ned a .  ** stat
111b0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
111c0 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  n that should be
111d0 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68   closed here. Th
111e0 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e  e only exception
111f0 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e  .  ** is that an
11200 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61   IO error may ha
11210 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75  ve occurred, cau
11220 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63  sing an emergenc
11230 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  y rollback..  **
11240 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64   In this case (d
11250 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
11260 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ), and there is 
11270 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20  nothing to do.. 
11280 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53   */.  if( db->nS
11290 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
112a0 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
112b0 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
112c0 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
112d0 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
112e0 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  -1;..    assert(
112f0 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
11300 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d  ROLLBACK || eOp=
11310 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
11320 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  SE);.    assert(
11330 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
11340 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
11350 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
11360 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b  (db->nStatement+
11370 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20  db->nSavepoint) 
11380 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  );..    for(i=0;
11390 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
113a0 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  { .      int rc2
113b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
113c0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
113d0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
113e0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
113f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  {.        if( eO
11400 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
11410 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
11420 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
11430 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
11440 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Bt, SAVEPOINT_RO
11450 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
11460 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
11470 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d         if( rc2==
11480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11490 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
114a0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
114b0 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
114c0 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
114d0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
114e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
114f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11500 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63           rc = rc
11510 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
11520 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64     }.    }.    d
11530 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b  b->nStatement--;
11540 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  .    p->iStateme
11550 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  nt = 0;..    if(
11560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11570 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d  {.      if( eOp=
11580 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
11590 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ACK ){.        r
115a0 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
115b0 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
115c0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
115d0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
115e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
115f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11600 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11610 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
11620 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
11630 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
11640 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
11650 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11660 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
11670 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
11680 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ng rolled back, 
11690 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65  also restore the
116a0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
116b0 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
116c0 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
116d0 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
116e0 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
116f0 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
11700 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11710 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f   was opened.  */
11720 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  .    if( eOp==SA
11730 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
11740 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44   ){.      db->nD
11750 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d  eferredCons = p-
11760 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20  >nStmtDefCons;. 
11770 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
11780 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e  edImmCons = p->n
11790 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a  StmtDefImmCons;.
117a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
117b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
117c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
117d0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
117e0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
117f0 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
11800 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
11810 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
11820 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
11830 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
11840 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
11850 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
11860 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
11870 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
11880 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
11890 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
118a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
118b0 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
118c0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
118d0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
118e0 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
118f0 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
11900 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
11910 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
11920 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
11930 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
11940 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
11950 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20  T_FOREIGNKEY.** 
11960 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72  and write an err
11970 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
11980 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
11990 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
119a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
119b0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
119c0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
119d0 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
119e0 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
119f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
11a00 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
11a10 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65  rred && (db->nDe
11a20 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e  ferredCons+db->n
11a30 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29  DeferredImmCons)
11a40 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66  >0) .   || (!def
11a50 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
11a60 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20  onstraint>0) .  
11a70 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
11a80 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
11a90 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
11aa0 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
11ab0 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
11ac0 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
11ad0 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  (p, "FOREIGN KEY
11ae0 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
11af0 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
11b00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
11b10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11b20 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
11b30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11b40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
11b50 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
11b60 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
11b70 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
11b80 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
11b90 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
11ba0 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
11bb0 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
11bc0 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
11bd0 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
11be0 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
11bf0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
11c00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
11c10 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
11c20 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
11c30 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
11c40 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
11c50 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
11c60 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
11c70 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
11c80 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
11c90 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
11ca0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
11cb0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
11cc0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
11cd0 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
11ce0 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
11cf0 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
11d00 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
11d10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
11d20 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
11d30 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
11d40 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
11d50 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
11d60 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
11d70 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
11d80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
11d90 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
11da0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
11dd0 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
11de0 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
11df0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
11e00 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
11e10 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
11e20 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
11e30 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
11e40 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
11e50 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
11e60 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
11e70 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
11e80 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
11e90 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
11ea0 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
11eb0 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
11ec0 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
11ed0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
11ee0 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
11ef0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
11f00 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
11f10 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
11f20 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
11f30 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
11f40 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
11f50 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
11f60 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
11f70 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
11f80 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
11f90 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
11fa0 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
11fb0 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
11fc0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11fd0 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
11fe0 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
11ff0 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
12000 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
12010 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
12020 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
12030 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
12040 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
12050 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
12060 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
12070 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20   p->aOnceFlag ) 
12080 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46  memset(p->aOnceF
12090 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65  lag, 0, p->nOnce
120a0 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c  Flag);.  closeAl
120b0 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
120c0 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
120d0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
120e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
120f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
12100 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
12110 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
12120 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
12130 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
12140 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
12150 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
12160 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
12170 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
12180 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
12190 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
121a0 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
121b0 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
121c0 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
121d0 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
121e0 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
121f0 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
12200 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
12210 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
12220 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
12230 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
12240 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
12250 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
12260 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
12270 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
12280 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
12290 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
122a0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
122b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
122c0 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
122d0 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
122e0 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
122f0 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
12300 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
12310 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
12320 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
12330 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
12340 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
12350 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
12360 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
12370 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
12380 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
12390 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
123a0 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
123b0 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
123c0 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
123d0 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
123e0 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
123f0 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
12400 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
12410 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
12420 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
12430 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
12440 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
12450 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
12460 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
12470 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
12480 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
12490 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
124a0 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
124b0 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
124c0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
124d0 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
124e0 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
124f0 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
12500 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
12510 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
12520 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
12530 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
12540 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
12550 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
12560 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
12570 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
12580 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
12590 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
125a0 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
125b0 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
125c0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
125d0 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
125e0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
125f0 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
12600 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
12610 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
12620 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
12630 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
12640 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
12650 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
12660 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
12670 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
12680 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
12690 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
126a0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
126b0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
126c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
126d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
126e0 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
126f0 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
12700 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
12710 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
12720 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
12730 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
12740 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
12750 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
12760 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
12770 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
12780 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
12790 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
127a0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
127b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
127c0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
127d0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
127e0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
127f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
12800 64 62 2d 3e 62 55 6e 6c 6f 63 6b 65 64 20 3d 20  db->bUnlocked = 
12810 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  0;.          p->
12820 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
12830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12840 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
12850 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65  ck for immediate
12860 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f   foreign key vio
12870 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  lations. */.    
12880 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
128a0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
128b0 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
128c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
128d0 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
128e0 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
128f0 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
12900 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a  ve writer .    *
12910 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f  * VM, then we do
12920 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
12930 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
12940 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
12950 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
12960 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
12970 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
12980 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
12990 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
129a0 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
129b0 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
129c0 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
129d0 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
129e0 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
129f0 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
12a00 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
12a10 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e  nVdbeWrite==(p->
12a20 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
12a30 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
12a40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12a50 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
12a60 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
12a70 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
12a80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12a90 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
12aa0 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
12ab0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
12ad0 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
12ae0 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
12af0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12b00 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
12b10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12b20 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
12b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12b40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
12b50 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
12b60 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  NKEY;.        }e
12b70 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20  lse{ .          
12b80 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
12b90 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
12ba0 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
12bb0 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
12bc0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
12bd0 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
12be0 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  L' constraint an
12bf0 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  d there are no d
12c00 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a  eferred foreign.
12c10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79            ** key
12c20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
12c30 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
12c40 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
12c50 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
12c60 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
12c70 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
12c80 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
12c90 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
12ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
12cb0 66 28 20 28 72 63 20 26 20 30 78 46 46 29 3d 3d  f( (rc & 0xFF)==
12cc0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
12cd0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
12ce0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12cf0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
12d00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
12d10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12d20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12d30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
12d40 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
12d50 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
12d60 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
12d70 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
12d80 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
12d90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12da0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
12db0 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
12dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
12dd0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
12de0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
12df0 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
12e00 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20  LITE_DeferFKs;. 
12e10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12e20 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
12e30 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
12e40 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
12e50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12e60 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
12e70 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20   SQLITE_OK);.   
12e80 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
12e90 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
12ea0 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
12eb0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
12ec0 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
12ed0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
12ee0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
12ef0 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
12f00 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
12f10 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
12f20 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
12f30 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
12f40 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
12f50 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
12f60 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
12f70 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
12f80 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12f90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
12fb0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
12fc0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
12fd0 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
12fe0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
12ff0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
13000 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
13010 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 64 62   = 1;.        db
13020 2d 3e 62 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b  ->bUnlocked = 0;
13030 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
13040 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
13050 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
13060 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70   If eStatementOp
13070 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
13080 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
13090 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
130a0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f   to.    ** be co
130b0 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
130c0 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c  d back. Call sql
130d0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
130e0 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20  tement() to.    
130f0 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69  ** do so. If thi
13100 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75  s operation retu
13110 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e  rns an error, an
13120 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
13130 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65  atement.    ** e
13140 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
13150 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45  ITE_OK or SQLITE
13160 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65  _CONSTRAINT, the
13170 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20  n promote the.  
13180 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61    ** current sta
13190 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  tement error cod
131a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
131b0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29  ( eStatementOp )
131c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
131d0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
131e0 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65  tement(p, eState
131f0 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69  mentOp);.      i
13200 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
13210 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13220 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26  TE_OK || (p->rc&
13230 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
13240 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
13250 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
13260 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13270 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
13280 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
13290 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
132a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
132b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
132c0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
132d0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
132e0 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
132f0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
13300 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
13310 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
13320 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 64 62   = 1;.        db
13330 2d 3e 62 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b  ->bUnlocked = 0;
13340 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
13350 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
13360 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
13370 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
13380 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
13390 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20  r DELETE and no 
133a0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
133b0 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73  ction.    ** has
133c0 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
133d0 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61  k, update the da
133e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
133f0 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  n change-counter
13400 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
13410 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
13420 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53   ){.      if( eS
13430 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45  tatementOp!=SAVE
13440 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
13450 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13460 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
13470 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
13480 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13490 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
134a0 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
134b0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
134c0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
134d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
134e0 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
134f0 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
13500 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
13510 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  }..  /* We have 
13520 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c  successfully hal
13530 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74  ted and closed t
13540 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74  he VM.  Record t
13550 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69  his fact. */.  i
13560 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
13570 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69     db->nVdbeActi
13580 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70  ve--;.    if( !p
13590 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d  ->readOnly ) db-
135a0 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20  >nVdbeWrite--;. 
135b0 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
135c0 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52  der ) db->nVdbeR
135d0 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  ead--;.    asser
135e0 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
135f0 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ve>=db->nVdbeRea
13600 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
13610 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d   db->nVdbeRead>=
13620 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
13630 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
13640 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20  ->nVdbeWrite>=0 
13650 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  );.  }.  p->magi
13660 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48  c = VDBE_MAGIC_H
13670 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  ALT;.  checkActi
13680 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20  veVdbeCnt(db);. 
13690 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
136a0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
136b0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
136c0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
136d0 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
136e0 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  it flag is set t
136f0 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  o true, then any
13700 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65   locks that were
13710 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f   held.  ** by co
13720 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65  nnection db have
13730 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73   now been releas
13740 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ed. Call sqlite3
13750 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
13760 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e  ed() .  ** to in
13770 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65  voke any require
13780 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  d unlock-notify 
13790 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
137a0 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
137b0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
137c0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
137d0 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a  ocked(db);.  }..
137e0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
137f0 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64  dbeActive>0 || d
13800 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
13810 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65   || db->nStateme
13820 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  nt==0 );.  retur
13830 6e 20 28 28 70 2d 3e 72 63 20 26 20 30 78 46 46  n ((p->rc & 0xFF
13840 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  )==SQLITE_BUSY ?
13850 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
13860 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
13870 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
13880 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
13890 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
138a0 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
138b0 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
138c0 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
138d0 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
138e0 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
138f0 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
13900 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
13910 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
13920 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
13930 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13940 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
13950 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
13960 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
13970 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
13980 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
13990 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
139a0 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
139b0 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
139c0 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
139d0 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
139e0 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
139f0 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
13a00 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
13a10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13a20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
13a30 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
13a40 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
13a50 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
13a60 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
13a70 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
13a80 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
13a90 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
13aa0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
13ab0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
13ac0 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
13ad0 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
13ae0 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46  {.    u8 mallocF
13af0 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
13b00 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71  ocFailed;.    sq
13b10 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
13b20 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66  Malloc();.    if
13b30 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20  ( db->pErr==0 ) 
13b40 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74  db->pErr = sqlit
13b50 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
13b60 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
13b70 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
13b80 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
13b90 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
13ba0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
13bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
13bc0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
13bd0 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
13be0 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c  led = mallocFail
13bf0 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43  ed;.    db->errC
13c00 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73  ode = rc;.  }els
13c10 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
13c20 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d  ror(db, rc);.  }
13c30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13c40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
13c50 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a  NABLE_SQLLOG./*.
13c60 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f  ** If an SQLITE_
13c70 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f  CONFIG_SQLLOG ho
13c80 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ok is registered
13c90 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20   and the VM has 
13ca0 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e  been run, .** in
13cb0 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  voke it..*/.stat
13cc0 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f  ic void vdbeInvo
13cd0 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76  keSqllog(Vdbe *v
13ce0 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
13cf0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
13d00 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53  llog && v->rc==S
13d10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a  QLITE_OK && v->z
13d20 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20  Sql && v->pc>=0 
13d30 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78  ){.    char *zEx
13d40 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33  panded = sqlite3
13d50 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c  VdbeExpandSql(v,
13d60 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61   v->zSql);.    a
13d70 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e  ssert( v->db->in
13d80 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
13d90 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20    if( zExpanded 
13da0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13db0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
13dc0 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20  llog(.          
13dd0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
13de0 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
13df0 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
13e00 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 1.      );.   
13e10 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13e20 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65  (v->db, zExpande
13e30 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  d);.    }.  }.}.
13e40 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
13e50 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
13e60 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
13e70 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
13e80 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
13e90 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
13ea0 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
13eb0 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
13ec0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
13ed0 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
13ee0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
13ef0 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
13f00 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
13f10 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
13f20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
13f30 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
13f40 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
13f50 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
13f60 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
13f70 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
13f80 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
13f90 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
13fa0 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
13fb0 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
13fc0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
13fd0 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
13fe0 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
13ff0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
14000 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
14010 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
14020 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
14030 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
14040 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
14050 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
14060 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
14070 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
14080 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
14090 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
140a0 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
140b0 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
140c0 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
140d0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
140e0 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
140f0 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
14100 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
14110 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
14120 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
14130 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
14140 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
14150 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
14160 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
14170 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
14180 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
14190 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
141a0 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
141b0 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
141c0 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
141d0 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
141e0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
141f0 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
14200 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
14210 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
14220 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
14230 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14240 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
14250 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
14260 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
14270 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
14280 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
14290 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  f( p->runOnlyOnc
142a0 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  e ) p->expired =
142b0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
142c0 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
142d0 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
142e0 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
142f0 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
14300 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
14310 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
14320 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
14330 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
14340 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
14350 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
14360 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
14370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
14380 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
14390 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
143a0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
143b0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e  rWithMsg(db, p->
143c0 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f  rc, p->zErrMsg ?
143d0 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45   "%s" : 0, p->zE
143e0 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
143f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14400 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
14410 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
14420 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
14430 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
14440 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
14450 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
14460 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
14470 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
14480 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
14490 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
144a0 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
144b0 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
144c0 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
144d0 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
144e0 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
144f0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
14500 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
14510 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
14520 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
14530 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
14540 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
14550 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
14560 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
14570 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
14580 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
14590 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
145a0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c  .        char c,
145b0 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
145c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
145d0 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  - ");.        fo
145e0 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a  r(i=0; (c = p->z
145f0 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  Sql[i])!=0; i++)
14600 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
14610 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc=='\n' ) fprin
14620 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
14630 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63            putc(c
14640 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  , out);.        
14650 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20    pc = c;.      
14660 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
14670 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc!='\n' ) fprin
14680 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
14690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
146a0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
146b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
146c0 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar zHdr[100];.  
146d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
146e0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48  printf(sizeof(zH
146f0 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20  dr), zHdr, "%6u 
14700 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a  %12llu %8llu ",.
14710 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
14720 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
14730 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
14740 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
14750 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
14760 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
14770 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
14780 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
14790 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
147a0 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64  f(out, "%s", zHd
147b0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
147c0 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
147d0 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
147e0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
147f0 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
14800 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
14810 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d    p->iCurrentTim
14820 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = 0;.  p->magi
14830 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
14840 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
14850 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
14860 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
14870 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
14880 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
14890 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
148a0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
148b0 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
148c0 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
148d0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
148e0 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
148f0 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
14900 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
14910 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
14920 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14930 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
14940 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
14950 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
14960 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
14970 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14980 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
14990 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
149a0 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
149b0 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
149c0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
149d0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
149e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72  .}../*.** If par
149f0 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65  ameter iOp is le
14a00 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
14a10 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  en invoke the de
14a20 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20  structor for.** 
14a30 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61  all auxiliary da
14a40 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72  ta pointers curr
14a50 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20  ently cached by 
14a60 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
14a70 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
14a80 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  gument..**.** Or
14a90 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61  , if iOp is grea
14aa0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
14ab0 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  l to zero, then 
14ac0 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
14ad0 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  s.** only invoke
14ae0 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69  d for those auxi
14af0 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
14b00 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74  ers created by t
14b10 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63  he user .** func
14b20 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20  tion invoked by 
14b30 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  the OP_Function 
14b40 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75  opcode at instru
14b50 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a  ction iOp of .**
14b60 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f   VM pVdbe, and o
14b70 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a  nly then if:.**.
14b80 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f  **    * the asso
14b90 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  ciated function 
14ba0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
14bb0 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28   32nd or later (
14bc0 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20  counting.**     
14bd0 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
14be0 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  ght), or.**.**  
14bf0 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f    * the correspo
14c00 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67  nding bit in arg
14c10 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c  ument mask is cl
14c20 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66  ear (where the f
14c30 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e  irst.**      fun
14c40 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
14c50 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62  corresponds to b
14c60 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76  it 0 etc.)..*/.v
14c70 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
14c80 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
14c90 65 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f  e *pVdbe, int iO
14ca0 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
14cb0 41 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26  AuxData **pp = &
14cc0 70 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b  pVdbe->pAuxData;
14cd0 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b  .  while( *pp ){
14ce0 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41  .    AuxData *pA
14cf0 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66  ux = *pp;.    if
14d00 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c  ( (iOp<0).     |
14d10 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f  | (pAux->iOp==iO
14d20 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67  p && (pAux->iArg
14d30 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20  >31 || !(mask & 
14d40 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e  MASKBIT32(pAux->
14d50 69 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a  iArg)))).    ){.
14d60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14d70 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29  pAux->iArg==31 )
14d80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  ;.      if( pAux
14d90 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
14da0 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
14db0 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
14dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
14dd0 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b  p = pAux->pNext;
14de0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
14df0 46 72 65 65 28 70 56 64 62 65 2d 3e 64 62 2c 20  Free(pVdbe->db, 
14e00 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
14e10 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
14e20 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
14e30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
14e40 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
14e50 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
14e60 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
14e70 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
14e80 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
14e90 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
14ea0 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
14eb0 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
14ec0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
14ed0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
14ee0 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
14ef0 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
14f00 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
14f10 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
14f20 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
14f30 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
14f40 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
14f50 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
14f60 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
14f70 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
14f80 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
14f90 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
14fa0 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
14fb0 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
14fc0 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
14fd0 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Next;.  int i;. 
14fe0 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
14ff0 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
15000 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
15010 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
15020 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65  nVar);.  release
15030 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
15040 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
15050 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
15060 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
15070 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
15080 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
15090 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
150a0 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
150b0 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
150c0 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
150d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
150e0 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
150f0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e    }.  for(i=p->n
15100 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  zVar-1; i>=0; i-
15110 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  -) sqlite3DbFree
15120 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d  (db, p->azVar[i]
15130 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41  );.  vdbeFreeOpA
15140 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c  rray(db, p->aOp,
15150 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69   p->nOp);.  sqli
15160 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
15170 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  >aColName);.  sq
15180 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15190 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69  p->zSql);.  sqli
151a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
151b0 3e 70 46 72 65 65 29 3b 0a 23 69 66 64 65 66 20  >pFree);.#ifdef 
151c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
151d0 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
151e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
151f0 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  can; i++){.    s
15200 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15210 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61   p->aScan[i].zNa
15220 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
15230 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
15240 61 53 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d  aScan);.#endif.}
15250 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
15260 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
15270 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
15280 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
15290 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
152a0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
152b0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
152c0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
152d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
152e0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
152f0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
15300 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
15310 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  (db, p);.  if( p
15320 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
15330 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
15340 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
15350 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
15360 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
15370 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
15380 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
15390 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
153a0 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
153b0 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
153c0 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
153d0 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
153e0 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20  ;.  p->db = 0;. 
153f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15400 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
15410 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68  The cursor "p" h
15420 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65  as a pending see
15430 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  k operation that
15440 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
15450 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74  n.** carried out
15460 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73  .  Seek the curs
15470 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65  or now.  If an e
15480 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
15490 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  urn.** the appro
154a0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
154b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
154c0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
154d0 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
154e0 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
154f0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c   *p){.  int res,
15500 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
15510 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e  TE_TEST.  extern
15520 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
15530 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
15540 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  f.  assert( p->d
15550 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b  eferredMoveto );
15560 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73  .  assert( p->is
15570 54 61 62 6c 65 20 29 3b 0a 20 20 72 63 20 3d 20  Table );.  rc = 
15580 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
15590 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43  toUnpacked(p->pC
155a0 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76  ursor, 0, p->mov
155b0 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
155c0 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  es);.  if( rc ) 
155d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
155e0 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
155f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
15600 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c  BKPT;.#ifdef SQL
15610 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
15620 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
15630 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64  +;.#endif.  p->d
15640 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
15650 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  0;.  p->cacheSta
15660 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
15670 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  E;.  return SQLI
15680 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15690 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f  Something has mo
156a0 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f  ved cursor "p" o
156b0 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61  ut of place.  Ma
156c0 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77  ybe the row it w
156d0 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  as.** pointed to
156e0 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
156f0 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20   from under it. 
15700 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74   Or maybe the bt
15710 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c  ree was.** rebal
15720 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72  anced.  Whatever
15730 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20   the cause, try 
15740 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74  to restore "p" t
15750 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a  o the place it.*
15760 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  * is supposed to
15770 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49   be pointing.  I
15780 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65  f the row was de
15790 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
157a0 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73  nder the.** curs
157b0 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73  or, set the curs
157c0 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  or to point to a
157d0 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74   NULL row..*/.st
157e0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
157f0 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d  NOINLINE handleM
15800 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43  ovedCursor(VdbeC
15810 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
15820 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c   isDifferentRow,
15830 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
15840 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
15850 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15860 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
15870 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29  oved(p->pCursor)
15880 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
15890 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
158a0 74 6f 72 65 28 70 2d 3e 70 43 75 72 73 6f 72 2c  tore(p->pCursor,
158b0 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77   &isDifferentRow
158c0 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  );.  p->cacheSta
158d0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
158e0 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65  E;.  if( isDiffe
158f0 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c  rentRow ) p->nul
15900 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75  lRow = 1;.  retu
15910 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15920 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20  Check to ensure 
15930 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
15940 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f  is valid.  Resto
15950 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  re the cursor.**
15960 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65   if need be.  Re
15970 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72  turn any I/O err
15980 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74  or from the rest
15990 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ore operation..*
159a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
159b0 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56  eCursorRestore(V
159c0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
159d0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
159e0 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
159f0 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  p->pCursor) ){. 
15a00 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
15a10 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
15a20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15a30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15a40 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
15a50 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
15a60 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
15a70 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
15a80 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
15a90 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
15aa0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
15ab0 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
15ac0 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
15ad0 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
15ae0 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
15af0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
15b00 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
15b10 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
15b20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
15b30 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
15b40 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
15b50 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
15b60 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
15b70 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
15b80 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
15b90 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
15ba0 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
15bb0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
15bc0 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
15bd0 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
15be0 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
15bf0 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
15c00 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
15c10 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
15c20 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
15c30 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
15c40 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
15c50 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
15c60 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
15c70 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
15c80 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
15c90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15ca0 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
15cb0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
15cc0 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
15cd0 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
15ce0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66  return handleDef
15cf0 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a  erredMoveto(p);.
15d00 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 43 75    }.  if( p->pCu
15d10 72 73 6f 72 20 26 26 20 73 71 6c 69 74 65 33 42  rsor && sqlite3B
15d20 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
15d30 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  ed(p->pCursor) )
15d40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  {.    return han
15d50 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70  dleMovedCursor(p
15d60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15d70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15d80 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
15d90 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
15da0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
15db0 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71  rialType().** sq
15dc0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
15dd0 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ypeLen().** sqli
15de0 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
15df0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
15e00 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20  eSerialPut().** 
15e10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15e20 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  lGet().**.** enc
15e30 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
15e40 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
15e50 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
15e60 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
15e70 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
15e80 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
15e90 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
15ea0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
15eb0 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
15ec0 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
15ed0 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
15ee0 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
15ef0 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
15f00 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
15f10 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
15f20 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
15f30 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
15f40 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
15f50 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
15f60 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
15f70 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
15f80 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
15f90 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
15fa0 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
15fb0 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
15fc0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
15fd0 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
15fe0 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
15ff0 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
16000 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
16010 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
16020 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
16030 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
16040 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
16050 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e  blob separately.
16060 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
16070 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
16080 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
16090 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
160a0 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
160b0 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
160c0 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
160d0 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
160e0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
160f0 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
16100 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
16110 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
16120 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
16130 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
16140 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
16150 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
16160 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
16170 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
16180 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
161b0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
161c0 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
161d0 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
161e0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
161f0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
16220 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
16230 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
16250 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
16260 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
16270 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
16280 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
16290 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
162a0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
162d0 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
162e0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
162f0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
16300 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
16310 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
16320 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
16330 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
16340 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
16350 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
16360 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16380 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
16390 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
163a0 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
163b0 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
163c0 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
163d0 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
163e0 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
163f0 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
16400 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
16410 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
16420 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
16430 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
16440 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
16450 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
16460 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
16470 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
16480 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
16490 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
164a0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
164b0 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
164c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
164d0 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
164e0 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
164f0 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
16500 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
16510 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c  u32 n;..  if( fl
16520 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
16530 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16540 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
16550 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
16560 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
16570 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
16580 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
16590 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
165a0 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
165b0 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
165c0 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
165d0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
165e0 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69  u64 u;.    if( i
165f0 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20  <0 ){.      u = 
16600 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ~i;.    }else{. 
16610 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20       u = i;.    
16620 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  }.    if( u<=127
16630 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16640 20 28 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69   ((i&1)==i && fi
16650 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20  le_format>=4) ? 
16660 38 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20  8+(u32)u : 1;.  
16670 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33    }.    if( u<=3
16680 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b  2767 ) return 2;
16690 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38  .    if( u<=8388
166a0 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a  607 ) return 3;.
166b0 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
166c0 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34  83647 ) return 4
166d0 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  ;.    if( u<=MAX
166e0 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20  _6BYTE ) return 
166f0 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  5;.    return 6;
16700 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
16710 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
16720 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
16730 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
16740 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16750 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
16760 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
16770 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
16780 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
16790 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
167a0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
167b0 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
167c0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
167d0 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
167e0 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
167f0 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
16800 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
16810 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70  s for serial typ
16820 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 0a  es less than 12.
16830 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
16840 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  u8 sqlite3SmallT
16850 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20  ypeSizes[] = {. 
16860 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   0, 1, 2, 3, 4, 
16870 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30  6, 8, 8, 0, 0, 0
16880 2c 20 30 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  , 0.};../*.** Re
16890 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
168a0 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
168b0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
168c0 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
168d0 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
168e0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
168f0 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
16900 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
16910 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
16920 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
16930 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
16940 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
16950 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c  turn sqlite3Smal
16960 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
16970 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a  l_type];.  }.}..
16980 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
16990 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
169a0 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
169b0 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
169c0 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
169d0 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
169e0 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
169f0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
16a00 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
16a10 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
16a20 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
16a30 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
16a40 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
16a50 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
16a60 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
16a70 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
16a80 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
16a90 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
16aa0 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
16ab0 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
16ac0 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
16ad0 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
16ae0 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
16af0 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
16b00 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
16b10 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
16b20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
16b30 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
16b40 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
16b50 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
16b60 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
16b70 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
16b80 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
16b90 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
16ba0 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
16bb0 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
16bc0 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
16bd0 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
16be0 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
16bf0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
16c00 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
16c10 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
16c20 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
16c30 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
16c40 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
16c50 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
16c60 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
16c70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
16c80 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
16c90 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
16ca0 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
16cb0 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
16cc0 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
16cd0 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
16ce0 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
16cf0 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
16d00 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
16d10 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
16d20 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   correct..**.** 
16d30 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72  (2007-08-30)  Fr
16d40 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73  ank van Vugt has
16d50 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72   studied this pr
16d60 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a  oblem closely.**
16d70 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69   and has send hi
16d80 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68  s findings to th
16d90 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70  e SQLite develop
16da0 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77  ers.  Frank.** w
16db0 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20  rites that some 
16dc0 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66  Linux kernels of
16dd0 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  fer floating poi
16de0 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65  nt hardware.** e
16df0 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73  mulation that us
16e00 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d  es only 32-bit m
16e10 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64  antissas instead
16e20 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34   of a full .** 4
16e30 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72  8-bits as requir
16e40 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73  ed by the IEEE s
16e50 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20  tandard.  (This 
16e60 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47  is the.** CONFIG
16e70 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74  _FPE_FASTFPE opt
16e80 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73  ion.)  On such s
16e90 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67  ystems, floating
16ea0 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73   point.** byte s
16eb0 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20  wapping becomes 
16ec0 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64  very complicated
16ed0 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62  .  To avoid prob
16ee0 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63  lems,.** the nec
16ef0 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70  essary byte swap
16f00 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20  ping is carried 
16f10 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62  out using a 64-b
16f20 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61  it integer.** ra
16f30 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62  ther than a 64-b
16f40 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b  it float.  Frank
16f50 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74   assures us that
16f60 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a   the code here.*
16f70 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e  * works for him.
16f80 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f    We, the develo
16f90 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61  pers, have no wa
16fa0 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74  y to independent
16fb0 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69  ly.** verify thi
16fc0 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65  s, but Frank see
16fd0 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20  ms to know what 
16fe0 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62  he is talking ab
16ff0 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75  out.** so we tru
17000 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65  st him..*/.#ifde
17010 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
17020 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
17030 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f  T.static u64 flo
17040 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a  atSwap(u64 in){.
17050 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36    union {.    u6
17060 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32  4 r;.    u32 i[2
17070 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  ];.  } u;.  u32 
17080 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a  t;..  u.r = in;.
17090 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20    t = u.i[0];.  
170a0 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b  u.i[0] = u.i[1];
170b0 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20  .  u.i[1] = t;. 
170c0 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23   return u.r;.}.#
170d0 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
170e0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20  dEndianFloat(X) 
170f0 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58   X = floatSwap(X
17100 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
17110 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
17120 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a  Float(X).#endif.
17130 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
17140 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
17150 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
17160 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
17170 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
17180 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
17190 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
171a0 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
171b0 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
171c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
171d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
171e0 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66  tten..**.** nBuf
171f0 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   is the amount o
17200 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  f space left in 
17210 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c  buf[].  The call
17220 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
17230 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74  e.** for allocat
17240 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ing enough space
17250 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c   to buf[] to hol
17260 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
17270 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  ld, exclusive.**
17280 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e   of the pMem->u.
17290 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20  nZero bytes for 
172a0 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65  a MEM_Zero value
172b0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
172c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
172d0 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  es actually writ
172e0 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  ten into buf[]. 
172f0 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
17300 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a  f bytes in the z
17310 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20  ero-filled tail 
17320 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
17330 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
17340 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65  only.** if those
17350 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f   bytes were zero
17360 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20  ed in buf[]..*/ 
17370 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
17380 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75  SerialPut(u8 *bu
17390 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33  f, Mem *pMem, u3
173a0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
173b0 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
173c0 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
173d0 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
173e0 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
173f0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
17400 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
17410 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
17420 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
17430 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
17440 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
17450 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20  em->u.r) );.    
17460 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
17470 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28  em->u.r, sizeof(
17480 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d  v));.      swapM
17490 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
174a0 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
174b0 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75       v = pMem->u
174c0 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  .i;.    }.    le
174d0 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53  n = i = sqlite3S
174e0 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
174f0 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20  rial_type];.    
17500 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
17510 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66     do{.      buf
17520 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30  [--i] = (u8)(v&0
17530 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
17540 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 8;.    }while(
17550 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   i );.    return
17560 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
17570 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
17580 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
17590 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
175a0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
175b0 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
175c0 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
175d0 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20  >u.nZero:0).    
175e0 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74           == (int
175f0 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  )sqlite3VdbeSeri
17600 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
17610 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65  _type) );.    le
17620 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  n = pMem->n;.   
17630 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
17640 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
17650 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
17660 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
17670 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
17680 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
17690 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73  ./* Input "x" is
176a0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75   a sequence of u
176b0 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65  nsigned characte
176c0 72 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  rs that represen
176d0 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61  t a.** big-endia
176e0 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75  n integer.  Retu
176f0 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  rn the equivalen
17700 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72  t native integer
17710 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f  .*/.#define ONE_
17720 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
17730 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66  (i8)(x)[0]).#def
17740 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  ine TWO_BYTE_INT
17750 28 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29  (x)    (256*(i8)
17760 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29  ((x)[0])|(x)[1])
17770 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42  .#define THREE_B
17780 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35  YTE_INT(x)  (655
17790 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  36*(i8)((x)[0])|
177a0 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[1]<<8)|(x)[
177b0 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52  2]).#define FOUR
177c0 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28  _BYTE_UINT(x)  (
177d0 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34  ((u32)(x)[0]<<24
177e0 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
177f0 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
17800 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
17810 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37  BYTE_INT(x) (167
17820 37 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30  77216*(i8)((x)[0
17830 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c  ])|((x)[1]<<16)|
17840 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[2]<<8)|(x)[
17850 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72  3])../*.** Deser
17860 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20  ialize the data 
17870 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20  blob pointed to 
17880 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c  by buf as serial
17890 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70   type serial_typ
178a0 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74  e.** and store t
178b0 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65  he result in pMe
178c0 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  m.  Return the n
178d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
178e0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
178f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
17900 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73  emented as two s
17910 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73  eparate routines
17920 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65   for performance
17930 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73  ..** The few cas
17940 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  es that require 
17950 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
17960 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69  are broken out i
17970 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a  nto a separate.*
17980 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  * routine so tha
17990 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20  t in most cases 
179a0 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
179b0 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b  moving the stack
179c0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61   pointer.** is a
179d0 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74  voided..*/ .stat
179e0 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f  ic u32 SQLITE_NO
179f0 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74  INLINE serialGet
17a00 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
17a10 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
17a20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
17a30 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
17a40 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
17a50 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
17a60 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
17a70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
17a80 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17aa0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
17ab0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
17ac0 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75  e into */.){.  u
17ad0 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
17ae0 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33  _UINT(buf);.  u3
17af0 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  2 y = FOUR_BYTE_
17b00 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78  UINT(buf+4);.  x
17b10 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a   = (x<<32) + y;.
17b20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
17b30 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==6 ){.    /* E
17b40 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39  VIDENCE-OF: R-29
17b50 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20  851-52272 Value 
17b60 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
17b70 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77  64-bit.    ** tw
17b80 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
17b90 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d  teger. */.    pM
17ba0 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
17bb0 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  )&x;.    pMem->f
17bc0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
17bd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
17be0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d  em->u.i<0 );.  }
17bf0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
17c00 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34  DENCE-OF: R-5734
17c10 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73  3-49114 Value is
17c20 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45   a big-endian IE
17c30 45 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62  EE 754-2008 64-b
17c40 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  it.    ** floati
17c50 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e  ng point number.
17c60 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
17c70 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
17c80 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
17c90 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
17ca0 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
17cb0 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
17cc0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
17cd0 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
17ce0 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20  ame.    ** byte 
17cf0 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74  order.  Or, that
17d00 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44   if SQLITE_MIXED
17d10 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
17d20 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  OAT is.    ** de
17d30 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
17d40 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
17d50 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
17d60 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20  re mixed.    ** 
17d70 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  endian..    */. 
17d80 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
17d90 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
17da0 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
17db0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
17dc0 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
17dd0 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74  ;.    u64 t2 = t
17de0 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  1;.    swapMixed
17df0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
17e00 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
17e10 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28  eof(r1)==sizeof(
17e20 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72  t2) && memcmp(&r
17e30 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72  1, &t2, sizeof(r
17e40 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  1))==0 );.#endif
17e50 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
17e60 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
17e70 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d  eof(pMem->u.r)==
17e80 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78  8 );.    swapMix
17e90 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
17ea0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d  ;.    memcpy(&pM
17eb0 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a  em->u.r, &x, siz
17ec0 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65  eof(x));.    pMe
17ed0 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
17ee0 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e  e3IsNaN(pMem->u.
17ef0 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20  r) ? MEM_Null : 
17f00 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20  MEM_Real;.  }.  
17f10 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20  return 8;.}.u32 
17f20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17f30 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
17f40 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
17f50 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
17f60 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
17f70 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
17f80 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
17f90 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
17fa0 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
17fb0 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
17fc0 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
17fd0 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
17fe0 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
17ff0 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
18000 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
18010 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
18020 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
18030 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
18040 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
18050 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
18060 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
18070 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
18080 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20  {  /* Null */.  
18090 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
180a0 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37  OF: R-24078-0937
180b0 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c  5 Value is a NUL
180c0 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  L. */.      pMem
180d0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
180e0 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
180f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18100 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  1: {.      /* EV
18110 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38  IDENCE-OF: R-448
18120 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69  85-25196 Value i
18130 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d  s an 8-bit twos-
18140 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20  complement.     
18150 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   ** integer. */.
18160 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
18170 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62  = ONE_BYTE_INT(b
18180 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
18190 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
181a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
181b0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
181c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
181d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
181e0 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
181f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
18200 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
18210 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33  CE-OF: R-49794-3
18220 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20  5026 Value is a 
18230 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69  big-endian 16-bi
18240 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
18250 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
18260 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
18270 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54  m->u.i = TWO_BYT
18280 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
18290 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
182a0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
182b0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
182c0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
182d0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
182e0 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
182f0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
18300 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
18310 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18320 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75  37839-54301 Valu
18330 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
18340 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 24-bit.      *
18350 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
18360 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
18370 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
18380 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62  THREE_BYTE_INT(b
18390 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
183a0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
183b0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
183c0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
183d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b  .      return 3;
183e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
183f0 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
18400 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
18410 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
18420 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32  CE-OF: R-01849-2
18430 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20  6079 Value is a 
18440 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69  big-endian 32-bi
18450 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
18460 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
18470 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
18480 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
18490 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
184a0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
184b0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
184c0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
184d0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
184e0 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20  eturn 4;.    }. 
184f0 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
18500 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
18510 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
18520 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18530 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c  -50385-09674 Val
18540 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
18550 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20  an 48-bit.      
18560 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
18570 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
18580 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
18590 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
185a0 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29  buf+2) + (((i64)
185b0 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
185c0 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
185d0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
185e0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
185f0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
18600 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
18610 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
18620 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
18630 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
18640 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
18650 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
18660 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
18670 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73       /* These us
18680 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  e local variable
18690 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e  s, so do them in
186a0 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74   a separate rout
186b0 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ine.      ** to 
186c0 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20  avoid having to 
186d0 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70  move the frame p
186e0 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f  ointer in the co
186f0 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
18700 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c     return serial
18710 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74  Get(buf,serial_t
18720 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d  ype,pMem);.    }
18730 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
18740 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
18750 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
18760 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
18770 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
18780 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38  -OF: R-12976-228
18790 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20  93 Value is the 
187a0 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20  integer 0. */.  
187b0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
187c0 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32  OF: R-18143-1212
187d0 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  1 Value is the i
187e0 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20  nteger 1. */.   
187f0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
18800 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
18810 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
18820 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
18830 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
18840 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
18850 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
18860 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31  E-OF: R-14606-31
18870 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42  564 Value is a B
18880 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31  LOB that is (N-1
18890 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20  2)/2 bytes in.  
188a0 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20      ** length.. 
188b0 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
188c0 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31  -OF: R-28401-001
188d0 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74  40 Value is a st
188e0 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74  ring in the text
188f0 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20   encoding and.  
18900 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20      ** (N-13)/2 
18910 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
18920 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
18930 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67   const u16 aFlag
18940 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c  [] = { MEM_Blob|
18950 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53  MEM_Ephem, MEM_S
18960 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a  tr|MEM_Ephem };.
18970 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
18980 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
18990 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65     pMem->n = (se
189a0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
189b0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
189c0 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61  gs = aFlag[seria
189d0 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20  l_type&1];.     
189e0 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b   return pMem->n;
189f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18a00 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54  urn 0;.}./*.** T
18a10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
18a20 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
18a30 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
18a40 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64   for an Unpacked
18a50 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74  Record.** struct
18a60 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ure large enough
18a70 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
18a80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
18a90 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a  rdUnpack() if.**
18aa0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
18ab0 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
18ac0 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75   to KeyInfo stru
18ad0 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a  cture pKeyInfo..
18ae0 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20  **.** The space 
18af0 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61  is either alloca
18b00 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
18b10 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f  3DbMallocRaw() o
18b20 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a  r from within.**
18b30 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62   the unaligned b
18b40 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61  uffer passed via
18b50 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20   the second and 
18b60 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20  third arguments 
18b70 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73  (presumably.** s
18b80 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20  tack space). If 
18b90 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e  the former, then
18ba0 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
18bb0 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61  to a pointer tha
18bc0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65  t should.** be e
18bd0 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
18be0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
18bf0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
18c00 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  e(). Or, if the 
18c10 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  .** allocation c
18c20 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53  omes from the pS
18c30 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66  pace/szSpace buf
18c40 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20  fer, *ppFree is 
18c50 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62  set to NULL.** b
18c60 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
18c70 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
18c80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
18c90 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
18ca0 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f  .*/.UnpackedReco
18cb0 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41  rd *sqlite3VdbeA
18cc0 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f  llocUnpackedReco
18cd0 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  rd(.  KeyInfo *p
18ce0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
18cf0 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70        /* Descrip
18d00 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f  tion of the reco
18d10 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  rd */.  char *pS
18d20 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
18d30 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69          /* Unali
18d40 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c  gned space avail
18d50 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  able */.  int sz
18d60 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
18d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
18d80 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e  e of pSpace[] in
18d90 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
18da0 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20   **ppFree       
18db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
18dc0 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c  UT: Caller shoul
18dd0 64 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e  d free this poin
18de0 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61  ter */.){.  Unpa
18df0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20  ckedRecord *p;  
18e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
18e10 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74  npacked record t
18e20 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
18e30 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t nOff;         
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e50 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63   Increment pSpac
18e60 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69  e by nOff to ali
18e70 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  gn it */.  int n
18e80 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
18e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18ea0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
18eb0 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f  quired for *p */
18ec0 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74  ..  /* We want t
18ed0 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e  o shift the poin
18ee0 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75  ter pSpace up su
18ef0 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d  ch that it is 8-
18f00 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20  byte aligned..  
18f10 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64  ** Thus, we need
18f20 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20   to calculate a 
18f30 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74  value, nOff, bet
18f40 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f  ween 0 and 7, to
18f50 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20   shift .  ** it 
18f60 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69  by.  If pSpace i
18f70 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65  s already 8-byte
18f80 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73   aligned, nOff s
18f90 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20  hould be zero.. 
18fa0 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20   */.  nOff = (8 
18fb0 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  - (SQLITE_PTR_TO
18fc0 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37  _INT(pSpace) & 7
18fd0 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20  )) & 7;.  nByte 
18fe0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
18ff0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
19000 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28   + sizeof(Mem)*(
19010 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
19020 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  +1);.  if( nByte
19030 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b  >szSpace+nOff ){
19040 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  .    p = (Unpack
19050 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74  edRecord *)sqlit
19060 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b  e3DbMallocRaw(pK
19070 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74  eyInfo->db, nByt
19080 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  e);.    *ppFree 
19090 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20  = (char *)p;.   
190a0 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
190b0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
190c0 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
190d0 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f  cord*)&pSpace[nO
190e0 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65  ff];.    *ppFree
190f0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e   = 0;.  }..  p->
19100 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28  aMem = (Mem*)&((
19110 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28  char*)p)[ROUND8(
19120 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
19130 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65  ecord))];.  asse
19140 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
19150 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
19160 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70   p->pKeyInfo = p
19170 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46  KeyInfo;.  p->nF
19180 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ield = pKeyInfo-
19190 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72  >nField + 1;.  r
191a0 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
191b0 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79  * Given the nKey
191c0 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f  -byte encoding o
191d0 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b  f a record in pK
191e0 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74  ey[], populate t
191f0 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52  he .** UnpackedR
19200 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20  ecord structure 
19210 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
19220 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74   fourth argument
19230 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e   with the.** con
19240 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63  tents of the dec
19250 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20  oded record..*/ 
19260 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
19270 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20  eRecordUnpack(. 
19280 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
19290 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  fo,     /* Infor
192a0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
192b0 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a   record format *
192c0 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20  /.  int nKey,   
192d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
192e0 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79  ze of the binary
192f0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
19300 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
19310 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72      /* The binar
19320 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e  y record */.  Un
19330 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20  packedRecord *p 
19340 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
19350 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
19360 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
19370 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  . */.){.  const 
19380 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
19390 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  Key = (const uns
193a0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
193b0 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75  y;.  int d; .  u
193c0 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  32 idx;         
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
193e0 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79  * Offset in aKey
193f0 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  [] to read from 
19400 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20  */.  u16 u;     
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19420 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
19430 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
19440 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
19450 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61  Mem *pMem = p->a
19460 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75  Mem;..  p->defau
19470 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73  lt_rc = 0;.  ass
19480 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
19490 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20  ALIGNMENT(pMem) 
194a0 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  );.  idx = getVa
194b0 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
194c0 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72  dr);.  d = szHdr
194d0 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  u = 0;.  whi
194e0 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26  le( idx<szHdr &&
194f0 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20   d<=nKey ){.    
19500 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
19510 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  ..    idx += get
19520 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69  Varint32(&aKey[i
19530 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx], serial_type
19540 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  );.    pMem->enc
19550 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
19560 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d  ;.    pMem->db =
19570 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
19580 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67     /* pMem->flag
19590 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65  s = 0; // sqlite
195a0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
195b0 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66   will set this f
195c0 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65  or us */.    pMe
195d0 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m->szMalloc = 0;
195e0 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65  .    d += sqlite
195f0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
19600 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f  aKey[d], serial_
19610 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  type, pMem);.   
19620 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28   pMem++;.    if(
19630 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c   (++u)>=p->nFiel
19640 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  d ) break;.  }. 
19650 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
19660 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
19670 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
19680 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  = u;.}..#if SQLI
19690 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
196a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
196b0 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20  pares two index 
196c0 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  or table record 
196d0 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65  keys in the same
196e0 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73   way.** as the s
196f0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
19700 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e  Compare() routin
19710 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65  e. Unlike VdbeRe
19720 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a  cordCompare(),.*
19730 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
19740 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64  deserializes and
19750 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73   compares values
19760 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
19770 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
19780 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
19790 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e  MemCompare() fun
197a0 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73  ctions. It is us
197b0 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  ed.** in assert(
197c0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
197d0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
197e0 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69  optimized code i
197f0 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  n.** sqlite3Vdbe
19800 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
19810 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20  returns results 
19820 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70  with these two p
19830 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a  rimitives..**.**
19840 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
19850 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
19860 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69  mparison is equi
19870 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65  valent to desire
19880 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75  dResult..** Retu
19890 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72  rn false if ther
198a0 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d  e is a disagreem
198b0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
198c0 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
198d0 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74  pareDebug(.  int
198e0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
198f0 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
19900 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  ft key */.  cons
19910 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  t UnpackedRecord
19920 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67   *pPKey2, /* Rig
19930 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
19940 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20  desiredResult   
19950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
19960 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29  rect answer */.)
19970 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
19980 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
19990 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
199a0 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
199b0 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
199c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
199d0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
199e0 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
199f0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
19a00 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
19a10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
19a20 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
19a30 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
19a40 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  t rc = 0;.  cons
19a50 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
19a60 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
19a70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
19a80 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f  pKey1;.  KeyInfo
19a90 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65   *pKeyInfo;.  Me
19aa0 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49  m mem1;..  pKeyI
19ab0 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
19ac0 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b  eyInfo;.  if( pK
19ad0 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20  eyInfo->db==0 ) 
19ae0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31  return 1;.  mem1
19af0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
19b00 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
19b10 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
19b20 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
19b30 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
19b40 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
19b50 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19b60 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
19b70 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
19b80 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
19b90 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
19ba0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
19bb0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
19bc0 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
19bd0 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
19be0 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
19bf0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
19c00 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
19c10 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
19c20 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
19c30 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
19c40 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
19c50 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
19c60 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
19c70 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69  ally be used uni
19c80 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20  nitialized, and 
19c90 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  doing .  ** the 
19ca0 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74  unnecessary init
19cb0 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61  ialization has a
19cc0 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61   measurable nega
19cd0 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  tive performance
19ce0 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69  .  ** impact, si
19cf0 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
19d00 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20   is a very high 
19d10 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c  runner.  And so,
19d20 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20   we choose.  ** 
19d30 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f  to ignore the co
19d40 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
19d50 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76  and leave this v
19d60 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61  ariable uninitia
19d70 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  lized..  */.  /*
19d80 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20    mem1.u.i = 0; 
19d90 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20   // not needed, 
19da0 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20  here to silence 
19db0 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
19dc0 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   */.  .  idx1 = 
19dd0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
19de0 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66  1, szHdr1);.  if
19df0 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29  ( szHdr1>98307 )
19e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19e10 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73  ORRUPT;.  d1 = s
19e20 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
19e30 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
19e40 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
19e50 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
19e60 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
19e70 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
19e80 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
19e90 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
19ea0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
19eb0 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
19ec0 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
19ed0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
19ee0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
19ef0 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
19f00 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
19f10 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
19f20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
19f30 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
19f40 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
19f50 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
19f60 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
19f70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  e1 );..    /* Ve
19f80 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20  rify that there 
19f90 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70  is enough key sp
19fa0 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  ace remaining to
19fb0 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20   avoid.    ** a 
19fc0 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e  buffer overread.
19fd0 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c    The "d1+serial
19fe0 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70  _type1+2" subexp
19ff0 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ression will.   
1a000 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72   ** always be gr
1a010 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1a020 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e  ual to the amoun
1a030 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65  t of required ke
1a040 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  y space..    ** 
1a050 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69  Use that approxi
1a060 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20  mation to avoid 
1a070 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  the more expensi
1a080 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ve call to.    *
1a090 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1a0a0 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20  ialTypeLen() in 
1a0b0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
1a0c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a0d0 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
1a0e0 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20  2>(u32)nKey1.   
1a0f0 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56    && d1+sqlite3V
1a100 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1a110 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
1a120 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u32)nKey1 .    )
1a130 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
1a140 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
1a150 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
1a160 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
1a170 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
1a180 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1a190 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1a1a0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
1a1b0 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
1a1c0 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
1a1d0 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
1a1e0 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
1a1f0 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
1a200 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65  y2->aMem[i], pKe
1a210 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29  yInfo->aColl[i])
1a220 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
1a230 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1a240 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1a250 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
1a260 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
1a270 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
1a280 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1a290 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a2a0 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20  -rc;  /* Invert 
1a2b0 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44  the result for D
1a2c0 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20  ESC sort order. 
1a2d0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
1a2e0 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61   goto debugCompa
1a2f0 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  reEnd;.    }.   
1a300 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20   i++;.  }while( 
1a310 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
1a320 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
1a330 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1a340 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1a350 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1a360 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1a370 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1a380 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1a390 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
1a3a0 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
1a3b0 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
1a3c0 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
1a3d0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
1a3e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1a3f0 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
1a400 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
1a410 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
1a420 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
1a430 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
1a440 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
1a450 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
1a460 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
1a470 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
1a480 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
1a490 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
1a4a0 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
1a4b0 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ue.  */.  rc = p
1a4c0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1a4d0 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65  c;..debugCompare
1a4e0 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72  End:.  if( desir
1a4f0 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72  edResult==0 && r
1a500 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
1a510 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1a520 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29  sult<0 && rc<0 )
1a530 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1a540 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30   desiredResult>0
1a550 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72   && rc>0 ) retur
1a560 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55  n 1;.  if( CORRU
1a570 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31  PT_DB ) return 1
1a580 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
1a590 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1a5a0 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
1a5b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1a5c0 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
1a5d0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  DEBUG./*.** Coun
1a5e0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1a5f0 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63  fields (a.k.a. c
1a600 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72  olumns) in the r
1a610 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a  ecord given by.*
1a620 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68  * pKey,nKey.  Th
1a630 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  e verify that th
1a640 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73  is count is less
1a650 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1a660 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67  o the.** limit g
1a670 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f  iven by pKeyInfo
1a680 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79 49  ->nField + pKeyI
1a690 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a  nfo->nXField..**
1a6a0 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73  .** If this cons
1a6b0 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61  traint is not sa
1a6c0 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e  tisfied, it mean
1a6d0 73 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d  s that the high-
1a6e0 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63  speed.** vdbeRec
1a6f0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
1a700 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f  and vdbeRecordCo
1a710 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f  mpareString() ro
1a720 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e  utines will.** n
1a730 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
1a740 79 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65  y.  If this asse
1a750 72 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c  rt() ever fires,
1a760 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61   it probably mea
1a770 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b  ns.** that the K
1a780 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72  eyInfo.nField or
1a790 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64   KeyInfo.nXField
1a7a0 20 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d   values were com
1a7b0 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65  puted.** incorre
1a7c0 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
1a7d0 76 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46  void vdbeAssertF
1a7e0 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1a7f0 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65  imits(.  int nKe
1a800 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  y, const void *p
1a810 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65  Key,   /* The re
1a820 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a  cord to verify *
1a830 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e  / .  const KeyIn
1a840 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20  fo *pKeyInfo    
1a850 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69     /* Compare si
1a860 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79  ze with this Key
1a870 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Info */.){.  int
1a880 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75   nField = 0;.  u
1a890 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20  32 szHdr;.  u32 
1a8a0 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73  idx;.  u32 notUs
1a8b0 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  ed;.  const unsi
1a8c0 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1a8d0 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1a8e0 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20  d char*)pKey;.. 
1a8f0 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
1a900 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20  ) return;.  idx 
1a910 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1a920 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73  ey, szHdr);.  as
1a930 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b  sert( nKey>=0 );
1a940 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72  .  assert( szHdr
1a950 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20  <=(u32)nKey );. 
1a960 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
1a970 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20  r ){.    idx += 
1a980 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1a990 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a  +idx, notUsed);.
1a9a0 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20      nField++;.  
1a9b0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65  }.  assert( nFie
1a9c0 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  ld <= pKeyInfo->
1a9d0 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d  nField+pKeyInfo-
1a9e0 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65  >nXField );.}.#e
1a9f0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
1aa00 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1aa10 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c  tWithinLimits(A,
1aa20 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  B,C).#endif../*.
1aa30 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61  ** Both *pMem1 a
1aa40 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69  nd *pMem2 contai
1aa50 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e  n string values.
1aa60 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f   Compare the two
1aa70 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67   values.** using
1aa80 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1aa90 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41  equence pColl. A
1aaa0 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20  s usual, return 
1aab0 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72  a negative , zer
1aac0 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
1aad0 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31   value if *pMem1
1aae0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1aaf0 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74  qual to or great
1ab00 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65  er than .** *pMe
1ab10 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  m2, respectively
1ab20 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69  . Similar in spi
1ab30 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70  rit to "rc = (*p
1ab40 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29  Mem1) - (*pMem2)
1ab50 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ;"..*/.static in
1ab60 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  t vdbeCompareMem
1ab70 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20  String(.  const 
1ab80 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f  Mem *pMem1,.  co
1ab90 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a  nst Mem *pMem2,.
1aba0 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20    const CollSeq 
1abb0 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72  *pColl,.  u8 *pr
1abc0 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  cErr            
1abd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1abe0 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73  an OOM occurs, s
1abf0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1ac00 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  EM */.){.  if( p
1ac10 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  Mem1->enc==pColl
1ac20 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20  ->enc ){.    /* 
1ac30 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20  The strings are 
1ac40 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
1ac50 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e  orrect encoding.
1ac60 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20    Call the.     
1ac70 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ** comparison fu
1ac80 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20  nction directly 
1ac90 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  */.    return pC
1aca0 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1acb0 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c  >pUser,pMem1->n,
1acc0 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e  pMem1->z,pMem2->
1acd0 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d  n,pMem2->z);.  }
1ace0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
1acf0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64  ;.    const void
1ad00 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69   *v1, *v2;.    i
1ad10 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d  nt n1, n2;.    M
1ad20 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63  em c1;.    Mem c
1ad30 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  2;.    sqlite3Vd
1ad40 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70  beMemInit(&c1, p
1ad50 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
1ad60 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1ad70 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c  VdbeMemInit(&c2,
1ad80 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f   pMem1->db, MEM_
1ad90 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
1ada0 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1adb0 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c  Copy(&c1, pMem1,
1adc0 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1add0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1ade0 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20  hallowCopy(&c2, 
1adf0 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem2, MEM_Ephem
1ae00 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69  );.    v1 = sqli
1ae10 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1ae20 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31  lite3_value*)&c1
1ae30 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1ae40 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20     n1 = v1==0 ? 
1ae50 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32  0 : c1.n;.    v2
1ae60 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1ae70 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1ae80 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c2, pColl->
1ae90 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76  enc);.    n2 = v
1aea0 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b  2==0 ? 0 : c2.n;
1aeb0 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d  .    rc = pColl-
1aec0 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1aed0 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20  er, n1, v1, n2, 
1aee0 76 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v2);.    sqlite3
1aef0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1af00 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c1);.    sqlite3
1af10 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1af20 63 32 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31  c2);.    if( (v1
1af30 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26  ==0 || v2==0) &&
1af40 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72   prcErr ) *prcEr
1af50 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  r = SQLITE_NOMEM
1af60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1af70 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1af80 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e  mpare two blobs.
1af90 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
1afa0 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1afb0 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
1afc0 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61  t.** is less tha
1afd0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
1afe0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1aff0 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74   second, respect
1b000 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65  ively..** If one
1b010 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69   blob is a prefi
1b020 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20  x of the other, 
1b030 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72  then the shorter
1b040 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a   is the lessor..
1b050 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
1b060 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71  _NOINLINE int sq
1b070 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1b080 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c  (const Mem *pB1,
1b090 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29   const Mem *pB2)
1b0a0 7b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63  {.  int c = memc
1b0b0 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e  mp(pB1->z, pB2->
1b0c0 7a 2c 20 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e  z, pB1->n>pB2->n
1b0d0 20 3f 20 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d   ? pB2->n : pB1-
1b0e0 3e 6e 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72  >n);.  if( c ) r
1b0f0 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72  eturn c;.  retur
1b100 6e 20 70 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e  n pB1->n - pB2->
1b110 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  n;.}.../*.** Com
1b120 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  pare the values 
1b130 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  contained by the
1b140 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   two memory cell
1b150 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  s, returning.** 
1b160 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f  negative, zero o
1b170 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d  r positive if pM
1b180 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1b190 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1b1a0 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70  reater.** than p
1b1b0 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72  Mem2. Sorting or
1b1c0 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69  der is NULL's fi
1b1d0 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  rst, followed by
1b1e0 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65   numbers (intege
1b1f0 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29  rs.** and reals)
1b200 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61   sorted numerica
1b210 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  lly, followed by
1b220 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79   text ordered by
1b230 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a   the collating.*
1b240 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  * sequence pColl
1b250 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f   and finally blo
1b260 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d  b's ordered by m
1b270 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  emcmp()..**.** T
1b280 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  wo NULL values a
1b290 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
1b2a0 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63  ual by this func
1b2b0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1b2c0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63  ite3MemCompare(c
1b2d0 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
1b2e0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1b2f0 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  2, const CollSeq
1b300 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20   *pColl){.  int 
1b310 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f  f1, f2;.  int co
1b320 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20  mbined_flags;.. 
1b330 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61   f1 = pMem1->fla
1b340 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32  gs;.  f2 = pMem2
1b350 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69  ->flags;.  combi
1b360 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66  ned_flags = f1|f
1b370 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f  2;.  assert( (co
1b380 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d  mbined_flags & M
1b390 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b  EM_RowSet)==0 );
1b3a0 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  . .  /* If one v
1b3b0 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74  alue is NULL, it
1b3c0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1b3d0 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68  e other. If both
1b3e0 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65   values.  ** are
1b3f0 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e   NULL, return 0.
1b400 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1b410 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e  ined_flags&MEM_N
1b420 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
1b430 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20  n (f2&MEM_Null) 
1b440 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b  - (f1&MEM_Null);
1b450 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  .  }..  /* If on
1b460 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6d  e value is a num
1b470 62 65 72 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ber and the othe
1b480 72 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 6e 75  r is not, the nu
1b490 6d 62 65 72 20 69 73 20 6c 65 73 73 2e 0a 20 20  mber is less..  
1b4a0 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 6e  ** If both are n
1b4b0 75 6d 62 65 72 73 2c 20 63 6f 6d 70 61 72 65 20  umbers, compare 
1b4c0 61 73 20 72 65 61 6c 73 20 69 66 20 6f 6e 65 20  as reals if one 
1b4d0 69 73 20 61 20 72 65 61 6c 2c 20 6f 72 20 61 73  is a real, or as
1b4e0 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 69   integers.  ** i
1b4f0 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72  f both values ar
1b500 65 20 69 6e 74 65 67 65 72 73 2e 0a 20 20 2a 2f  e integers..  */
1b510 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1b520 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d  flags&(MEM_Int|M
1b530 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20  EM_Real) ){.    
1b540 64 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20  double r1, r2;. 
1b550 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20     if( (f1 & f2 
1b560 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  & MEM_Int)!=0 ){
1b570 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1b580 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.i < pMem2->u
1b590 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .i ) return -1;.
1b5a0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1b5b0 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i > pMem2->u.
1b5c0 69 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  i ) return 1;.  
1b5d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1b5e0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
1b5f0 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1b600 20 20 20 20 20 20 72 31 20 3d 20 70 4d 65 6d 31        r1 = pMem1
1b610 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65  ->u.r;.    }else
1b620 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74   if( (f1&MEM_Int
1b630 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31  )!=0 ){.      r1
1b640 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 31   = (double)pMem1
1b650 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ->u.i;.    }else
1b660 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
1b670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b680 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f2&MEM_Real)!=0
1b690 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 70   ){.      r2 = p
1b6a0 4d 65 6d 32 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d  Mem2->u.r;.    }
1b6b0 65 6c 73 65 20 69 66 28 20 28 66 32 26 4d 45 4d  else if( (f2&MEM
1b6c0 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1b6d0 20 20 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 70    r2 = (double)p
1b6e0 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  Mem2->u.i;.    }
1b6f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1b700 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
1b710 20 69 66 28 20 72 31 3c 72 32 20 29 20 72 65 74   if( r1<r2 ) ret
1b720 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1b730 72 31 3e 72 32 20 29 20 72 65 74 75 72 6e 20 31  r1>r2 ) return 1
1b740 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1b750 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65    }..  /* If one
1b760 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
1b770 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  ng and the other
1b780 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20   is a blob, the 
1b790 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a  string is less..
1b7a0 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65    ** If both are
1b7b0 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72   strings, compar
1b7c0 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  e using the coll
1b7d0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e  ating functions.
1b7e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1b7f0 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53  ined_flags&MEM_S
1b800 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  tr ){.    if( (f
1b810 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  1 & MEM_Str)==0 
1b820 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b830 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1b840 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f2 & MEM_Str)=
1b850 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1b860 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn -1;.    }..  
1b870 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1b880 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63  >enc==pMem2->enc
1b890 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b8a0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1b8b0 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20  TE_UTF8 || .    
1b8c0 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65          pMem1->e
1b8d0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
1b8e0 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63  LE || pMem1->enc
1b8f0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
1b900 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   );..    /* The 
1b910 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1b920 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  ce must be defin
1b930 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1b940 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a  , even if.    **
1b950 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65   the user delete
1b960 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
1b970 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74  sequence after t
1b980 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
1b990 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  is.    ** compil
1b9a0 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74  ed (this was not
1b9b0 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
1b9c0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
1b9d0 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20  sert( !pColl || 
1b9e0 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a  pColl->xCmp );..
1b9f0 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
1ba00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1ba10 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1ba20 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c  ng(pMem1, pMem2,
1ba30 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   pColl, 0);.    
1ba40 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55  }.    /* If a NU
1ba50 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70  LL pointer was p
1ba60 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c  assed as the col
1ba70 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66  late function, f
1ba80 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20  all through.    
1ba90 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63  ** to the blob c
1baa0 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63  ase and use memc
1bab0 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a  mp().  */.  }. .
1bac0 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73    /* Both values
1bad0 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20   must be blobs. 
1bae0 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d   Compare using m
1baf0 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72  emcmp().  */.  r
1bb00 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f  eturn sqlite3Blo
1bb10 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20  bCompare(pMem1, 
1bb20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pMem2);.}.../*.*
1bb30 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
1bb40 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
1bb50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1bb60 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68  a serial-type th
1bb70 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  at.** correspond
1bb80 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  s to an integer 
1bb90 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74  - all values bet
1bba0 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63  ween 1 and 9 inc
1bbb0 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70  lusive .** excep
1bbc0 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  t 7. The second 
1bbd0 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
1bbe0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
1bbf0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a   integer value.*
1bc00 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63  * serialized acc
1bc10 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c  ording to serial
1bc20 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63  _type. This func
1bc30 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65  tion deserialize
1bc40 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73  s.** and returns
1bc50 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73   the value..*/.s
1bc60 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65  tatic i64 vdbeRe
1bc70 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33  cordDecodeInt(u3
1bc80 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63  2 serial_type, c
1bc90 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a  onst u8 *aKey){.
1bca0 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72    u32 y;.  asser
1bcb0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
1bcc0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31   (serial_type>=1
1bcd0 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c   && serial_type<
1bce0 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =9 && serial_typ
1bcf0 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63  e!=7) );.  switc
1bd00 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1bd10 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20  {.    case 0:.  
1bd20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20    case 1:.      
1bd30 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1bd40 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1bd50 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f  return ONE_BYTE_
1bd60 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1bd70 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73  ase 2:.      tes
1bd80 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1bd90 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1bda0 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  urn TWO_BYTE_INT
1bdb0 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1bdc0 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   3:.      testca
1bdd0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1bde0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1bdf0 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1be00 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1be10 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  4: {.      testc
1be20 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1be30 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46  0 );.      y = F
1be40 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1be50 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ey);.      retur
1be60 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  n (i64)*(int*)&y
1be70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1be80 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74   5: {.      test
1be90 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1bea0 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1beb0 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  rn FOUR_BYTE_UIN
1bec0 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
1bed0 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1bee0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1bef0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
1bf00 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d   {.      u64 x =
1bf10 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1bf20 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1bf30 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1bf40 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d  x80 );.      x =
1bf50 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f   (x<<32) | FOUR_
1bf60 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34  BYTE_UINT(aKey+4
1bf70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1bf80 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a  (i64)*(i64*)&x;.
1bf90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1bfa0 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
1bfb0 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 8);.}../*.** 
1bfc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
1bfd0 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
1bfe0 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
1bff0 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70  ex records.** sp
1c000 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79  ecified by {nKey
1c010 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50  1, pKey1} and pP
1c020 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e  Key2.  It return
1c030 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  s a negative, ze
1c040 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
1c050 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79  e integer if key
1c060 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1c070 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
1c080 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79  greater than key
1c090 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20  2.  The {nKey1, 
1c0a0 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20  pKey1} key must 
1c0b0 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65  be a blob.** cre
1c0c0 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
1c0d0 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1c0e0 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
1c0f0 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
1c100 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
1c110 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
1c120 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
1c130 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
1c140 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
1c150 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69  argument bSkip i
1c160 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69  s non-zero, it i
1c170 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1c180 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1c190 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69  ready.** determi
1c1a0 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
1c1b0 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
1c1c0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1c1d0 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20  .**.** Key1 and 
1c1e0 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65  Key2 do not have
1c1f0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1c200 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  same number of f
1c210 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a  ields. If all .*
1c220 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70  * fields that ap
1c230 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79  pear in both key
1c240 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
1c250 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1c260 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75  t_rc is .** retu
1c270 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  rned..**.** If d
1c280 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1c290 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64  on is discovered
1c2a0 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72  , set pPKey2->er
1c2b0 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c  rCode to .** SQL
1c2c0 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
1c2d0 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20  return 0. If an 
1c2e0 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
1c2f0 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50  ountered, .** pP
1c300 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73  Key2->errCode is
1c310 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
1c320 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20  OMEM and, if it 
1c330 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1c340 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65  .** malloc-faile
1c350 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61  d flag set on da
1c360 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70  tabase handle (p
1c370 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1c380 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  >db)..*/.int sql
1c390 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1c3a0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20  mpareWithSkip(. 
1c3b0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1c3c0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
1c3d0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1c3e0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1c3f0 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20   *pPKey2,       
1c400 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1c410 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20  /.  int bSkip   
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c430 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1c440 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66  skip the first f
1c450 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  ield */.){.  u32
1c460 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c480 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1c490 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
1c4a0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
1c4b0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4d0 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69  Index of next fi
1c4e0 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  eld to compare *
1c4f0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
1c500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c510 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1c520 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20  ecord header in 
1c530 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69  bytes */.  u32 i
1c540 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dx1;            
1c550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1c560 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79  fset of first ty
1c570 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  pe in header */.
1c580 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1c5b0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73  e */.  Mem *pRhs
1c5c0 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b   = pPKey2->aMem;
1c5d0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
1c5e0 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74  ield of pPKey2 t
1c5f0 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b  o compare */.  K
1c600 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1c610 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
1c620 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  nfo;.  const uns
1c630 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1c640 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1c650 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1c660 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
1c670 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20   /* If bSkip is 
1c680 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63  true, then the c
1c690 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1c6a0 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  y determined tha
1c6b0 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  t the first.  **
1c6c0 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
1c6d0 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
1c6e0 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72  ual. Fix the var
1c6f0 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61  ious stack varia
1c700 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61  bles so.  ** tha
1c710 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  t this routine b
1c720 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20  egins comparing 
1c730 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69  at the second fi
1c740 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53  eld. */.  if( bS
1c750 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73  kip ){.    u32 s
1c760 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20  1;.    idx1 = 1 
1c770 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  + getVarint32(&a
1c780 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20  Key1[1], s1);.  
1c790 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31    szHdr1 = aKey1
1c7a0 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  [0];.    d1 = sz
1c7b0 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64  Hdr1 + sqlite3Vd
1c7c0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1c7d0 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a  s1);.    i = 1;.
1c7e0 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65      pRhs++;.  }e
1c7f0 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20  lse{.    idx1 = 
1c800 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1c810 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20  1, szHdr1);.    
1c820 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20  d1 = szHdr1;.   
1c830 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65   if( d1>(unsigne
1c840 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20  d)nKey1 ){ .    
1c850 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1c860 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1c870 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1c880 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
1c890 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1c8a0 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a     }.    i = 0;.
1c8b0 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28    }..  VVA_ONLY(
1c8c0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1c8d0 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1c8e0 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1c8f0 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
1c900 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1c910 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1c920 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  d+pPKey2->pKeyIn
1c930 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
1c940 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20  ey2->nField .   
1c950 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
1c960 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1c970 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1c980 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1c990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
1c9a0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  y2->pKeyInfo->nF
1c9b0 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
1c9c0 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
1c9d0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1c9e0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
1c9f0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1ca00 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69    /* RHS is an i
1ca10 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  nteger */.    if
1ca20 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1ca30 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
1ca40 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1ca50 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1ca60 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1ca70 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1ca80 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1ca90 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
1caa0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1cab0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1cac0 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
1cad0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1cae0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1caf0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1cb00 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  {.        double
1cb10 20 72 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 70   rhs = (double)p
1cb20 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Rhs->u.i;.      
1cb30 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1cb40 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1cb50 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1cb60 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1cb70 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 72 68 73  if( mem1.u.r<rhs
1cb80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1cb90 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1cba0 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e  else if( mem1.u.
1cbb0 72 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  r>rhs ){.       
1cbc0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1cbd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1cbe0 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c  e{.        i64 l
1cbf0 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44  hs = vdbeRecordD
1cc00 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f  ecodeInt(serial_
1cc10 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d  type, &aKey1[d1]
1cc20 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72  );.        i64 r
1cc30 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a  hs = pRhs->u.i;.
1cc40 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c          if( lhs<
1cc50 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1cc60 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1cc70 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e    }else if( lhs>
1cc80 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1cc90 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1cca0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ccb0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1ccc0 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   real */.    els
1ccd0 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1cce0 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
1ccf0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1cd00 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1cd10 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1cd20 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20  l_type>=10 ){.  
1cd30 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
1cd40 74 79 70 65 73 20 31 32 20 6f 72 20 67 72 65 61  types 12 or grea
1cd50 74 65 72 20 61 72 65 20 73 74 72 69 6e 67 73 20  ter are strings 
1cd60 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74  and blobs (great
1cd70 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20  er than.        
1cd80 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70  ** numbers). Typ
1cd90 65 73 20 31 30 20 61 6e 64 20 31 31 20 61 72 65  es 10 and 11 are
1cda0 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65   currently "rese
1cdb0 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
1cdc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22  .        ** use"
1cdd0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1cde0 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68  really matter wh
1cdf0 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  at the results o
1ce00 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20  f comparing.    
1ce10 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e      ** them to n
1ce20 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20 61  umberic values a
1ce30 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  re.  */.        
1ce40 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1ce50 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1ce60 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
1ce70 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1ce80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ce90 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 70 52   double rhs = pR
1cea0 68 73 2d 3e 75 2e 72 3b 0a 20 20 20 20 20 20 20  hs->u.r;.       
1ceb0 20 64 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20 20   double lhs;.   
1cec0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ced0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1cee0 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1cef0 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
1cf00 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1cf10 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  pe==7 ){.       
1cf20 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 75 2e     lhs = mem1.u.
1cf30 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
1cf40 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73 20  {.          lhs 
1cf50 3d 20 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e 75  = (double)mem1.u
1cf60 2e 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  .i;.        }.  
1cf70 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68        if( lhs<rh
1cf80 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1cf90 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1cfa0 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68  }else if( lhs>rh
1cfb0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1cfc0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1cfd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1cfe0 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1cff0 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65   string */.    e
1d000 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1d010 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
1d020 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74  .      getVarint
1d030 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c  32(&aKey1[idx1],
1d040 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1d050 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1d060 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
1d070 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1d080 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20  al_type<12 ){.  
1d090 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1d0a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
1d0b0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
1d0c0 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  x01) ){.        
1d0d0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1d0e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
1d0f0 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74  m1.n = (serial_t
1d100 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20  ype - 12) / 2;. 
1d110 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1d120 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75   (d1+mem1.n)==(u
1d130 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1d140 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1d150 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29  e( (d1+mem1.n+1)
1d160 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1d170 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
1d180 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28   (d1+mem1.n) > (
1d190 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1d1a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  {.          pPKe
1d1b0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1d1c0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1d1d0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1d1e0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1d1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1d200 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
1d210 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65     }else if( pKe
1d220 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
1d230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
1d240 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
1d250 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  ->enc;.         
1d260 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
1d270 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  nfo->db;.       
1d280 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20     mem1.flags = 
1d290 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20  MEM_Str;.       
1d2a0 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61     mem1.z = (cha
1d2b0 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20  r*)&aKey1[d1];. 
1d2c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64           rc = vd
1d2d0 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1d2e0 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng(.            
1d2f0 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70    &mem1, pRhs, p
1d300 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1d310 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43  ], &pPKey2->errC
1d320 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ode.          );
1d330 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d340 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
1d350 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c  mp = MIN(mem1.n,
1d360 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20   pRhs->n);.     
1d370 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70       rc = memcmp
1d380 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68  (&aKey1[d1], pRh
1d390 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20  s->z, nCmp);.   
1d3a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30         if( rc==0
1d3b0 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d   ) rc = mem1.n -
1d3c0 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20   pRhs->n; .     
1d3d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d3e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1d3f0 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20  s a blob */.    
1d400 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1d410 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
1d420 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  ){.      getVari
1d430 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
1d440 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
1d450 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d460 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1d470 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1d480 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20  rial_type<12 || 
1d490 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
1d4a0 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  x01) ){.        
1d4b0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1d4c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1d4d0 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c  t nStr = (serial
1d4e0 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
1d4f0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1d500 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75  e( (d1+nStr)==(u
1d510 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1d520 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1d530 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d  e( (d1+nStr+1)==
1d540 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1d550 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1d560 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69  d1+nStr) > (unsi
1d570 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
1d580 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
1d590 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1d5a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1d5b0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
1d5c0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1d5d0 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
1d5e0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
1d5f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d600 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e  int nCmp = MIN(n
1d610 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  Str, pRhs->n);. 
1d620 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
1d630 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
1d640 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
1d650 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1d660 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72  c==0 ) rc = nStr
1d670 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20   - pRhs->n;.    
1d680 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d690 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1d6a0 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65  is null */.    e
1d6b0 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61  lse{.      seria
1d6c0 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1d6d0 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  dx1];.      rc =
1d6e0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30   (serial_type!=0
1d6f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1d700 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1d710 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
1d720 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
1d730 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
1d740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d750 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
1d760 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1d770 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1d780 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20  ey2, rc) );.    
1d790 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1d7a0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
1d7b0 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
1d7c0 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  low */.      ret
1d7d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
1d7e0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73     i++;.    pRhs
1d7f0 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71  ++;.    d1 += sq
1d800 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1d810 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
1d820 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d  pe);.    idx1 +=
1d830 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65   sqlite3VarintLe
1d840 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
1d850 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28    }while( idx1<(
1d860 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20  unsigned)szHdr1 
1d870 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
1d880 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69  eld && d1<=(unsi
1d890 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20  gned)nKey1 );.. 
1d8a0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
1d8b0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
1d8c0 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
1d8d0 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
1d8e0 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
1d8f0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
1d900 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
1d910 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
1d920 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
1d930 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
1d940 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
1d950 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1d960 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73  mem1).  */.  ass
1d970 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1d980 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
1d990 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
1d9a0 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68  that one or both
1d9b0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
1d9c0 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
1d9d0 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
1d9e0 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
1d9f0 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
1da00 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  al. Return the d
1da10 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76  efault_rc.  ** v
1da20 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  alue.  */.  asse
1da30 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a  rt( CORRUPT_DB .
1da40 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65         || vdbeRe
1da50 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1da60 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1da70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64  PKey2, pPKey2->d
1da80 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20  efault_rc) .    
1da90 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e     || pKeyInfo->
1daa0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1dab0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  .  );.  return p
1dac0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1dad0 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
1dae0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1daf0 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
1db00 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1db10 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79  1,   /* Left key
1db20 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1db30 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
1db40 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1db50 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  ey */.){.  retur
1db60 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1db70 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1db80 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
1db90 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a   pPKey2, 0);.}..
1dba0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1dbb0 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d  tion is an optim
1dbc0 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
1dbd0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1dbe0 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74  dCompare() .** t
1dbf0 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73  hat (a) the firs
1dc00 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
1dc10 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  2 is an integer,
1dc20 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a   and (b) the .**
1dc30 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
1dc40 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74  varint at the st
1dc50 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
1dc60 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
1dc70 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69  ingle.** byte (i
1dc80 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .e. is less than
1dc90 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20   128)..**.** To 
1dca0 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61  avoid concerns a
1dcb0 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72  bout buffer over
1dcc0 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74  reads, this rout
1dcd0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ine is only used
1dce0 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77  .** on schemas w
1dcf0 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  here the maximum
1dd00 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69   valid header si
1dd10 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f  ze is 63 bytes o
1dd20 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  r less..*/.stati
1dd30 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1dd40 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e  CompareInt(.  in
1dd50 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1dd60 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1dd70 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1dd80 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1dd90 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
1dda0 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
1ddb0 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d  const u8 *aKey =
1ddc0 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   &((const u8*)pK
1ddd0 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a  ey1)[*(const u8*
1dde0 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a  )pKey1 & 0x3F];.
1ddf0 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
1de00 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29  e = ((const u8*)
1de10 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74  pKey1)[1];.  int
1de20 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20   res;.  u32 y;. 
1de30 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20   u64 x;.  i64 v 
1de40 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  = pPKey2->aMem[0
1de50 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73  ].u.i;.  i64 lhs
1de60 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  ;..  vdbeAssertF
1de70 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1de80 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
1de90 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
1dea0 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
1deb0 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d   (*(u8*)pKey1)<=
1dec0 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f  0x3F || CORRUPT_
1ded0 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  DB );.  switch( 
1dee0 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1def0 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
1df00 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
1df10 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
1df20 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  hs = ONE_BYTE_IN
1df30 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1df40 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1df50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1df60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
1df70 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
1df80 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1df90 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42       lhs = TWO_B
1dfa0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1dfb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1dfc0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1dfd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1dfe0 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
1dff0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1e000 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1e010 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1e020 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1e030 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1e040 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e050 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
1e060 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
1e070 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1e080 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1e090 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1e0a0 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28     lhs = (i64)*(
1e0b0 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74  int*)&y;.      t
1e0c0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1e0d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e0e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1e0f0 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
1e100 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1e110 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f       lhs = FOUR_
1e120 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1e130 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1e140 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1e150 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1e160 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1e170 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e180 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
1e190 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
1e1a0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1e1b0 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45     x = FOUR_BYTE
1e1c0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1e1d0 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1e1e0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1e1f0 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c  aKey+4);.      l
1e200 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  hs = *(i64*)&x;.
1e210 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e220 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1e230 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1e240 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c  case 8: .      l
1e250 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  hs = 0;.      br
1e260 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a  eak;.    case 9:
1e270 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a  .      lhs = 1;.
1e280 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
1e290 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63    /* This case c
1e2a0 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20  ould be removed 
1e2b0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
1e2c0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1e2d0 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  running.    ** t
1e2e0 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64  his code. Includ
1e2f0 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63  ing it causes gc
1e300 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  c to generate a 
1e310 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20  faster switch . 
1e320 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
1e330 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65  (since the range
1e340 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65   of switch targe
1e350 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74  ts now starts at
1e360 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a   zero and.    **
1e370 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20   is contiguous) 
1e380 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  but does not cau
1e390 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65  se any duplicate
1e3a0 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65   code to be gene
1e3b0 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73  rated.    ** (as
1e3c0 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65   gcc is clever e
1e3d0 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65  nough to combine
1e3e0 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61   the two like ca
1e3f0 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20  ses). Other .   
1e400 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69   ** compilers mi
1e410 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20  ght be similar. 
1e420 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a   */ .    case 0:
1e430 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72   case 7:.      r
1e440 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1e450 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1e460 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1e470 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  ey2);..    defau
1e480 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
1e490 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1e4a0 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1e4b0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
1e4c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68  .  }..  if( v>lh
1e4d0 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
1e4e0 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c  PKey2->r1;.  }el
1e4f0 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a  se if( v<lhs ){.
1e500 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1e510 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r2;.  }else if
1e520 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
1e530 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >1 ){.    /* The
1e540 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1e550 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
1e560 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65  e equal. Compare
1e570 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20   the trailing . 
1e580 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a     ** fields.  *
1e590 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  /.    res = sqli
1e5a0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1e5b0 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
1e5c0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1e5d0 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2, 1);.  }else{.
1e5e0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
1e5f0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
1e600 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
1e610 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  l and there are 
1e620 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20  no trailing.    
1e630 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72  ** fields. Retur
1e640 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1e650 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73  t_rc in this cas
1e660 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  e. */.    res = 
1e670 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1e680 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rc;.  }..  asser
1e690 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1e6a0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1e6b0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1e6c0 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  res) );.  return
1e6d0 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   res;.}../*.** T
1e6e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1e6f0 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
1e700 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
1e710 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1e720 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
1e730 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1e740 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73  of pPKey2 is a s
1e750 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20  tring, that (b) 
1e760 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
1e770 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ** uses the coll
1e780 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
1e790 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68  INARY and (c) th
1e7a0 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
1e7b0 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a  eader varint .**
1e7c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1e7d0 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66   (pKey1/nKey1) f
1e7e0 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
1e7f0 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
1e800 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
1e810 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69  mpareString(.  i
1e820 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1e830 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1e840 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1e850 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1e860 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
1e870 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
1e880 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31   const u8 *aKey1
1e890 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   = (const u8*)pK
1e8a0 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  ey1;.  int seria
1e8b0 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65  l_type;.  int re
1e8c0 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74  s;..  vdbeAssert
1e8d0 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1e8e0 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
1e8f0 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
1e900 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72  yInfo);.  getVar
1e910 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
1e920 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1e930 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1e940 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  <12 ){.    res =
1e950 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20   pPKey2->r1;    
1e960 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
1e970 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f  1) is a number o
1e980 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65  r a null */.  }e
1e990 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
1e9a0 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1e9b0 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65   .    res = pPKe
1e9c0 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20  y2->r2;      /* 
1e9d0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
1e9e0 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c   a blob */.  }el
1e9f0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70  se{.    int nCmp
1ea00 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a  ;.    int nStr;.
1ea10 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20      int szHdr = 
1ea20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e  aKey1[0];..    n
1ea30 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
1ea40 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20  pe-12) / 2;.    
1ea50 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74  if( (szHdr + nSt
1ea60 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20  r) > nKey1 ){.  
1ea70 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
1ea80 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
1ea90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1eaa0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1eab0 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1eac0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d  */.    }.    nCm
1ead0 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d  p = MIN( pPKey2-
1eae0 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72  >aMem[0].n, nStr
1eaf0 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65   );.    res = me
1eb00 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64  mcmp(&aKey1[szHd
1eb10 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r], pPKey2->aMem
1eb20 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20  [0].z, nCmp);.. 
1eb30 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
1eb40 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74  .      res = nSt
1eb50 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r - pPKey2->aMem
1eb60 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  [0].n;.      if(
1eb70 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
1eb80 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e     if( pPKey2->n
1eb90 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Field>1 ){.     
1eba0 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
1ebb0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1ebc0 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
1ebd0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1ebe0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
1ebf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
1ec00 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
1ec10 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20  ault_rc;.       
1ec20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
1ec30 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
1ec40 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1ec50 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r2;.      }els
1ec60 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
1ec70 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
1ec80 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1ec90 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
1eca0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1ecb0 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r2;.    }else{. 
1ecc0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1ecd0 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2->r1;.    }.  }
1ece0 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
1ecf0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1ed00 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1ed10 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20   pPKey2, res).  
1ed20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
1ed30 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b  DB.       || pPK
1ed40 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
1ed50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
1ed60 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65    );.  return re
1ed70 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
1ed80 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1ed90 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  an sqlite3VdbeRe
1eda0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f  cordCompare() co
1edb0 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f  mpatible functio
1edc0 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f  n.** suitable fo
1edd0 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69  r comparing seri
1ede0 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74  alized records t
1edf0 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72  o the unpacked r
1ee00 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20  ecord passed.** 
1ee10 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
1ee20 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43  ment..*/.RecordC
1ee30 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64  ompare sqlite3Vd
1ee40 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e  beFindCompare(Un
1ee50 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
1ee60 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63  {.  /* varintRec
1ee70 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
1ee80 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64  and varintRecord
1ee90 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20  CompareString() 
1eea0 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a  both assume.  **
1eeb0 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
1eec0 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
1eed0 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
1eee0 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
1eef0 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74   record.  ** fit
1ef00 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
1ef10 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20  te (i.e. is 127 
1ef20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74  or less). varint
1ef30 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1ef40 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73  ().  ** also ass
1ef50 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
1ef60 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64  safe to overread
1ef70 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20   a buffer by at 
1ef80 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20  least the .  ** 
1ef90 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65  maximum possible
1efa0 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69   legal header si
1efb0 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e  ze plus 8 bytes.
1efc0 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69   Because there i
1efd0 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65  s.  ** guarantee
1efe0 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  d to be at least
1eff0 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36   74 (but not 136
1f000 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  ) bytes of paddi
1f010 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ng following eac
1f020 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61  h.  ** buffer pa
1f030 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65  ssed to varintRe
1f040 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
1f050 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63   this makes it c
1f060 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a  onvenient to.  *
1f070 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65  * limit the size
1f080 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74   of the header t
1f090 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61  o 64 bytes in ca
1f0a0 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69  ses where the fi
1f0b0 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69  rst field.  ** i
1f0c0 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20  s an integer..  
1f0d0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69  **.  ** The easi
1f0e0 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72  est way to enfor
1f0f0 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73  ce this limit is
1f100 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c   to consider onl
1f110 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20  y records with. 
1f120 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72   ** 13 fields or
1f130 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69   less. If the fi
1f140 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20  rst field is an 
1f150 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78  integer, the max
1f160 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20  imum legal.  ** 
1f170 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28  header size is (
1f180 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79  12*5 + 1 + 1) by
1f190 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28  tes.  */.  if( (
1f1a0 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  p->pKeyInfo->nFi
1f1b0 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66  eld + p->pKeyInf
1f1c0 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20  o->nXField)<=13 
1f1d0 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  ){.    int flags
1f1e0 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c   = p->aMem[0].fl
1f1f0 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ags;.    if( p->
1f200 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1f210 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  rder[0] ){.     
1f220 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20   p->r1 = 1;.    
1f230 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20    p->r2 = -1;.  
1f240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f250 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20  ->r1 = -1;.     
1f260 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20   p->r2 = 1;.    
1f270 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
1f280 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20   & MEM_Int) ){. 
1f290 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
1f2a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1f2b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
1f2c0 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
1f2d0 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65  M_Real );.    te
1f2e0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
1f2f0 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  MEM_Null );.    
1f300 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
1f310 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
1f320 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
1f330 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c  MEM_Real|MEM_Nul
1f340 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  l|MEM_Blob))==0 
1f350 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  && p->pKeyInfo->
1f360 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20  aColl[0]==0 ){. 
1f370 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
1f380 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a  gs & MEM_Str );.
1f390 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
1f3a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1f3b0 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ring;.    }.  }.
1f3c0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1f3d0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1f3e0 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  re;.}../*.** pCu
1f3f0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
1f400 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
1f410 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
1f420 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1f430 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
1f440 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
1f450 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
1f460 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
1f470 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
1f480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1f490 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
1f4a0 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
1f4b0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
1f4c0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68  .**.** pCur migh
1f4d0 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t be pointing to
1f4e0 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66   text obtained f
1f4f0 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  rom a corrupt da
1f500 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
1f510 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  So the content c
1f520 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
1f530 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74  .  Do appropriat
1f540 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20  e checks on the 
1f550 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  content..*/.int 
1f560 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
1f570 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  wid(sqlite3 *db,
1f580 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
1f590 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20   i64 *rowid){.  
1f5a0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
1f5b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
1f5c0 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
1f5d0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
1f5e0 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
1f5f0 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
1f600 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
1f610 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33  he rowid */.  u3
1f620 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20  2 lenRowid;     
1f630 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72  /* Size of the r
1f640 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c  owid */.  Mem m,
1f650 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68   v;..  /* Get th
1f660 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
1f670 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
1f680 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
1f690 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
1f6a0 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
1f6b0 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
1f6c0 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
1f6d0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1f6e0 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75  ..  ** Any corru
1f6f0 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
1f700 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  d in sqlite3Btre
1f710 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
1f720 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a   though, so.  **
1f730 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73   this code can s
1f740 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61  afely assume tha
1f750 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32  t nCellKey is 32
1f760 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61  -bits  .  */.  a
1f770 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1f780 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
1f790 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f  (pCur) );.  VVA_
1f7a0 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
1f7b0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
1f7c0 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
1f7d0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
1f7e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20  QLITE_OK );     
1f7f0 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
1f800 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
1f810 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
1f820 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  /.  assert( (nCe
1f830 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
1f840 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
1f850 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
1f860 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
1f870 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
1f880 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
1f890 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1f8a0 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
1f8b0 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
1f8c0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
1f8d0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
1f8e0 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
1f8f0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1f900 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f910 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
1f920 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
1f930 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
1f940 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
1f950 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
1f960 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
1f970 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
1f980 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
1f990 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
1f9a0 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
1f9b0 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29  szHdr<3 || (int)
1f9c0 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20  szHdr>m.n) ){.  
1f9d0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
1f9e0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
1f9f0 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
1fa00 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
1fa10 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
1fa20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
1fa30 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
1fa40 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
1fa50 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
1fa60 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
1fa70 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
1fa80 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
1fa90 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
1faa0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
1fab0 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
1fac0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
1fad0 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
1fae0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
1faf0 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
1fb00 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
1fb10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
1fb20 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
1fb30 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
1fb40 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
1fb50 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
1fb60 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
1fb70 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
1fb80 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
1fb90 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
1fba0 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
1fbb0 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
1fbc0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
1fbd0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
1fbe0 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
1fbf0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
1fc00 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d  Sizes[typeRowid]
1fc10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
1fc20 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
1fc30 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
1fc40 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
1fc50 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
1fc60 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
1fc70 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
1fc80 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
1fc90 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
1fca0 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
1fcb0 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
1fcc0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1fcd0 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
1fce0 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
1fcf0 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
1fd00 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
1fd10 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
1fd20 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
1fd30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1fd40 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
1fd50 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
1fd60 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
1fd70 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
1fd80 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
1fd90 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
1fda0 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
1fdb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1fdc0 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
1fdd0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
1fde0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73  .  testcase( m.s
1fdf0 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
1fe00 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1fe10 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
1fe20 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1fe30 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
1fe40 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
1fe50 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
1fe60 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
1fe70 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
1fe80 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
1fe90 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
1fea0 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
1feb0 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
1fec0 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
1fed0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
1fee0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1fef0 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
1ff00 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
1ff10 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
1ff20 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
1ff30 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1ff40 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
1ff50 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
1ff60 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
1ff70 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
1ff80 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
1ff90 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
1ffa0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
1ffb0 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
1ffc0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1ffd0 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
1ffe0 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
1fff0 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
20000 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
20010 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
20020 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
20030 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
20040 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
20050 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
20060 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
20070 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
20080 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200a0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
200b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
200c0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
200d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200e0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
200f0 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
20100 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
20110 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
20120 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61  d,       /* Unpa
20130 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cked version of 
20140 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  key */.  int *re
20150 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
20160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
20170 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
20180 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
20190 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
201a0 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
201b0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
201c0 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  ur = pC->pCursor
201d0 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73  ;.  Mem m;..  as
201e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
201f0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
20200 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f  pCur) );.  VVA_O
20210 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65  NLY(rc =) sqlite
20220 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
20230 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
20240 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
20250 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a  LITE_OK );    /*
20260 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
20270 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
20280 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
20290 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
202a0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
202b0 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
202c0 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
202d0 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68   the way.  ** th
202e0 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
202f0 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
20300 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
20310 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
20320 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
20330 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
20340 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
20350 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
20360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
20370 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
20380 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
20390 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
203a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
203b0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
203c0 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
203d0 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
203e0 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
203f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
20400 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20  c;.  }.  *res = 
20410 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20420 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e  dCompare(m.n, m.
20430 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  z, pUnpacked);. 
20440 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
20450 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
20460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20470 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
20480 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
20490 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
204a0 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
204b0 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
204c0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
204d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
204e0 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
204f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
20500 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
20510 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
20520 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
20530 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
20540 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
20550 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
20560 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
20570 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
20580 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
20590 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
205a0 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
205b0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
205c0 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
205d0 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
205e0 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
205f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
20600 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
20610 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
20620 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
20630 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
20640 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
20650 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20660 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
20670 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
20680 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
20690 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
206a0 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
206b0 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
206c0 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
206d0 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
206e0 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
206f0 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
20700 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
20710 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
20720 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
20730 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
20740 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
20750 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
20760 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
20770 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
20780 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
20790 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
207a0 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
207b0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
207c0 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
207d0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
207e0 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
207f0 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
20800 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
20810 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
20820 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
20830 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
20840 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
20850 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
20860 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
20870 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
20880 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
20890 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
208a0 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
208b0 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >db;.}../*.** Re
208c0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
208d0 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
208e0 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
208f0 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
20900 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
20910 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
20920 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
20930 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
20940 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
20950 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
20960 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
20970 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
20980 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
20990 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
209a0 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
209b0 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
209c0 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
209d0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
209e0 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
209f0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
20a00 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
20a10 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
20a20 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
20a30 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
20a40 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  dValue(Vdbe *v, 
20a50 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
20a60 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
20a70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
20a80 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
20a90 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
20aa0 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  1];.    if( 0==(
20ab0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
20ac0 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20  M_Null) ){.     
20ad0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
20ae0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61  pRet = sqlite3Va
20af0 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20  lueNew(v->db);. 
20b00 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b       if( pRet ){
20b10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20b20 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d  VdbeMemCopy((Mem
20b30 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a   *)pRet, pMem);.
20b40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20b50 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
20b60 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c  y(pRet, aff, SQL
20b70 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
20b80 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
20b90 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pRet;.    }.  }.
20ba0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
20bb0 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53  *.** Configure S
20bc0 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72  QL variable iVar
20bd0 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67   so that binding
20be0 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20   a new value to 
20bf0 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f  it signals.** to
20c00 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d   sqlite3_reoptim
20c10 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72  ize() that re-pr
20c20 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74  eparing the stat
20c30 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74  ement may result
20c40 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20  .** in a better 
20c50 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76  query plan..*/.v
20c60 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
20c70 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a  etVarmask(Vdbe *
20c80 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20  v, int iVar){.  
20c90 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
20ca0 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20  ;.  if( iVar>32 
20cb0 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
20cc0 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  k = 0xffffffff;.
20cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e    }else{.    v->
20ce0 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32  expmask |= ((u32
20cf0 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b  )1 << (iVar-1));
20d00 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
20d10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
20d20 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54  UALTABLE./*.** T
20d30 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65  ransfer error me
20d40 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20  ssage text from 
20d50 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  an sqlite3_vtab.
20d60 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
20d70 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
20d80 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
20d90 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
20da0 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72  into a Vdbe.zErr
20db0 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
20dc0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
20dd0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
20de0 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f  te3DbMalloc)..*/
20df0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
20e00 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64  bImportErrmsg(Vd
20e10 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  be *p, sqlite3_v
20e20 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73  tab *pVtab){.  s
20e30 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
20e40 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  db;.  sqlite3DbF
20e50 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
20e60 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
20e70 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  g = sqlite3DbStr
20e80 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a  Dup(db, pVtab->z
20e90 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
20ea0 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
20eb0 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
20ec0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d  ->zErrMsg = 0;.}
20ed0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
20ee0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
20ef0 42 4c 45 20 2a 2f 0a                             BLE */.