/ Hex Artifact Content
Login

Artifact 56077f78bfc96e80f31ad595a05d4d73ac45f5c0:


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 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
53b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
53c0: 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 63 61  R_HINTS.      ca
53d0: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
53e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
53f0: 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70  rDelete(db, (Exp
5400: 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  r*)p4);.        
5410: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
5420: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
5430: 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20   P4_MPRINTF: {. 
5440: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
5450: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
5460: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34   sqlite3_free(p4
5470: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5490: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
54a0: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
54b0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
54c0: 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70  (db, (FuncDef*)p
54d0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
54e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
54f0: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
5500: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
5510: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
5520: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
5530: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
5540: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34  qlite3_value*)p4
5550: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
5560: 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20  {.          Mem 
5570: 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20  *p = (Mem*)p4;. 
5580: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
5590: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
55a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
55b0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
55c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
55d0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
55e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
55f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5600: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
5610: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
5620: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
5630: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
5640: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
5650: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
5660: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5670: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
5680: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
5690: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
56a0: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
56b0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
56c0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
56d0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
56e0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
56f0: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
5700: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
5710: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
5720: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
5730: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
5740: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
5750: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
5760: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
5770: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
5780: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
5790: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
57a0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
57b0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
57c0: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
57d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
57e0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
57f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
5800: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f  ree(db, pOp->zCo
5810: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20  mment);.#endif  
5820: 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
5830: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5840: 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , aOp);.}../*.**
5850: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
5860: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
5870: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
5880: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
5890: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
58a0: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
58b0: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
58c0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
58d0: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
58e0: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
58f0: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
5900: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
5910: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5920: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
5930: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
5940: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
5950: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
5960: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
5970: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
5980: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
5990: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
59a0: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
59b0: 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Noop.*/.void sql
59c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
59d0: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
59e0: 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 61  t addr){.  if( a
59f0: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ddr<p->nOp ){.  
5a00: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
5a10: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
5a20: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
5a30: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65 65   p->db;.    free
5a40: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
5a50: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
5a60: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20      memset(pOp, 
5a70: 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d  0, sizeof(pOp[0]
5a80: 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63  ));.    pOp->opc
5a90: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
5aa0: 20 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d 3e     if( addr==p->
5ab0: 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d 2d  nOp-1 ) p->nOp--
5ac0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
5ad0: 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64  f the last opcod
5ae0: 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74  e is "op" and it
5af0: 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64   is not a jump d
5b00: 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74  estination,.** t
5b10: 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20  hen remove it.  
5b20: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
5b30: 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70  nd only if an op
5b40: 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64  code was removed
5b50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5b60: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
5b70: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
5b80: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d  8 op){.  if( (p-
5b90: 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72  >nOp-1)>(p->pPar
5ba0: 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26  se->iFixedOp) &&
5bb0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5bc0: 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a  ].opcode==op ){.
5bd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5be0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70  hangeToNoop(p, p
5bf0: 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65  ->nOp-1);.    re
5c00: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
5c10: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5c20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
5c30: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
5c40: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
5c50: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
5c60: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
5c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5c80: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
5c90: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
5ca0: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
5cb0: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
5cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5cd0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
5ce0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
5cf0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
5d00: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
5d10: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
5d20: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
5d30: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
5d40: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
5d50: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
5d60: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
5d70: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
5d80: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
5d90: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
5da0: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
5db0: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
5dc0: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
5dd0: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
5de0: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
5df0: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
5e00: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
5e10: 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  4..** .** Other 
5e20: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
5e30: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
5e40: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
5e50: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
5e60: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
5e70: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
5e80: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
5e90: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
5ea0: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
5eb0: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
5ec0: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
5ed0: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
5ee0: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
5ef0: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
5f00: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
5f10: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
5f20: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
5f30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5f40: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
5f50: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
5f60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
5f70: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
5f80: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
5f90: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
5fa0: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
5fb0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
5fc0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5fd0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
5fe0: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62   p->aOp==0 || db
5ff0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6000: 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f  {.    if( n!=P4_
6010: 56 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72  VTAB ){.      fr
6020: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
6030: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
6040: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
6050: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
6060: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
6070: 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d   assert( addr<p-
6080: 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64  >nOp );.  if( ad
6090: 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72  dr<0 ){.    addr
60a0: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
60b0: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
60c0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65  Op[addr];.  asse
60d0: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
60e0: 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20  =P4_NOTUSED.    
60f0: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
6100: 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20  e==P4_INT32.    
6110: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
6120: 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b  e==P4_KEYINFO );
6130: 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f  .  freeP4(db, pO
6140: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
6150: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
6160: 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d  .p = 0;.  if( n=
6170: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
6180: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
6190: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
61a0: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
61b0: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
61c0: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
61d0: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
61e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
61f0: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
6200: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
6210: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
6220: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
6230: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
6240: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
6250: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
6260: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
6270: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
6280: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
6290: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70  KEYINFO ){.    p
62a0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
62b0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
62c0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
62d0: 4e 46 4f 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NFO;.#ifdef SQLI
62e0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
62f0: 5f 48 49 4e 54 53 0a 20 20 7d 65 6c 73 65 20 69  _HINTS.  }else i
6300: 66 28 20 6e 3d 3d 50 34 5f 45 58 50 52 20 29 7b  f( n==P4_EXPR ){
6310: 0a 20 20 20 20 2f 2a 20 52 65 73 70 6f 6e 73 69  .    /* Responsi
6320: 62 69 6c 69 74 79 20 66 6f 72 20 64 65 6c 65 74  bility for delet
6330: 69 6e 67 20 74 68 65 20 45 78 70 72 20 74 72 65  ing the Expr tre
6340: 65 20 69 73 20 68 61 6e 64 65 64 20 6f 76 65 72  e is handed over
6350: 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 56   to the.    ** V
6360: 44 42 45 20 62 79 20 74 68 69 73 20 6f 70 65 72  DBE by this oper
6370: 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61 6c 6c  ation.  The call
6380: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  er should have a
6390: 6c 72 65 61 64 79 20 69 6e 76 6f 6b 65 64 0a 20  lready invoked. 
63a0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70     ** sqlite3Exp
63b0: 72 44 75 70 28 29 20 6f 72 20 77 68 61 74 65 76  rDup() or whatev
63c0: 65 72 20 6f 74 68 65 72 20 72 6f 75 74 69 6e 65  er other routine
63d0: 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61   is needed to ma
63e0: 6b 65 20 61 20 0a 20 20 20 20 2a 2a 20 70 72 69  ke a .    ** pri
63f0: 76 61 74 65 20 63 6f 70 79 20 6f 66 20 74 68 65  vate copy of the
6400: 20 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 70 4f   tree. */.    pO
6410: 70 2d 3e 70 34 2e 70 45 78 70 72 20 3d 20 28 45  p->p4.pExpr = (E
6420: 78 70 72 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  xpr*)zP4;.    pO
6430: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 45  p->p4type = P4_E
6440: 58 50 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  XPR;.#endif.  }e
6450: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54  lse if( n==P4_VT
6460: 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  AB ){.    pOp->p
6470: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
6480: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6490: 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20  e = P4_VTAB;.   
64a0: 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b   sqlite3VtabLock
64b0: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b  ((VTable *)zP4);
64c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 56  .    assert( ((V
64d0: 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62  Table *)zP4)->db
64e0: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c  ==p->db );.  }el
64f0: 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  se if( n<0 ){.  
6500: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
6510: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
6520: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67  p->p4type = (sig
6530: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65  ned char)n;.  }e
6540: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  lse{.    if( n==
6550: 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  0 ) n = sqlite3S
6560: 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20  trlen30(zP4);.  
6570: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71    pOp->p4.z = sq
6580: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
6590: 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  ->db, zP4, n);. 
65a0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
65b0: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d   P4_DYNAMIC;.  }
65c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
65d0: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
65e0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
65f0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65  opcode to the Ke
6600: 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a  yInfo for the.**
6610: 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f   index given..*/
6620: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6630: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61  eSetP4KeyInfo(Pa
6640: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
6650: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62  ex *pIdx){.  Vdb
6660: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
6670: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
6680: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
6690: 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 73  ( pIdx!=0 );.  s
66a0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
66b0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
66c0: 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f  )sqlite3KeyInfoO
66d0: 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
66e0: 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Idx),.          
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
6700: 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64  EYINFO);.}..#ifd
6710: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6720: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
6730: 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  S./*.** Change t
6740: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
6750: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
6760: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
6770: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
6780: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
6790: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
67a0: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
67b0: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
67c0: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
67d0: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
67e0: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
67f0: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
6800: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
6810: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
6820: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
6830: 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  beVComment(Vdbe 
6840: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
6850: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
6860: 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   ap){.  assert( 
6870: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
6880: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
6890: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
68a0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
68b0: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
68c0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
68d0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
68e0: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nOp ){.    asser
68f0: 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  t( p->aOp );.   
6900: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6910: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ->db, p->aOp[p->
6920: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29  nOp-1].zComment)
6930: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
6940: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20  nOp-1].zComment 
6950: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
6960: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
6970: 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  , ap);.  }.}.voi
6980: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
6990: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
69a0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
69b0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
69c0: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
69d0: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
69e0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
69f0: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
6a00: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
6a10: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
6a20: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
6a30: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
6a40: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
6a50: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
6a60: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
6a70: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
6a80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6a90: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
6aa0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
6ab0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
6ac0: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
6ad0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
6ae0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
6af0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e  }.}.#endif  /* N
6b00: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
6b10: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
6b20: 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ERAGE./*.** Set 
6b30: 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65  the value if the
6b40: 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20   iSrcLine field 
6b50: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
6b60: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
6b70: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
6b80: 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65  lite3VdbeSetLine
6b90: 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20  Number(Vdbe *v, 
6ba0: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71  int iLine){.  sq
6bb0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
6bc0: 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  ,-1)->iSrcLine =
6bd0: 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66   iLine;.}.#endif
6be0: 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f   /* SQLITE_VDBE_
6bf0: 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a  COVERAGE */../*.
6c00: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
6c10: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
6c20: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
6c30: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
6c40: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
6c50: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
6c60: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
6c70: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
6c80: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
6c90: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
6ca0: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
6cb0: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
6cc0: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
6cd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
6ce0: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
6cf0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
6d00: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
6d10: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
6d20: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
6d30: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
6d40: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
6d50: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
6d60: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
6d70: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
6d80: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
6d90: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
6da0: 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  fter an OOM faul
6db0: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
6dc0: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
6dd0: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
6de0: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
6df0: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
6e00: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
6e10: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
6e20: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
6e30: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
6e40: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
6e50: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
6e60: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
6e70: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
6e80: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
6e90: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
6ea0: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
6eb0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
6ec0: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
6ed0: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
6ee0: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
6ef0: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
6f00: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
6f10: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
6f20: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
6f30: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
6f40: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
6f50: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
6f60: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
6f70: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
6f80: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
6f90: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
6fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
6fb0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
6fc0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
6fd0: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
6fe0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
6ff0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
7000: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
7010: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
7020: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7030: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
7040: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
7050: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
7060: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
7070: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
7080: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
7090: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
70a0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
70b0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
70c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
70d0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
70e0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
70f0: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
7100: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
7110: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
7120: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
7130: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
7140: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
7150: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
7160: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
7170: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
7180: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
7190: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
71a0: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
71b0: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
71c0: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
71d0: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
71e0: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
71f0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
7200: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
7210: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
7220: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
7230: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
7240: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
7250: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
7260: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
7270: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
7280: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
7290: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
72a0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
72b0: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
72c0: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
72d0: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
72e0: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
72f0: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
7300: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
7310: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
7320: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
7330: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
7340: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
7350: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
7360: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
7370: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
7380: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
7390: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
73a0: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
73b0: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
73c0: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
73d0: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
73e0: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
73f0: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
7400: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
7410: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
7420: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
7430: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
7440: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
7450: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
7460: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7470: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
7480: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
7490: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
74a0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
74b0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
74c0: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
74d0: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
74e0: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
74f0: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
7500: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
7510: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
7520: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
7530: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
7540: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
7550: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
7560: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
7570: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
7580: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
7590: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
75a0: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
75b0: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
75c0: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
75d0: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
75e0: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
75f0: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
7600: 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e + 1;.    for(i
7610: 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70  i=jj=0; jj<nTemp
7620: 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f  -1 && (c = zSyno
7630: 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69  psis[ii])!=0; ii
7640: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  ++){.      if( c
7650: 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20  =='P' ){.       
7660: 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b   c = zSynopsis[+
7670: 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii];.        if
7680: 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20  ( c=='4' ){.    
7690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
76a0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
76b0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
76c0: 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d   zP4);.        }
76d0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20  else if( c=='X' 
76e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
76f0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7700: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7710: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
7720: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  mment);.        
7730: 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20    seenCom = 1;. 
7740: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7750: 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d          int v1 =
7760: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70   translateP(c, p
7770: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Op);.          i
7780: 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20  nt v2;.         
7790: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
77a0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
77b0: 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b  p+jj, "%d", v1);
77c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
77d0: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
77e0: 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d  +ii+1, "@P", 2)=
77f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7800: 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20    ii += 3;.     
7810: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
7820: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
7830: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20  mp+jj);.        
7840: 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61      v2 = transla
7850: 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69  teP(zSynopsis[ii
7860: 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  ], pOp);.       
7870: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
7880: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
7890: 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "+1",2)==0 ){.  
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
78b0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
78c0: 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20     v2++;.       
78d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
78e0: 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20     if( v2>1 ){. 
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7900: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7910: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7920: 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d  , "..%d", v1+v2-
7930: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
7940: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
7950: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
7960: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e  ynopsis+ii+1, ".
7970: 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70  .P3", 4)==0 && p
7980: 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20  Op->p3==0 ){.   
7990: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34           ii += 4
79a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
79b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
79c0: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
79d0: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
79e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
79f0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b        zTemp[jj++
7a00: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = c;.      }. 
7a10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
7a20: 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d  enCom && jj<nTem
7a30: 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d  p-5 && pOp->zCom
7a40: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ment ){.      sq
7a50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7a60: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
7a70: 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e  j, "; %s", pOp->
7a80: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
7a90: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
7aa0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
7ab0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7ac0: 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70  jj<nTemp ) zTemp
7ad0: 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  [jj] = 0;.  }els
7ae0: 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e if( pOp->zComm
7af0: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
7b00: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7b10: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20  p, zTemp, "%s", 
7b20: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
7b30: 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33      jj = sqlite3
7b40: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
7b50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
7b60: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
7b70: 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  jj = 0;.  }.  re
7b80: 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69  turn jj;.}.#endi
7b90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
7ba0: 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44  G */..#if VDBE_D
7bb0: 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66  ISPLAY_P4 && def
7bc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
7bd0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29  LE_CURSOR_HINTS)
7be0: 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65  ./*.** Translate
7bf0: 20 74 68 65 20 50 34 2e 70 45 78 70 72 20 76 61   the P4.pExpr va
7c00: 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75  lue for an OP_Cu
7c10: 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 20  rsorHint opcode 
7c20: 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61  into text.** tha
7c30: 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61 79  t can be display
7c40: 65 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f 6c  ed in the P4 col
7c50: 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f  umn of EXPLAIN o
7c60: 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  utput..*/.static
7c70: 20 69 6e 74 20 64 69 73 70 6c 61 79 50 34 45 78   int displayP4Ex
7c80: 70 72 28 69 6e 74 20 6e 54 65 6d 70 2c 20 63 68  pr(int nTemp, ch
7c90: 61 72 20 2a 7a 54 65 6d 70 2c 20 45 78 70 72 20  ar *zTemp, Expr 
7ca0: 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74  *pExpr){.  const
7cb0: 20 63 68 61 72 20 2a 7a 42 69 6e 4f 70 20 3d 20   char *zBinOp = 
7cc0: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
7cd0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
7ce0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
7cf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d00: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7d10: 70 2c 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e  p, "%Q", pExpr->
7d20: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
7d30: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
7d40: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
7d50: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d60: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7d70: 70 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e  p, "%d", pExpr->
7d80: 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  u.iValue);.     
7d90: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
7da0: 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20  e TK_NULL:.     
7db0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7dc0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7dd0: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62  "NULL");.      b
7de0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
7df0: 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
7e00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7e10: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7e20: 6d 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45 78  mp, "r[%d]", pEx
7e30: 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr->iTable);.   
7e40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7e50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
7e60: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  UMN: {.      sql
7e70: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7e80: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 25 64  emp, zTemp, "c%d
7e90: 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69  ", (int)pExpr->i
7ea0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
7eb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
7ec0: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
7ed0: 20 20 7a 42 69 6e 4f 70 20 3d 20 22 3c 22 3b 20    zBinOp = "<"; 
7ee0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7ef0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
7f00: 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 3c 3d 22     zBinOp = "<="
7f10: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
7f20: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
7f30: 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 3e 22      zBinOp = ">"
7f40: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
7f50: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
7f60: 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 3e       zBinOp = ">
7f70: 3d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  =";       break;
7f80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
7f90: 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22        zBinOp = "
7fa0: 21 3d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  !=";       break
7fb0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
7fc0: 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  :      zBinOp = 
7fd0: 22 3d 3d 22 3b 20 20 20 20 20 20 20 62 72 65 61  "==";       brea
7fe0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
7ff0: 53 3a 20 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d  S:      zBinOp =
8000: 20 22 20 49 53 20 22 3b 20 20 20 20 20 62 72 65   " IS ";     bre
8010: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8020: 49 53 4e 4f 54 3a 20 20 20 7a 42 69 6e 4f 70 20  ISNOT:   zBinOp 
8030: 3d 20 22 20 49 53 20 4e 4f 54 20 22 3b 20 62 72  = " IS NOT "; br
8040: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8050: 5f 41 4e 44 3a 20 20 20 20 20 7a 42 69 6e 4f 70  _AND:     zBinOp
8060: 20 3d 20 22 20 41 4e 44 20 22 3b 20 20 20 20 62   = " AND ";    b
8070: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8080: 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_OR:      zBinO
8090: 70 20 3d 20 22 20 4f 52 20 22 3b 20 20 20 20 20  p = " OR ";     
80a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
80b0: 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e  TK_PLUS:    zBin
80c0: 4f 70 20 3d 20 22 2b 22 3b 20 20 20 20 20 20 20  Op = "+";       
80d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
80e0: 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 42 69   TK_STAR:    zBi
80f0: 6e 4f 70 20 3d 20 22 2a 22 3b 20 20 20 20 20 20  nOp = "*";      
8100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8110: 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 42  e TK_MINUS:   zB
8120: 69 6e 4f 70 20 3d 20 22 2d 22 3b 20 20 20 20 20  inOp = "-";     
8130: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8140: 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a  se TK_REM:     z
8150: 42 69 6e 4f 70 20 3d 20 22 25 22 3b 20 20 20 20  BinOp = "%";    
8160: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8170: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
8180: 7a 42 69 6e 4f 70 20 3d 20 22 26 22 3b 20 20 20  zBinOp = "&";   
8190: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
81a0: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20  case TK_BITOR:  
81b0: 20 7a 42 69 6e 4f 70 20 3d 20 22 7c 22 3b 20 20   zBinOp = "|";  
81c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
81d0: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
81e0: 20 20 7a 42 69 6e 4f 70 20 3d 20 22 2f 22 3b 20    zBinOp = "/"; 
81f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8200: 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
8210: 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 3c 3c 22  :  zBinOp = "<<"
8220: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8230: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
8240: 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 3e 3e  T:  zBinOp = ">>
8250: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
8260: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
8270: 41 54 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 7c  AT:  zBinOp = "|
8280: 7c 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  |";       break;
8290: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
82a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
82b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
82c0: 6d 70 2c 20 22 25 73 22 2c 20 22 65 78 70 72 22  mp, "%s", "expr"
82d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
82e0: 20 20 7d 0a 0a 20 20 69 66 28 20 7a 42 69 6e 4f    }..  if( zBinO
82f0: 70 20 26 26 20 6e 54 65 6d 70 3e 35 20 29 7b 0a  p && nTemp>5 ){.
8300: 20 20 20 20 69 6e 74 20 6e 20 3d 20 31 3b 0a 20      int n = 1;. 
8310: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 28     zTemp[0] = '(
8320: 27 3b 0a 20 20 20 20 6e 20 2b 3d 20 64 69 73 70  ';.    n += disp
8330: 6c 61 79 50 34 45 78 70 72 28 6e 54 65 6d 70 2d  layP4Expr(nTemp-
8340: 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 70 45 78 70  n, zTemp+n, pExp
8350: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73  r->pLeft);.    s
8360: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8370: 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e  nTemp-n, zTemp+n
8380: 2c 20 22 25 73 22 2c 20 7a 42 69 6e 4f 70 29 3b  , "%s", zBinOp);
8390: 0a 20 20 20 20 6e 20 2b 3d 20 73 71 6c 69 74 65  .    n += sqlite
83a0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
83b0: 6e 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 64 69 73  n);.    n += dis
83c0: 70 6c 61 79 50 34 45 78 70 72 28 6e 54 65 6d 70  playP4Expr(nTemp
83d0: 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 70 45 78  -n, zTemp+n, pEx
83e0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
83f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8400: 66 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70  f(nTemp-n, zTemp
8410: 2b 6e 2c 20 22 29 22 29 3b 0a 20 20 7d 0a 0a 20  +n, ")");.  }.. 
8420: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
8430: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a  trlen30(zTemp);.
8440: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45  }.#endif /* VDBE
8450: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
8460: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
8470: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
8480: 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45  S) */...#if VDBE
8490: 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a  _DISPLAY_P4./*.*
84a0: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
84b0: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
84c0: 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74  s the P4 paramet
84d0: 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65  er for an opcode
84e0: 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66  ..** Use zTemp f
84f0: 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  or any required 
8500: 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
8510: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
8520: 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50  c char *displayP
8530: 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20  4(Op *pOp, char 
8540: 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d  *zTemp, int nTem
8550: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20  p){.  char *zP4 
8560: 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72  = zTemp;.  asser
8570: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
8580: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
8590: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
85a0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
85b0: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
85c0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
85d0: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
85e0: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
85f0: 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
8600: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
8610: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
8620: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8630: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64 22  p, zTemp, "k(%d"
8640: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
8650: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
8660: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8670: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
8680: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
8690: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
86a0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
86b0: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
86c0: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
86d0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
86e0: 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f  *zColl = pColl ?
86f0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
8700: 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 69  "nil";.        i
8710: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
8720: 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20  rlen30(zColl);. 
8730: 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 36 20         if( n==6 
8740: 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c  && memcmp(zColl,
8750: 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20 29  "BINARY",6)==0 )
8760: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c  {.          zCol
8770: 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20  l = "B";.       
8780: 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20     n = 1;.      
8790: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
87a0: 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+n>nTemp-6 ){. 
87b0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
87c0: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22  &zTemp[i],",..."
87d0: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ,4);.          b
87e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
87f0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
8800: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
8810: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
8820: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b  aSortOrder[j] ){
8830: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
8840: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
8850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
8860: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
8870: 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20   zColl, n+1);.  
8880: 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20        i += n;.  
8890: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
88a0: 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  p[i++] = ')';.  
88b0: 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30      zTemp[i] = 0
88c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
88d0: 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20  i<nTemp );.     
88e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
88f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8900: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
8910: 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52      case P4_EXPR
8920: 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61  : {.      displa
8930: 79 50 34 45 78 70 72 28 6e 54 65 6d 70 2c 20 7a  yP4Expr(nTemp, z
8940: 54 65 6d 70 2c 20 70 4f 70 2d 3e 70 34 2e 70 45  Temp, pOp->p4.pE
8950: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
8960: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
8970: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
8980: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
8990: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
89a0: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
89b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
89c0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
89d0: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
89e0: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
89f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8a00: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
8a10: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
8a20: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
8a30: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
8a40: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8a50: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8a60: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
8a70: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
8a80: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
8a90: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
8aa0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 63  LITE_DEBUG.    c
8ab0: 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20  ase P4_FUNCCTX: 
8ac0: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
8ad0: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
8ae0: 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pCtx->pFunc;.   
8af0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8b00: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8b10: 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66  , "%s(%d)", pDef
8b20: 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e  ->zName, pDef->n
8b30: 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Arg);.      brea
8b40: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
8b50: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
8b60: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
8b70: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8b80: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
8b90: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
8ba0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8bb0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
8bc0: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
8bd0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8be0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8bf0: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
8c00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8c10: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
8c20: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
8c30: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8c40: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
8c50: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
8c60: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
8c70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8c80: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
8c90: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
8ca0: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
8cb0: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
8cc0: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
8cd0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
8ce0: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
8cf0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
8d00: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
8d10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8d20: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8d30: 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70  zTemp, "%lld", p
8d40: 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20  Mem->u.i);.     
8d50: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
8d60: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
8d70: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
8d80: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8d90: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
8da0: 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b  6g", pMem->u.r);
8db0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8dc0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
8dd0: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
8de0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8df0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8e00: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
8e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8e20: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
8e30: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
8e40: 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  ;.        zP4 = 
8e50: 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20  "(blob)";.      
8e60: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8e70: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
8e80: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
8e90: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
8ea0: 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  4_VTAB: {.      
8eb0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
8ec0: 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
8ed0: 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  tab->pVtab;.    
8ee0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8ef0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8f00: 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61   "vtab:%p", pVta
8f10: 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  b);.      break;
8f20: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
8f30: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
8f40: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
8f50: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8f60: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61  mp, zTemp, "inta
8f70: 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72  rray");.      br
8f80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8f90: 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  ase P4_SUBPROGRA
8fa0: 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M: {.      sqlit
8fb0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8fc0: 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72  p, zTemp, "progr
8fd0: 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  am");.      brea
8fe0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8ff0: 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a  e P4_ADVANCE: {.
9000: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
9010: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
9020: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
9030: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
9040: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
9050: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
9060: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
9070: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
9080: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
9090: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
90a0: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
90b0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
90c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45  }.#endif /* VDBE
90d0: 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a  _DISPLAY_P4 */..
90e0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
90f0: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
9100: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
9110: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
9120: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
9130: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
9140: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
9150: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
9160: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
9170: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
9180: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
9190: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
91a0: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
91b0: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
91c0: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
91d0: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
91e0: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
91f0: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
9200: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
9210: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
9220: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
9230: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
9240: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
9250: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
9260: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
9270: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
9280: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
9290: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
92a0: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
92b0: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
92c0: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62  eMask)*8 );.  Db
92d0: 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65  MaskSet(p->btree
92e0: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20  Mask, i);.  if( 
92f0: 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42  i!=1 && sqlite3B
9300: 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e  treeSharable(p->
9310: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
9320: 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
9330: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29  (p->lockMask, i)
9340: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
9350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9360: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
9370: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
9380: 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20  SAFE>0./*.** If 
9390: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
93a0: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68  ed to support sh
93b0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
93c0: 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  and to be thread
93d0: 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  safe,.** this ro
93e0: 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68  utine obtains th
93f0: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
9400: 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53  ed with each BtS
9410: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a  hared structure.
9420: 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61  ** that may be a
9430: 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56  ccessed by the V
9440: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
9450: 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e  rgument. In doin
9460: 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20  g so it also.** 
9470: 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65  sets the BtShare
9480: 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65  d.db member of e
9490: 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61  ach of the BtSha
94a0: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20  red structures, 
94b0: 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74  ensuring.** that
94c0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73   the correct bus
94d0: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
94e0: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66  ck is invoked if
94f0: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
9500: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
9510: 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74  t threadsafe but
9520: 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68   does support sh
9530: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
9540: 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33   then.** sqlite3
9550: 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20  BtreeEnter() is 
9560: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
9570: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
9580: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
9590: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
95a0: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
95b0: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
95c0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
95d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
95e0: 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49   the VM..**.** I
95f0: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
9600: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
9610: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
9620: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
9630: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
9640: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
9650: 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72  **.** The p->btr
9660: 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20  eeMask field is 
9670: 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c  a bitmask of all
9680: 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65   btrees that the
9690: 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74   prepared .** st
96a0: 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65  atement p will e
96b0: 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20  ver use.  Let N 
96c0: 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
96d0: 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65   bits in p->btre
96e0: 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  eMask.** corresp
96f0: 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73  onding to btrees
9700: 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
9710: 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68   cache.  Then th
9720: 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20  e runtime of.** 
9730: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9740: 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69  N*N.  But as N i
9750: 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68  s rarely more th
9760: 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c  an 1, this shoul
9770: 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72  d not.** be a pr
9780: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
9790: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
97a0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
97b0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
97c0: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
97d0: 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62  nt nDb;.  if( Db
97e0: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
97f0: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
9800: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
9810: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
9820: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
9830: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
9840: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
9850: 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29  i=0; i<nDb; i++)
9860: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
9870: 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  & DbMaskTest(p->
9880: 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41  lockMask,i) && A
9890: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
98a0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
98b0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
98c0: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
98d0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
98e0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
98f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9900: 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54  _CACHE) && SQLIT
9910: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f  E_THREADSAFE>0./
9920: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20  *.** Unlock all 
9930: 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72  of the btrees pr
9940: 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20  eviously locked 
9950: 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  by a call to sql
9960: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e  ite3VdbeEnter().
9970: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
9980: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
9990: 76 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  vdbeLeave(Vdbe *
99a0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
99b0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
99c0: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
99d0: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
99e0: 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b    aDb = db->aDb;
99f0: 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62  .  nDb = db->nDb
9a00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
9a10: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
9a20: 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b  ( i!=1 && DbMask
9a30: 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Test(p->lockMask
9a40: 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44  ,i) && ALWAYS(aD
9a50: 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a  b[i].pBt!=0) ){.
9a60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
9a70: 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70  eeLeave(aDb[i].p
9a80: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
9a90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9aa0: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b  eLeave(Vdbe *p){
9ab0: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
9ac0: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
9ad0: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
9ae0: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
9af0: 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70  */.  vdbeLeave(p
9b00: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
9b10: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
9b20: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
9b30: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
9b40: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69  /*.** Print a si
9b50: 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68  ngle opcode.  Th
9b60: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
9b70: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
9b80: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
9b90: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
9ba0: 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e  p(FILE *pOut, in
9bb0: 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a  t pc, Op *pOp){.
9bc0: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
9bd0: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
9be0: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
9bf0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
9c00: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
9c10: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
9c20: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
9c30: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
9c40: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
9c50: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
9c60: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
9c70: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
9c80: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
9c90: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
9ca0: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
9cb0: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
9cc0: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
9cd0: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
9ce0: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
9cf0: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
9d00: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
9d10: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
9d20: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
9d30: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
9d40: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
9d50: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
9d60: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
9d70: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
9d80: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
9d90: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
9da0: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
9db0: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
9dc0: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
9dd0: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
9de0: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
9df0: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
9e00: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
9e10: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
9e20: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
9e30: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
9e40: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
9e50: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
9e60: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
9e70: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
9e80: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
9e90: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
9ea0: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
9eb0: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   N ){.    Mem *p
9ec0: 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20  End = &p[N];.   
9ed0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9ee0: 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c  ->db;.    u8 mal
9ef0: 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d  loc_failed = db-
9f00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
9f10: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
9f20: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
9f30: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
9f40: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
9f50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9f60: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
9f70: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
9f80: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  )<pEnd );.      
9f90: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
9fa0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65    do{.      asse
9fb0: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
9fc0: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
9fd0: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
9fe0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
9ff0: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
a000: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
a010: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
a020: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
a030: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
a040: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
a050: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
a060: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
a070: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
a080: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
a090: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
a0a0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
a0b0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
a0c0: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
a0d0: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
a0e0: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
a0f0: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
a100: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
a110: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
a120: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
a130: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
a140: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
a150: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
a160: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
a170: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
a180: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
a190: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
a1a0: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
a1b0: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
a1c0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
a1d0: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
a1e0: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
a1f0: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
a200: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
a210: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
a220: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
a230: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
a240: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
a250: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
a260: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
a270: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
a280: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
a290: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
a2a0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
a2b0: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
a2c0: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
a2d0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
a2e0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
a2f0: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
a300: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
a310: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
a320: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
a330: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a340: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46  p->flags & MEM_F
a350: 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65  rame );.      te
a360: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
a370: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b   & MEM_RowSet );
a380: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
a390: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
a3a0: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
a3b0: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
a3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a3d0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
a3e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a3f0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20  p->szMalloc ){. 
a400: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
a410: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
a420: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  loc);.        p-
a430: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  >szMalloc = 0;. 
a440: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
a450: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  >flags = MEM_Und
a460: 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69  efined;.    }whi
a470: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
a480: 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ;.    db->malloc
a490: 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f  Failed = malloc_
a4a0: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f  failed;.  }.}../
a4b0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64  *.** Delete a Vd
a4c0: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61  beFrame object a
a4d0: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
a4e0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
a4f0: 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ts are.** alloca
a500: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72  ted by the OP_Pr
a510: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
a520: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
a530: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
a540: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
a550: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b  e(VdbeFrame *p){
a560: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
a570: 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d  *aMem = VdbeFram
a580: 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43  eMem(p);.  VdbeC
a590: 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20  ursor **apCsr = 
a5a0: 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
a5b0: 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65  aMem[p->nChildMe
a5c0: 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m];.  for(i=0; i
a5d0: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
a5e0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
a5f0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
a600: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
a610: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
a620: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
a630: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
a640: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
a650: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
a660: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a670: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
a680: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
a690: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
a6a0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
a6b0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
a6c0: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
a6d0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
a6e0: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
a6f0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
a700: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
a710: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
a720: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
a730: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
a740: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
a750: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
a760: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
a770: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
a780: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
a790: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
a7a0: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
a7b0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
a7c0: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
a7d0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
a7e0: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
a7f0: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
a800: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
a810: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
a820: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
a830: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
a840: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
a850: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
a860: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
a870: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
a880: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
a890: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
a8a0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
a8b0: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
a8c0: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
a8d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
a8e0: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a900: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
a910: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
a940: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
a950: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
a960: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a990: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
a9a0: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
a9b0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
a9c0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
a9d0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
a9e0: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
a9f0: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
aa20: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
aa30: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
aa40: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
aa50: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
aa60: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
aa70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
aa80: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
aab0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
aac0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
aad0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aae0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
aaf0: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
ab00: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ab20: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75  irst Mem of resu
ab30: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73  lt set */..  ass
ab40: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
ab50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
ab60: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
ab70: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72  C_RUN );.  asser
ab80: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
ab90: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
aba0: 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e  LITE_BUSY || p->
abb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
abc0: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
abd0: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
abe0: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
abf0: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
ac00: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
ac10: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
ac20: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
ac30: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
ac40: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
ac50: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
ac60: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
ac70: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
ac80: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
ac90: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
aca0: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b  mArray(pMem, 8);
acb0: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
acc0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
acd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
ace0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
acf0: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
ad00: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
ad10: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
ad20: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
ad30: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
ad40: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
ad50: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
ad60: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ad70: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
ad80: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
ad90: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  }..  /* When the
ada0: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
adb0: 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e  t rows reaches n
adc0: 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  Row, that means 
add0: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67  the.  ** listing
ade0: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e   has finished an
adf0: 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  d sqlite3_step()
ae00: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
ae10: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a  QLITE_DONE..  **
ae20: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d   nRow is the sum
ae30: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
ae40: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  f rows in the ma
ae50: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73  in program, plus
ae60: 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66  .  ** the sum of
ae70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
ae80: 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67  ows in all trigg
ae90: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65  er subprograms e
aea0: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
aeb0: 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f  so far.  The nRo
aec0: 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63  w value will inc
aed0: 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69  rease as new tri
aee0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
aef0: 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e   are.  ** encoun
af00: 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63  tered, but p->pc
af10: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
af20: 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f   catch up to nRo
af30: 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  w..  */.  nRow =
af40: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70   p->nOp;.  if( p
af50: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
af60: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
af70: 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20   8 memory cells 
af80: 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  are used for the
af90: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f   result set.  So
afa0: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   we will.    ** 
afb0: 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39  commandeer the 9
afc0: 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61  th cell to use a
afd0: 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e  s storage for an
afe0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
aff0: 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69  rs.    ** to tri
b000: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
b010: 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67  .  The VDBE is g
b020: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
b030: 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20  e at least 9.   
b040: 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20   ** cells.  */. 
b050: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d     assert( p->nM
b060: 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62  em>9 );.    pSub
b070: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a   = &p->aMem[9];.
b080: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c      if( pSub->fl
b090: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
b0a0: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20        /* On the 
b0b0: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
b0c0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53  lite3_step(), pS
b0d0: 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e  ub will hold a N
b0e0: 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ULL.  It is.    
b0f0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
b100: 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68   to a BLOB by th
b110: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  e P4_SUBPROGRAM 
b120: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
b130: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
b140: 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73  nSub = pSub->n/s
b150: 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20  izeof(Vdbe*);.  
b160: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
b170: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
b180: 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  >z;.    }.    fo
b190: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69  r(i=0; i<nSub; i
b1a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ++){.      nRow 
b1b0: 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70  += apSub[i]->nOp
b1c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
b1d0: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
b1e0: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
b1f0: 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61  nRow && p->expla
b200: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
b210: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
b220: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
b230: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d  >=nRow ){.    p-
b240: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
b250: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
b260: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
b270: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
b280: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
b290: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
b2a0: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
b2b0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
b2c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
b2d0: 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45  rror(p, sqlite3E
b2e0: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
b2f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
b300: 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70   *zP4;.    Op *p
b310: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
b320: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
b330: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
b340: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
b350: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
b360: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
b370: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
b380: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
b390: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
b3a0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
b3b0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
b3c0: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
b3d0: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
b3e0: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
b3f0: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
b400: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
b410: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
b420: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
b430: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
b440: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
b450: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
b460: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
b470: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
b480: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
b490: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
b4a0: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
b4b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
b4c0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
b4d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
b4e0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
b4f0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b520: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
b530: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
b540: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
b550: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
b560: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
b570: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
b580: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
b590: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
b5a0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f  p->opcode); /* O
b5b0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61  pcode */.      a
b5c0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
b5d0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
b5e0: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
b5f0: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
b600: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
b610: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
b620: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
b630: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
b640: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
b650: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
b660: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
b670: 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20  at has.      ** 
b680: 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  a P4_SUBPROGRAM 
b690: 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e  argument), expan
b6a0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
b6b0: 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  e array of subpr
b6c0: 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20  ograms.      ** 
b6d0: 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b  kept in p->aMem[
b6e0: 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65  9].z to hold the
b6f0: 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61   new program - a
b700: 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62  ssuming this sub
b710: 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a  program.      **
b720: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
b730: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
b740: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
b750: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
b760: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
b770: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
b780: 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66   (nSub+1)*sizeof
b790: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
b7a0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
b7b0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
b7c0: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
b7d0: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
b7e0: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
b7f0: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
b800: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b810: 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20   if( j==nSub && 
b820: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74  SQLITE_OK==sqlit
b830: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
b840: 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21  ub, nByte, nSub!
b850: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
b860: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
b870: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
b880: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
b890: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
b8a0: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
b8b0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
b8c0: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
b8d0: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
b8e0: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
b8f0: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
b900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b910: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
b920: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
b930: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
b940: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
b970: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
b980: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
b990: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
b9a0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
b9d0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
b9e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
b9f0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
ba00: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
ba30: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
ba40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
ba50: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
ba60: 73 69 7a 65 28 70 4d 65 6d 2c 20 33 32 29 20 29  size(pMem, 32) )
ba70: 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20  { /* P4 */.     
ba80: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
ba90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
baa0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
bab0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
bac0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
bad0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
bae0: 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64  erm;.    zP4 = d
baf0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
bb00: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
bb10: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
bb20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
bb30: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
bb40: 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51  Mem, zP4, -1, SQ
bb50: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
bb60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bb70: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
bb80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
bb90: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
bba0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
bbb0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
bbc0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
bbd0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b     }.    pMem++;
bbe0: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
bbf0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
bc00: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
bc10: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
bc20: 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20  e(pMem, 4) ){.  
bc30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
bc40: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
bc50: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
bc60: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
bc70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bc80: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
bc90: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
bca0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
bcb0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
bcc0: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65  _snprintf(3, pMe
bcd0: 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f  m->z, "%.2x", pO
bce0: 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20  p->p5);   /* P5 
bcf0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  */.      pMem->e
bd00: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
bd10: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
bd20: 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
bd30: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
bd40: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69  COMMENTS.      i
bd50: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
bd60: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
bd70: 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20  pMem, 500) ){.  
bd80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
bd90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
bda0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
bdb0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
bdc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bdd0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
bde0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
bdf0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
be00: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70  displayComment(p
be10: 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a  Op, zP4, pMem->z
be20: 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d  , 500);.      pM
be30: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
be40: 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20  _UTF8;.#else.   
be50: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
be60: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23   /* Comment */.#
be90: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
bea0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
beb0: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61   8 - 4*(p->expla
bec0: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52  in-1);.    p->pR
bed0: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
bee0: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72  Mem[1];.    p->r
bef0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
bf00: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
bf10: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
bf20: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
bf30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
bf40: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
bf50: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
bf60: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
bf70: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
bf80: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
bf90: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
bfa0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
bfb0: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
bfc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
bfd0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a   = 0;.  if( p->z
bfe0: 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  Sql ){.    z = p
bff0: 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20  ->zSql;.  }else 
c000: 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b  if( p->nOp>=1 ){
c010: 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f  .    const VdbeO
c020: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
c030: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  [0];.    if( pOp
c040: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
c050: 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  t && pOp->p4.z!=
c060: 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70  0 ){.      z = p
c070: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
c080: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
c090: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
c0a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c0b0: 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c   z ) printf("SQL
c0c0: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d  : [%s]\n", z);.}
c0d0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
c0e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c0f0: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
c100: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
c110: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
c120: 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43   Print an IOTRAC
c130: 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e  E message showin
c140: 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a  g SQL content..*
c150: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c160: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62  beIOTraceSql(Vdb
c170: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
c180: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
c190: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
c1a0: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d  sqlite3IoTrace==
c1b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
c1c0: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
c1d0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
c1e0: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
c1f0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
c200: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
c210: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
c220: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
c230: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
c240: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
c250: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
c260: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
c270: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
c280: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
c290: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
c2a0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
c2b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
c2c0: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
c2d0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
c2e0: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
c2f0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
c300: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c320: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
c330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c340: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
c350: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
c360: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
c370: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
c380: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
c390: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
c3a0: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
c3b0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
c3c0: 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20  ce from a fixed 
c3d0: 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20  size buffer and 
c3e0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
c3f0: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63   to.** that spac
c400: 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  e.  If insuffici
c410: 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61  ent space is ava
c420: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e  ilable, return N
c430: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ULL..**.** The p
c440: 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73  Buf parameter is
c450: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
c460: 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ue of a pointer 
c470: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65  which will.** re
c480: 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65  ceive the new me
c490: 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e  mory.  pBuf is n
c4a0: 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49  ormally NULL.  I
c4b0: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  f pBuf is not.**
c4c0: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
c4d0: 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63  that memory spac
c4e0: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
c4f0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
c500: 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f   that.** this ro
c510: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
c520: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65   allocate any ne
c530: 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  w memory.  When 
c540: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
c550: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ULL simply retur
c560: 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c  n pBuf.  Only al
c570: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
c580: 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75  y space when pBu
c590: 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  f.** is NULL..**
c5a0: 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65  .** nByte is the
c5b0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c5c0: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
c5d0: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20  ..**.** *ppFrom 
c5e0: 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61  points to availa
c5f0: 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45  ble space and pE
c600: 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  nd points to the
c610: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61   end of the.** a
c620: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20  vailable space. 
c630: 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61   When space is a
c640: 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f  llocated, *ppFro
c650: 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61  m is advanced pa
c660: 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  st.** the end of
c670: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   the allocated s
c680: 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42  pace..**.** *pnB
c690: 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72  yte is a counter
c6a0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
c6b0: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
c6c0: 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65   that have faile
c6d0: 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  d.** to allocate
c6e0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69  .  If there is i
c6f0: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
c700: 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20  e in *ppFrom to 
c710: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72  satisfy the.** r
c720: 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63  equest, then inc
c730: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62  rement *pnByte b
c740: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  y the amount of 
c750: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a  the request..*/.
c760: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c  static void *all
c770: 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20  ocSpace(.  void 
c780: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
c790: 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20  /* Where return 
c7a0: 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  pointer will be 
c7b0: 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  stored */.  int 
c7c0: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
c7d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
c7e0: 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
c7f0: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d  */.  u8 **ppFrom
c800: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ,         /* IN/
c810: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72  OUT: Allocate fr
c820: 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20  om *ppFrom */.  
c830: 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  u8 *pEnd,       
c840: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
c850: 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74  to 1 byte past t
c860: 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f  he end of *ppFro
c870: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
c880: 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20  t *pnByte       
c890: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
c8a0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
c8b0: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
c8c0: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
c8d0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
c8e0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72  _ALIGNMENT(*ppFr
c8f0: 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75  om) );.  if( pBu
c900: 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b  f ) return pBuf;
c910: 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
c920: 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  8(nByte);.  if( 
c930: 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65  &(*ppFrom)[nByte
c940: 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20  ] <= pEnd ){.   
c950: 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a   pBuf = (void*)*
c960: 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46  ppFrom;.    *ppF
c970: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
c980: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79  }else{.    *pnBy
c990: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  te += nByte;.  }
c9a0: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
c9b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20  }../*.** Rewind 
c9c0: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f  the VDBE back to
c9d0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69   the beginning i
c9e0: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f  n preparation fo
c9f0: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e  r.** running it.
ca00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ca10: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20  VdbeRewind(Vdbe 
ca20: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
ca30: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
ca40: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
ca50: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
ca60: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
ca70: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
ca80: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
ca90: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
caa0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
cab0: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
cac0: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
cad0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
cae0: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
caf0: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
cb00: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
cb10: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
cb20: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
cb30: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
cb40: 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53  C_RUN;..#ifdef S
cb50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
cb60: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d  r(i=1; i<p->nMem
cb70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
cb80: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64  rt( p->aMem[i].d
cb90: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a  b==p->db );.  }.
cba0: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d  #endif.  p->pc =
cbb0: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53   -1;.  p->rc = S
cbc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65  QLITE_OK;.  p->e
cbd0: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
cbe0: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69  Abort;.  p->magi
cbf0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
cc00: 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  UN;.  p->nChange
cc10: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
cc20: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
cc30: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
cc40: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74   = 255;.  p->iSt
cc50: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70  atement = 0;.  p
cc60: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
cc70: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
cc80: 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69  _PROFILE.  for(i
cc90: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
cca0: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69  +){.    p->aOp[i
ccb0: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ].cnt = 0;.    p
ccc0: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
ccd0: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
cce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
ccf0: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
cd00: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
cd10: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
cd20: 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65  ime after.** cre
cd30: 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  ating the virtua
cd40: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73  l machine.  This
cd50: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
cd60: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
cd70: 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73  cating registers
cd80: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
cd90: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
cda0: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
cdb0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
cdc0: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
cdd0: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
cde0: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
cdf0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
ce00: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
ce10: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ce20: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
ce30: 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61  actly once on ea
ce40: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
ce50: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
ce60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
ce70: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
ce80: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
ce90: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
cea0: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
ceb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
cec0: 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61  lled, further ca
ced0: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
cee0: 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75  e3VdbeAddOp() fu
cef0: 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68  nctions are proh
cf00: 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f  ibited.  This ro
cf10: 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74  utine disconnect
cf20: 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72  s.** the Vdbe fr
cf30: 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  om the Parse obj
cf40: 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20  ect that helped 
cf50: 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74  generate it so t
cf60: 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56  hat the.** the V
cf70: 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69  dbe becomes an i
cf80: 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74  ndependent entit
cf90: 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20  y and the Parse 
cfa0: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a  object can be.**
cfb0: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
cfc0: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
cfd0: 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72  3VdbeRewind() pr
cfe0: 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f  ocedure to resto
cff0: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
d000: 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  hine back.** to 
d010: 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74  its initial stat
d020: 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62  e after it has b
d030: 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64  een run..*/.void
d040: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d050: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
d060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d070: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
d080: 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  DBE */.  Parse *
d090: 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20  pParse          
d0a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
d0b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
d0c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
d0f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
d100: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d120: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
d130: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e  rameters */.  in
d140: 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d160: 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d  Number of VM mem
d170: 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f  ory registers */
d180: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20  .  int nCursor; 
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
d1b0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
d1c0: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d1f0: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75   arguments in su
d200: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
d210: 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20  nt nOnce;       
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d230: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e   Number of OP_On
d240: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ce instructions 
d250: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
d280: 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73  ter */.  u8 *zCs
d290: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d2a0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
d2b0: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
d2c0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
d2d0: 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20  u8 *zEnd;       
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d2f0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
d300: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  t allocated memo
d310: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ry */.  int nByt
d320: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
d330: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75         /* How mu
d340: 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  ch extra memory 
d350: 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20  is needed */..  
d360: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
d370: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
d380: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
d390: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
d3a0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
d3b0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
d3c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
d3d0: 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20  arse==p->pParse 
d3e0: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
d3f0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
d400: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
d410: 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73  ;.  nVar = pPars
d420: 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20  e->nVar;.  nMem 
d430: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
d440: 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72    nCursor = pPar
d450: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67  se->nTab;.  nArg
d460: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41   = pParse->nMaxA
d470: 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50  rg;.  nOnce = pP
d480: 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69  arse->nOnce;.  i
d490: 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f  f( nOnce==0 ) nO
d4a0: 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75  nce = 1; /* Ensu
d4b0: 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  re at least one 
d4c0: 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65  byte in p->aOnce
d4d0: 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f  Flag[] */.  .  /
d4e0: 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f  * For each curso
d4f0: 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f  r required, also
d500: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f   allocate a memo
d510: 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a  ry cell. Memory.
d520: 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d    ** cells (nMem
d530: 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65  +1-nCursor)..nMe
d540: 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69  m, inclusive, wi
d550: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
d560: 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62   by.  ** the vdb
d570: 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65  e program. Inste
d580: 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64  ad they are used
d590: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
d5a0: 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65  ce for.  ** Vdbe
d5b0: 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20  Cursor/BtCursor 
d5c0: 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20  structures. The 
d5d0: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
d5e0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
d5f0: 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73    ** cursor 0 is
d600: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
d610: 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d  y cell nMem. Mem
d620: 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31  ory cell (nMem-1
d630: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
d640: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
d650: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
d660: 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a   cursor 1, etc..
d670: 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
d680: 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
d690: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
d6a0: 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20  m += nCursor;.. 
d6b0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
d6c0: 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65  ce for memory re
d6d0: 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72  gisters, SQL var
d6e0: 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72  iables, VDBE cur
d6f0: 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61  sors and .  ** a
d700: 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68  n array to marsh
d710: 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  al SQL function 
d720: 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20  arguments in..  
d730: 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a  */.  zCsr = (u8*
d740: 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d  )&p->aOp[p->nOp]
d750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d760: 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65  Memory avaliable
d770: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
d780: 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a  */.  zEnd = (u8*
d790: 29 26 70 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d  )&p->aOp[pParse-
d7a0: 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20  >nOpAlloc];  /* 
d7b0: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
d7c0: 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f  end of zCsr[] */
d7d0: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
d7e0: 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
d7f0: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
d800: 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73  nal = (u8)(pPars
d810: 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  e->isMultiWrite 
d820: 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  && pParse->mayAb
d830: 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ort);.  if( pPar
d840: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e  se->explain && n
d850: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d  Mem<10 ){.    nM
d860: 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d  em = 10;.  }.  m
d870: 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a  emset(zCsr, 0, z
d880: 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73  End-zCsr);.  zCs
d890: 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38  r += (zCsr - (u8
d8a0: 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74  *)0)&7;.  assert
d8b0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
d8c0: 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a  GNMENT(zCsr) );.
d8d0: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
d8e0: 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66  ;..  /* Memory f
d8f0: 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
d900: 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
d910: 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
d920: 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20  ted in two.  ** 
d930: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
d940: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
d950: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
d960: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ed space at the 
d970: 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
d980: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
d990: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
d9a0: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
d9b0: 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75  memory.  ** requ
d9c0: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
d9d0: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
d9e0: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
d9f0: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
da00: 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69  pass will fill i
da10: 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67  n the rest using
da20: 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74   a fresh allocat
da30: 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ion.  .  **.  **
da40: 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61   This two-pass a
da50: 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75  pproach that reu
da60: 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ses as much memo
da70: 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
da80: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66  rom.  ** the lef
da90: 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74  tover space at t
daa0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  he end of the op
dab0: 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73  code array can s
dac0: 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
dad0: 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
dae0: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
daf0: 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
db00: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
db10: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74  .  do {.    nByt
db20: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  e = 0;.    p->aM
db30: 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
db40: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69  p->aMem, nMem*si
db50: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
db60: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
db70: 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61  .    p->aVar = a
db80: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61  llocSpace(p->aVa
db90: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d  r, nVar*sizeof(M
dba0: 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  em), &zCsr, zEnd
dbb0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
dbc0: 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
dbd0: 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e  pace(p->apArg, n
dbe0: 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29  Arg*sizeof(Mem*)
dbf0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
dc00: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
dc10: 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  zVar = allocSpac
dc20: 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72  e(p->azVar, nVar
dc30: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20  *sizeof(char*), 
dc40: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
dc50: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  yte);.    p->apC
dc60: 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
dc70: 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f  p->apCsr, nCurso
dc80: 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
dc90: 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20  sor*),.         
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
dcc0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  Byte);.    p->aO
dcd0: 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53  nceFlag = allocS
dce0: 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61  pace(p->aOnceFla
dcf0: 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c  g, nOnce, &zCsr,
dd00: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
dd10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
dd20: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
dd30: 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78  ATUS.    p->anEx
dd40: 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ec = allocSpace(
dd50: 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f  p->anExec, p->nO
dd60: 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 2c 20 26  p*sizeof(i64), &
dd70: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
dd80: 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  te);.#endif.    
dd90: 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
dda0: 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71     p->pFree = sq
ddb0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
ddc0: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
ddd0: 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70    }.    zCsr = p
dde0: 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e  ->pFree;.    zEn
ddf0: 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d  d = &zCsr[nByte]
de00: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74  ;.  }while( nByt
de10: 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  e && !db->malloc
de20: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e  Failed );..  p->
de30: 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f  nCursor = nCurso
de40: 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61  r;.  p->nOnceFla
de50: 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28  g = nOnce;.  if(
de60: 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20   p->aVar ){.    
de70: 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72  p->nVar = (ynVar
de80: 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e  )nVar;.    for(n
de90: 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29  =0; n<nVar; n++)
dea0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b  {.      p->aVar[
deb0: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
dec0: 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56  ull;.      p->aV
ded0: 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  ar[n].db = db;. 
dee0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
def0: 2d 3e 61 7a 56 61 72 20 26 26 20 70 50 61 72 73  ->azVar && pPars
df00: 65 2d 3e 6e 7a 56 61 72 3e 30 20 29 7b 0a 20 20  e->nzVar>0 ){.  
df10: 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61    p->nzVar = pPa
df20: 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20  rse->nzVar;.    
df30: 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c  memcpy(p->azVar,
df40: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20   pParse->azVar, 
df50: 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28  p->nzVar*sizeof(
df60: 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20  p->azVar[0]));. 
df70: 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65     memset(pParse
df80: 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72  ->azVar, 0, pPar
df90: 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66  se->nzVar*sizeof
dfa0: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30  (pParse->azVar[0
dfb0: 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ]));.  }.  if( p
dfc0: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d  ->aMem ){.    p-
dfd0: 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20  >aMem--;        
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dff0: 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f   aMem[] goes fro
e000: 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20  m 1..nMem */.   
e010: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72   /*       not fr
e040: 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a  om 0..nMem-1 */.
e050: 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d      for(n=1; n<=
e060: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
e070: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
e080: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
e090: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  ed;.      p->aMe
e0a0: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
e0b0: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70    }.  }.  p->exp
e0c0: 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65  lain = pParse->e
e0d0: 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65  xplain;.  sqlite
e0e0: 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a  3VdbeRewind(p);.
e0f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
e100: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
e110: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
e120: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
e130: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
e140: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
e150: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
e160: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
e170: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
e180: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
e190: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
e1a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
e1b0: 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d  beSorterClose(p-
e1c0: 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28  >db, pCx);.  if(
e1d0: 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pCx->pBt ){.   
e1e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
e1f0: 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20  se(pCx->pBt);.  
e200: 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43    /* The pCx->pC
e210: 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c  ursor will be cl
e220: 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ose automaticall
e230: 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c  y, if it exists,
e240: 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   by.    ** the c
e250: 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20  all above. */.  
e260: 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70  }else if( pCx->p
e270: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
e280: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
e290: 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73  ursor(pCx->pCurs
e2a0: 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  or);.  }.#ifndef
e2b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
e2c0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 65 6c 73 65  TUALTABLE.  else
e2d0: 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43   if( pCx->pVtabC
e2e0: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
e2f0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
e300: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20   *pVtabCursor = 
e310: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
e320: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ;.    const sqli
e330: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
e340: 75 6c 65 20 3d 20 70 56 74 61 62 43 75 72 73 6f  ule = pVtabCurso
e350: 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  r->pVtab->pModul
e360: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
e370: 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
e380: 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  b->nRef>0 );.   
e390: 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
e3a0: 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  tab->nRef--;.   
e3b0: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
e3c0: 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
e3d0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
e3e0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
e3f0: 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72 72  sors in the curr
e400: 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74  ent frame..*/.st
e410: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43  atic void closeC
e420: 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64  ursorsInFrame(Vd
e430: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
e440: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
e450: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
e460: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
e470: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
e480: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
e490: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
e4a0: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
e4b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
e4c0: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
e4d0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
e4e0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
e4f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
e500: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c  .** Copy the val
e510: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
e520: 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75  e VdbeFrame stru
e530: 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62  cture to its Vdb
e540: 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73  e. This.** is us
e550: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
e560: 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20   when a trigger 
e570: 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68  sub-program is h
e580: 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65  alted to restore
e590: 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  .** control to t
e5a0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
e5b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
e5c0: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
e5d0: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
e5e0: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
e5f0: 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f  pFrame->v;.  clo
e600: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
e610: 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (v);.#ifdef SQLI
e620: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
e630: 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61  CANSTATUS.  v->a
e640: 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e  nExec = pFrame->
e650: 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20  anExec;.#endif. 
e660: 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20   v->aOnceFlag = 
e670: 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61  pFrame->aOnceFla
e680: 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61  g;.  v->nOnceFla
e690: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63  g = pFrame->nOnc
e6a0: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20  eFlag;.  v->aOp 
e6b0: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20  = pFrame->aOp;. 
e6c0: 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65   v->nOp = pFrame
e6d0: 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d  ->nOp;.  v->aMem
e6e0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b   = pFrame->aMem;
e6f0: 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72  .  v->nMem = pFr
e700: 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->nMem;.  v->
e710: 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e  apCsr = pFrame->
e720: 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72  apCsr;.  v->nCur
e730: 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  sor = pFrame->nC
e740: 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e  ursor;.  v->db->
e750: 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61  lastRowid = pFra
e760: 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20  me->lastRowid;. 
e770: 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46   v->nChange = pF
e780: 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20  rame->nChange;. 
e790: 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20   v->db->nChange 
e7a0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61  = pFrame->nDbCha
e7b0: 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  nge;.  return pF
e7c0: 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a  rame->pc;.}../*.
e7d0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
e7e0: 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  sors..**.** Also
e7f0: 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e   release any dyn
e800: 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64  amic memory held
e810: 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68   by the VM in th
e820: 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f  e Vdbe.aMem memo
e830: 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61  ry .** cell arra
e840: 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  y. This is neces
e850: 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f  sary as the memo
e860: 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61  ry cell array ma
e870: 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69  y contain.** poi
e880: 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61  nters to VdbeFra
e890: 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63  me objects, whic
e8a0: 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f  h may in turn co
e8b0: 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
e8c0: 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  o.** open cursor
e8d0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
e8e0: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
e8f0: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  s(Vdbe *p){.  if
e900: 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
e910: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46     VdbeFrame *pF
e920: 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46  rame;.    for(pF
e930: 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
e940: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
e950: 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
e960: 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71  pParent);.    sq
e970: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
e980: 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
e990: 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30     p->pFrame = 0
e9a0: 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20  ;.    p->nFrame 
e9b0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
e9c0: 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20  t( p->nFrame==0 
e9d0: 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72  );.  closeCursor
e9e0: 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69  sInFrame(p);.  i
e9f0: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
ea00: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
ea10: 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70  y(&p->aMem[1], p
ea20: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77  ->nMem);.  }.  w
ea30: 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61  hile( p->pDelFra
ea40: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
ea50: 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70  ame *pDel = p->p
ea60: 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d  DelFrame;.    p-
ea70: 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65  >pDelFrame = pDe
ea80: 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20  l->pParent;.    
ea90: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
eaa0: 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20  Delete(pDel);.  
eab0: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
eac0: 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63  ny auxdata alloc
ead0: 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74  ations made by t
eae0: 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70  he VM */.  if( p
eaf0: 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 71 6c  ->pAuxData ) sql
eb00: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
eb10: 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b  xData(p, -1, 0);
eb20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41  .  assert( p->pA
eb30: 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a  uxData==0 );.}..
eb40: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74  /*.** Clean up t
eb50: 68 65 20 56 4d 20 61 66 74 65 72 20 61 20 73 69  he VM after a si
eb60: 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61  ngle run..*/.sta
eb70: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70  tic void Cleanup
eb80: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
eb90: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
eba0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
ebb0: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63  _DEBUG.  /* Exec
ebc0: 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61  ute assert() sta
ebd0: 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
ebe0: 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e  e that the Vdbe.
ebf0: 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a  apCsr[] and .  *
ec00: 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72  * Vdbe.aMem[] ar
ec10: 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64  rays have alread
ec20: 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75  y been cleaned u
ec30: 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  p.  */.  int i;.
ec40: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
ec50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
ec60: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73  Cursor; i++) ass
ec70: 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d  ert( p->apCsr[i]
ec80: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
ec90: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28  aMem ){.    for(
eca0: 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b  i=1; i<=p->nMem;
ecb0: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
ecc0: 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d  >aMem[i].flags==
ecd0: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b  MEM_Undefined );
ece0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
ecf0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ed00: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
ed10: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
ed20: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
ed30: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
ed40: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
ed50: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
ed60: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
ed70: 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c  rned by this SQL
ed80: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  .** statement. T
ed90: 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61  his is now set a
eda0: 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
edb0: 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69  rather than duri
edc0: 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  ng.** execution 
edd0: 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  of the vdbe prog
ede0: 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69  ram so that sqli
edf0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
ee00: 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c  () can.** be cal
ee10: 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74  led on an SQL st
ee20: 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73  atement before s
ee30: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a  qlite3_step()..*
ee40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
ee50: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62  beSetNumCols(Vdb
ee60: 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f  e *p, int nResCo
ee70: 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43  lumn){.  Mem *pC
ee80: 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b  olName;.  int n;
ee90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
eea0: 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61   p->db;..  relea
eeb0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
eec0: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
eed0: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
eee0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
eef0: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
ef00: 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f  e);.  n = nResCo
ef10: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a  lumn*COLNAME_N;.
ef20: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
ef30: 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d  = (u16)nResColum
ef40: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  n;.  p->aColName
ef50: 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d   = pColName = (M
ef60: 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  em*)sqlite3DbMal
ef70: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
ef80: 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
ef90: 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
efa0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
efb0: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
efc0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c      pColName->fl
efd0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
efe0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62      pColName->db
eff0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43   = p->db;.    pC
f000: 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a  olName++;.  }.}.
f010: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
f020: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74  ame of the idx't
f030: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72  h column to be r
f040: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
f050: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
f060: 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61   zName must be a
f070: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75   pointer to a nu
f080: 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l terminated str
f090: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
f0a0: 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64  call must be mad
f0b0: 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  e after a call t
f0c0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  o sqlite3VdbeSet
f0d0: 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a  NumCols()..**.**
f0e0: 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   The final param
f0f0: 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74  eter, xDel, must
f100: 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   be one of SQLIT
f110: 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54  E_DYNAMIC, SQLIT
f120: 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53  E_STATIC.** or S
f130: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e  QLITE_TRANSIENT.
f140: 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45   If it is SQLITE
f150: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74  _DYNAMIC, then t
f160: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
f170: 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65  d.** to by zName
f180: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62   will be freed b
f190: 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  y sqlite3DbFree(
f1a0: 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20  ) when the vdbe 
f1b0: 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f  is destroyed..*/
f1c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f1d0: 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64  SetColName(.  Vd
f1e0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f200: 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e  * Vdbe being con
f210: 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74  figured */.  int
f220: 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20   idx,           
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f240: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
f250: 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74   zName applies t
f260: 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20  o */.  int var, 
f270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f280: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
f290: 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20  f the COLNAME_* 
f2a0: 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63  constants */.  c
f2b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
f2c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f2d0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
f2e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
f2f0: 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  name */.  void (
f300: 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20  *xDel)(void*)   
f310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
f320: 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
f330: 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61  strategy for zNa
f340: 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  me */.){.  int r
f350: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
f360: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
f370: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
f380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
f390: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
f3a0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
f3b0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61  cFailed ){.    a
f3c0: 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c  ssert( !zName ||
f3d0: 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59   xDel!=SQLITE_DY
f3e0: 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74  NAMIC );.    ret
f3f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
f400: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
f410: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
f420: 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
f430: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
f440: 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
f450: 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  mn]);.  rc = sql
f460: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
f470: 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
f480: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
f490: 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73  F8, xDel);.  ass
f4a0: 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a  ert( rc!=0 || !z
f4b0: 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d  Name || (pColNam
f4c0: 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72  e->flags&MEM_Ter
f4d0: 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  m)!=0 );.  retur
f4e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
f4f0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
f500: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
f510: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
f520: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
f530: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
f540: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
f550: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
f560: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
f570: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
f580: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
f590: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
f5a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
f5b0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
f5c0: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
f5d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
f5e0: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
f5f0: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
f600: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
f610: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
f620: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
f630: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
f640: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
f650: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
f660: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  -transaction */.
f670: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f680: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
f690: 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69  Xcommit = 0;..#i
f6a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
f6b0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
f6c0: 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74  /* With this opt
f6d0: 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62  ion, sqlite3Vtab
f6e0: 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65  Sync() is define
f6f0: 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a  d to be simply .
f700: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73    ** SQLITE_OK s
f710: 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e  o p is not used.
f720: 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f   .  */.  UNUSED_
f730: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65  PARAMETER(p);.#e
f740: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  ndif..  /* Befor
f750: 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  e doing anything
f760: 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20   else, call the 
f770: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
f780: 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69   for any.  ** vi
f790: 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62  rtual module tab
f7a0: 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74  les written in t
f7b0: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
f7c0: 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a   This has to.  *
f7d0: 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65  * be done before
f7e0: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65   determining whe
f7f0: 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f  ther a master jo
f800: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20  urnal file is . 
f810: 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73   ** required, as
f820: 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c   an xSync() call
f830: 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20  back may add an 
f840: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
f850: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72  e.  ** to the tr
f860: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
f870: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
f880: 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a  abSync(db, p);..
f890: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
f8a0: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
f8b0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
f8c0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
f8d0: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
f8e0: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
f8f0: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
f900: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
f910: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
f920: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
f930: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
f940: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
f950: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
f960: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
f970: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
f980: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
f990: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
f9a0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
f9b0: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
f9c0: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
f9d0: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
f9e0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
f9f0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
fa00: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
fa10: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
fa20: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
fa30: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
fa40: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
fa50: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  {.      needXcom
fa60: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mit = 1;.      i
fa70: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73  f( i!=1 ) nTrans
fa80: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
fa90: 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29  3BtreeEnter(pBt)
faa0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
fab0: 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
fac0: 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74  veLock(sqlite3Bt
fad0: 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a  reePager(pBt));.
fae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
faf0: 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20  eeLeave(pBt);.  
fb00: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
fb10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fb20: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fb30: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
fb40: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
fb50: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
fb60: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
fb70: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
fb80: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
fb90: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
fba0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63  llback ){.    rc
fbb0: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
fbc0: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
fbd0: 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20  itArg);.    if( 
fbe0: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
fbf0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
fc00: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b  AINT_COMMITHOOK;
fc10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fc20: 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65   The simple case
fc30: 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20   - no more than 
fc40: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
fc50: 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  e (not counting 
fc60: 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61  the.  ** TEMP da
fc70: 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72  tabase) has a tr
fc80: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
fc90: 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .   There is no 
fca0: 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  need for the.  *
fcb0: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
fcc0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
fcd0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
fce0: 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  of sqlite3BtreeG
fcf0: 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20  etFilename() is 
fd00: 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20  a zero length.  
fd10: 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65  ** string, it me
fd20: 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ans the main dat
fd30: 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79  abase is :memory
fd40: 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65  : or a temp file
fd50: 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74  .  In .  ** that
fd60: 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20   case we do not 
fd70: 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d  support atomic m
fd80: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
fd90: 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20  s, so use the . 
fda0: 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20   ** simple case 
fdb0: 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  then too..  */. 
fdc0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
fdd0: 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42  trlen30(sqlite3B
fde0: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
fdf0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29  db->aDb[0].pBt))
fe00: 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31  .   || nTrans<=1
fe10: 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  .  ){.    for(i=
fe20: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
fe30: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
fe40: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
fe50: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
fe60: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
fe70: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
fe80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
fe90: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
fea0: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
feb0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
fec0: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
fed0: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
fee0: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
fef0: 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20   complete phase 
ff00: 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  1. .    ** If on
ff10: 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f  e of the BtreeCo
ff20: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
ff30: 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73  alls fails, this
ff40: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20   indicates an.  
ff50: 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68    ** IO error wh
ff60: 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ile deleting or 
ff70: 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75  truncating a jou
ff80: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73  rnal file. It is
ff90: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a   unlikely,.    *
ffa0: 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70  * but could happ
ffb0: 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  en. In this case
ffc0: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
ffd0: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
ffe0: 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  he error..    */
fff0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
10000 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
10010 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
10020 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
10030 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
10040 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
10050 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10060 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
10070 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
10080 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
10090 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
100a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
100b0 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
100c0 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  mit(db);.    }. 
100d0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d   }..  /* The com
100e0 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72  plex case - Ther
100f0 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c  e is a multi-fil
10100 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
10110 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a  ion active..  **
10120 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61   This requires a
10130 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10140 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74  file to ensure t
10150 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
10160 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  s.  ** committed
10170 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a   atomically..  *
10180 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
10190 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
101a0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
101b0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d  _vfs *pVfs = db-
101c0 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e  >pVfs;.    int n
101d0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
101e0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
101f0 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61   0;   /* File-na
10200 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65  me for the maste
10210 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  r journal */.   
10220 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61   char const *zMa
10230 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
10240 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
10250 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
10260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
10270 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b  le *pMaster = 0;
10280 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
10290 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  = 0;.    int res
102a0 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43  ;.    int retryC
102b0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ount = 0;.    in
102c0 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20  t nMainFile;..  
102d0 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
102e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
102f0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d  e name */.    nM
10300 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
10310 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46  3Strlen30(zMainF
10320 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ile);.    zMaste
10330 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
10340 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58  tf(db, "%s-mjXXX
10350 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46  XXX9XXz", zMainF
10360 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ile);.    if( zM
10370 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72  aster==0 ) retur
10380 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
10390 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
103a0 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
103b0 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
103c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
103d0 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29  retryCount>100 )
103e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
103f0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
10400 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a  ULL, "MJ delete:
10410 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
10420 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10430 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
10440 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
10450 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10460 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10470 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b  retryCount==1 ){
10480 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10490 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
104a0 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a  LL, "MJ collide:
104b0 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
104c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
104d0 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75  }.      retryCou
104e0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
104f0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
10500 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
10510 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
10520 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
10530 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e  f(13, &zMaster[n
10540 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25  MainFile], "-mj%
10550 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20  06X9%02X",.     
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64            (iRand
10580 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c  om>>8)&0xffffff,
10590 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a   iRandom&0xff);.
105a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74        /* The ant
105b0 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61  ipenultimate cha
105c0 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61  racter of the ma
105d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
105e0 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e must.      ** 
105f0 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20  be "9" to avoid 
10600 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  name collisions 
10610 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66  when using 8+3 f
10620 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20  ilenames. */.   
10630 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74     assert( zMast
10640 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  er[sqlite3Strlen
10650 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d  30(zMaster)-3]==
10660 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  '9' );.      sql
10670 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
10680 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74  zMainFile, zMast
10690 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
106a0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
106b0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
106c0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
106d0 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
106e0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
106f0 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
10700 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
10720 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
10730 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
10740 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10750 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
10760 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
10770 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
10780 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
10790 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
107a0 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
107b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
107c0 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
107d0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
107e0 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
107f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
10820 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
10830 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10840 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
10850 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
10860 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
10870 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
10880 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
10890 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
108a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
108b0 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
108c0 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
108d0 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
108e0 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
108f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10900 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
10910 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
10920 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
10930 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
10940 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
10950 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
10960 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
10970 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
10980 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
10990 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
109a0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
109b0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
109c0 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
109d0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
109e0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
109f0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
10a00 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
10a10 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
10a20 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
10a30 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
10a40 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
10a50 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
10a60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
10a70 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
10a80 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
10a90 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
10aa0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
10ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
10ac0 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
10ad0 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e      if( !needSyn
10ae0 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72  c && !sqlite3Btr
10af0 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70  eeSyncDisabled(p
10b00 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
10b10 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
10b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10b30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
10b40 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46  rite(pMaster, zF
10b50 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ile, sqlite3Strl
10b60 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f  en30(zFile)+1, o
10b70 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
10b80 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65  offset += sqlite
10b90 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
10ba0 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
10bb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10bc0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10bd0 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
10be0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
10bf0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
10c00 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
10c10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
10c20 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10c30 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
10c40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10c60 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
10c70 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
10c80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
10c90 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
10ca0 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20  NTIAL device.   
10cb0 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20   ** flag is set 
10cc0 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  this is not requ
10cd0 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
10ce0 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20   if( needSync . 
10cf0 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74      && 0==(sqlit
10d00 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
10d10 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
10d20 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
10d30 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20  SEQUENTIAL).    
10d40 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
10d50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
10d60 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49  nc(pMaster, SQLI
10d70 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29  TE_SYNC_NORMAL))
10d80 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
10d90 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
10da0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
10db0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
10dc0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
10dd0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
10de0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
10df0 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
10e00 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
10e10 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
10e20 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
10e30 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
10e40 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
10e50 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
10e60 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
10e70 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
10e80 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
10e90 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
10ea0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
10eb0 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
10ec0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
10ed0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
10ee0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
10ef0 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
10f00 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
10f10 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  st call to.    *
10f20 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
10f30 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20  mmitPhaseOne(), 
10f40 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
10f50 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a  chance that the.
10f60 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
10f70 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
10f80 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  be orphaned. But
10f90 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
10fa0 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20  e it,.    ** in 
10fb0 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20  case the master 
10fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
10fd0 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
10fe0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
10ff0 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72     ** file befor
11000 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63  e the failure oc
11010 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  curred..    */. 
11020 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
11030 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
11040 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
11050 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
11060 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
11070 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
11080 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
11090 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
110a0 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
110b0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
110c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
110d0 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
110e0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
110f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
11100 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20  BUSY );.    if( 
11110 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
11130 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
11140 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11150 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
11160 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
11170 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11180 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
11190 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
111a0 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
111b0 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
111c0 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
111d0 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
111e0 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
111f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
11200 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
11210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
11220 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
11230 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
11240 20 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20   needSync);.    
11250 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11260 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
11270 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
11280 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
11290 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
112a0 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
112b0 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
112c0 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
112d0 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
112e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
112f0 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
11300 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
11310 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
11320 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
11330 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
11340 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
11350 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
11360 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
11370 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
11380 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
11390 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
113a0 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
113b0 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
113c0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
113d0 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
113e0 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
113f0 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
11400 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
11410 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
11420 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
11430 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
11440 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
11450 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
11460 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
11470 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
11480 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
11490 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
114a0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
114b0 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
114c0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
114d0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
114e0 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
114f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
11500 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
11510 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
11520 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
11530 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
11540 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
11550 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
11560 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
11570 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
11580 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
11590 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
115a0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
115b0 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
115c0 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64   the sqlite3.nVd
115d0 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76  beActive count v
115e0 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
115f0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
11600 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
11610 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
11620 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
11630 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
11640 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
11650 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
11660 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
11670 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
11680 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
11690 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
116a0 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
116b0 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
116c0 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
116d0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
116e0 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
116f0 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
11700 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
11710 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
11720 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
11730 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
11740 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
11750 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20  t nWrite = 0;.  
11760 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20  int nRead = 0;. 
11770 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
11780 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
11790 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
117a0 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33  mt_busy((sqlite3
117b0 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20  _stmt*)p) ){.   
117c0 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
117d0 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  if( p->readOnly=
117e0 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20  =0 ) nWrite++;. 
117f0 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52       if( p->bIsR
11800 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b  eader ) nRead++;
11810 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
11820 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
11830 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
11840 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20  nVdbeActive );. 
11850 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
11860 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
11870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  );.  assert( nRe
11880 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ad==db->nVdbeRea
11890 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  d );.}.#else.#de
118a0 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
118b0 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
118c0 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
118d0 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
118e0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
118f0 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65  t opened a state
11900 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
11910 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f  ,.** close it no
11920 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20  w. Argument eOp 
11930 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
11940 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
11950 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  K or.** SAVEPOIN
11960 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74  T_RELEASE. If it
11970 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
11980 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65  LLBACK, then the
11990 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
119a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
119b0 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70  led back. If eOp
119c0 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
119d0 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20  LEASE, then the 
119e0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72  .** statement tr
119f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
11a00 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
11a10 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
11a20 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
11a30 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
11a40 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
11a50 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
11a60 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
11a70 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
11a80 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
11a90 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
11aa0 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
11ab0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
11ac0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11ad0 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74  ..  /* If p->iSt
11ae0 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74  atement is great
11af0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
11b00 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65  en this Vdbe ope
11b10 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74  ned a .  ** stat
11b20 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
11b30 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  n that should be
11b40 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68   closed here. Th
11b50 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e  e only exception
11b60 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e  .  ** is that an
11b70 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61   IO error may ha
11b80 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75  ve occurred, cau
11b90 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63  sing an emergenc
11ba0 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  y rollback..  **
11bb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64   In this case (d
11bc0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
11bd0 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ), and there is 
11be0 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20  nothing to do.. 
11bf0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53   */.  if( db->nS
11c00 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
11c10 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
11c20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
11c30 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
11c40 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
11c50 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  -1;..    assert(
11c60 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
11c70 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d  ROLLBACK || eOp=
11c80 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
11c90 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  SE);.    assert(
11ca0 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
11cb0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
11cc0 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
11cd0 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b  (db->nStatement+
11ce0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20  db->nSavepoint) 
11cf0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  );..    for(i=0;
11d00 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11d10 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  { .      int rc2
11d20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11d30 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
11d40 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
11d50 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
11d60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  {.        if( eO
11d70 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
11d80 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
11d90 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
11da0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
11db0 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Bt, SAVEPOINT_RO
11dc0 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
11dd0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
11de0 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d         if( rc2==
11df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11e00 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
11e10 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
11e20 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
11e30 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
11e40 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
11e50 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
11e60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11e70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63           rc = rc
11e80 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
11e90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64     }.    }.    d
11ea0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b  b->nStatement--;
11eb0 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  .    p->iStateme
11ec0 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  nt = 0;..    if(
11ed0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11ee0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d  {.      if( eOp=
11ef0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
11f00 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ACK ){.        r
11f10 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
11f20 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
11f30 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
11f40 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
11f50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11f60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11f70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11f80 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
11f90 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
11fa0 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
11fb0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
11fc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11fd0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
11fe0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
11ff0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ng rolled back, 
12000 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65  also restore the
12010 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
12020 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
12030 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
12040 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
12050 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
12060 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
12070 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12080 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f   was opened.  */
12090 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  .    if( eOp==SA
120a0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
120b0 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44   ){.      db->nD
120c0 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d  eferredCons = p-
120d0 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20  >nStmtDefCons;. 
120e0 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
120f0 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e  edImmCons = p->n
12100 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a  StmtDefImmCons;.
12110 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12120 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12130 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12140 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
12150 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
12160 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
12170 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
12180 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
12190 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
121a0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
121b0 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
121c0 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
121d0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
121e0 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
121f0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
12200 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
12210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
12220 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
12230 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
12240 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
12250 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
12260 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
12270 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
12280 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
12290 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
122a0 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
122b0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
122c0 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20  T_FOREIGNKEY.** 
122d0 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72  and write an err
122e0 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
122f0 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
12300 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
12310 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12320 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
12330 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
12340 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
12350 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
12360 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
12370 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
12380 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65  rred && (db->nDe
12390 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e  ferredCons+db->n
123a0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29  DeferredImmCons)
123b0 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66  >0) .   || (!def
123c0 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
123d0 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20  onstraint>0) .  
123e0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
123f0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12400 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
12410 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
12420 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
12430 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
12440 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  (p, "FOREIGN KEY
12450 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
12460 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
12470 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
12480 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12490 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
124a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
124b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
124c0 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
124d0 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
124e0 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
124f0 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
12500 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
12510 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
12520 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
12530 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
12540 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
12550 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
12560 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
12570 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
12580 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
12590 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
125a0 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
125b0 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
125c0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
125d0 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
125e0 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
125f0 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
12600 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
12610 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
12620 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
12630 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
12640 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
12650 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
12660 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
12670 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
12680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
12690 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
126a0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
126b0 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
126c0 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
126d0 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
126e0 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
126f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
12700 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
12710 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
12740 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
12750 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
12760 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
12770 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
12780 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
12790 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
127a0 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
127b0 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
127c0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
127d0 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
127e0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
127f0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
12800 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
12810 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
12820 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
12830 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
12840 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
12850 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
12860 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
12870 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
12880 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
12890 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
128a0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
128b0 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
128c0 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
128d0 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
128e0 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
128f0 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
12900 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
12910 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
12920 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
12930 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12940 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
12950 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
12960 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
12970 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
12980 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
12990 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
129a0 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
129b0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
129c0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
129d0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
129e0 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20   p->aOnceFlag ) 
129f0 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46  memset(p->aOnceF
12a00 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65  lag, 0, p->nOnce
12a10 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c  Flag);.  closeAl
12a20 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
12a30 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
12a40 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
12a50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12a60 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
12a70 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
12a80 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
12a90 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
12aa0 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
12ab0 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
12ac0 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
12ad0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
12ae0 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
12af0 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
12b00 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
12b10 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
12b20 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
12b30 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
12b40 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
12b50 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
12b60 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
12b70 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
12b80 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
12b90 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
12ba0 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
12bb0 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
12bc0 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
12bd0 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
12be0 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
12bf0 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
12c00 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
12c10 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
12c20 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
12c30 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
12c40 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
12c50 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
12c60 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
12c70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
12c80 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
12c90 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
12ca0 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
12cb0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
12cc0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
12cd0 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
12ce0 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
12cf0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
12d00 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
12d10 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
12d20 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
12d30 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
12d40 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
12d50 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
12d60 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
12d70 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
12d80 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
12d90 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
12da0 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
12db0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
12dc0 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
12dd0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
12de0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
12df0 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
12e00 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
12e10 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
12e20 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
12e30 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
12e40 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
12e50 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
12e60 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
12e70 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
12e80 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
12e90 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
12ea0 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
12eb0 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
12ec0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
12ed0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
12ee0 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
12ef0 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
12f00 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
12f10 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
12f20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
12f30 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
12f40 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
12f50 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
12f60 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
12f70 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
12f80 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
12f90 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
12fa0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
12fb0 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
12fc0 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
12fd0 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
12fe0 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
12ff0 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
13000 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
13010 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
13020 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
13030 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13040 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
13050 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
13060 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
13070 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
13080 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
13090 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
130a0 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
130b0 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
130c0 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
130d0 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
130e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
130f0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
13100 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
13110 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
13120 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13130 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
13140 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
13150 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
13160 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
13170 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
13180 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13190 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
131a0 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
131b0 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
131c0 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
131d0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
131e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
131f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
13200 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
13210 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
13220 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
13230 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
13240 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
13250 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
13260 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
13270 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
13280 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
13290 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
132a0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
132b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
132c0 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
132d0 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
132e0 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
132f0 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
13300 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
13310 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
13320 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
13330 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
13340 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
13350 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
13360 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
13370 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
13380 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
13390 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
133a0 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
133b0 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
133c0 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
133d0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
133e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
133f0 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
13400 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13420 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
13430 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
13440 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13450 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
13460 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
13470 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
13480 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13490 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
134a0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
134b0 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
134c0 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
134d0 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
134e0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
134f0 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
13500 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
13510 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
13520 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
13530 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
13540 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
13550 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
13560 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
13570 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
13580 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
13590 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
135a0 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
135b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
135c0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
135d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
135e0 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
135f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13600 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13610 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
13620 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
13630 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
13640 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
13650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
13660 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
13670 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
13680 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13690 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
136a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
136b0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
136c0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
136d0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
136e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
136f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
13700 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
13710 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
13720 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
13730 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
13740 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
13750 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
13760 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13770 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
13780 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
13790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
137a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
137b0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
137c0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
137d0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
137e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
137f0 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
13800 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ment = 0;.    }e
13810 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65  lse if( eStateme
13820 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ntOp==0 ){.     
13830 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13840 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
13850 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
13860 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
13870 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
13880 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20  OINT_RELEASE;.  
13890 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
138a0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
138b0 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
138c0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
138d0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
138e0 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ACK;.      }else
138f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13900 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
13910 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
13920 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
13930 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
13940 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
13950 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
13960 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
13970 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
13980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13990 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61   .    /* If eSta
139a0 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d  tementOp is non-
139b0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61  zero, then a sta
139c0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
139d0 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  on needs to.    
139e0 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ** be committed 
139f0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  or rolled back. 
13a00 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  Call sqlite3Vdbe
13a10 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29  CloseStatement()
13a20 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f   to.    ** do so
13a30 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74  . If this operat
13a40 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
13a50 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75  rror, and the cu
13a60 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a  rrent statement.
13a70 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
13a80 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  e is SQLITE_OK o
13a90 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  r SQLITE_CONSTRA
13aa0 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74  INT, then promot
13ab0 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  e the.    ** cur
13ac0 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65  rent statement e
13ad0 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a  rror code..    *
13ae0 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  /.    if( eState
13af0 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20  mentOp ){.      
13b00 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
13b10 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
13b20 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b  , eStatementOp);
13b30 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
13b40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
13b50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
13b60 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53   (p->rc&0xff)==S
13b70 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
13b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
13b90 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
13ba0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13bb0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
13bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
13bd0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
13be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
13bf0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
13c00 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
13c10 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
13c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
13c30 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
13c40 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
13c50 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
13c60 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
13c70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
13c80 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
13c90 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
13ca0 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
13cb0 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61  ELETE and no sta
13cc0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
13cd0 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65  on.    ** has be
13ce0 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  en rolled back, 
13cf0 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  update the datab
13d00 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  ase connection c
13d10 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a  hange-counter. .
13d20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
13d30 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b  ->changeCntOn ){
13d40 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74  .      if( eStat
13d50 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49  ementOp!=SAVEPOI
13d60 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
13d70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13d80 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
13d90 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
13da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13db0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
13dc0 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
13dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13de0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
13df0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
13e00 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a  ease the locks *
13e10 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
13e20 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a  eLeave(p);.  }..
13e30 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63    /* We have suc
13e40 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64  cessfully halted
13e50 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20   and closed the 
13e60 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73  VM.  Record this
13e70 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20   fact. */.  if( 
13e80 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
13e90 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d  db->nVdbeActive-
13ea0 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72  -;.    if( !p->r
13eb0 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56  eadOnly ) db->nV
13ec0 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20  dbeWrite--;.    
13ed0 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
13ee0 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64   ) db->nVdbeRead
13ef0 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
13f00 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
13f10 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
13f20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
13f30 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d  ->nVdbeRead>=db-
13f40 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
13f50 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
13f60 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a  VdbeWrite>=0 );.
13f70 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
13f80 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
13f90 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  ;.  checkActiveV
13fa0 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66  dbeCnt(db);.  if
13fb0 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
13fc0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
13fd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
13fe0 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  M;.  }..  /* If 
13ff0 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
14000 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74  flag is set to t
14010 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f  rue, then any lo
14020 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65  cks that were he
14030 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65  ld.  ** by conne
14040 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f  ction db have no
14050 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e  w been released.
14060 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e   Call sqlite3Con
14070 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
14080 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b  ) .  ** to invok
14090 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75  e any required u
140a0 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c  nlock-notify cal
140b0 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69  lbacks..  */.  i
140c0 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
140d0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
140e0 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
140f0 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61  ed(db);.  }..  a
14100 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
14110 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e  Active>0 || db->
14120 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c  autoCommit==0 ||
14130 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d   db->nStatement=
14140 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
14150 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
14160 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  SY ? SQLITE_BUSY
14170 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d   : SQLITE_OK);.}
14180 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
14190 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
141a0 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
141b0 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
141c0 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
141d0 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
141e0 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
141f0 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
14200 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
14210 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
14220 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
14230 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
14240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14250 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72  *.** Copy the er
14260 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
14270 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e  or message belon
14280 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45  ging to the VDBE
14290 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
142a0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
142b0 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65   to its database
142c0 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74   handle (so that
142d0 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a   they will be .*
142e0 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61  * returned by ca
142f0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  lls to sqlite3_e
14300 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c  rrcode() and sql
14310 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a  ite3_errmsg())..
14320 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
14330 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65  ion does not cle
14340 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f  ar the VDBE erro
14350 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67  r code or messag
14360 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65  e, just.** copie
14370 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61  s them to the da
14380 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
14390 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
143a0 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56  eTransferError(V
143b0 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
143c0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
143d0 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
143e0 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d  ;.  if( p->zErrM
143f0 73 67 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c  sg ){.    u8 mal
14400 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e  locFailed = db->
14410 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
14420 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
14430 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
14440 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d    if( db->pErr==
14450 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73  0 ) db->pErr = s
14460 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
14470 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
14480 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
14490 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
144a0 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
144b0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
144c0 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
144d0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
144e0 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  );.    db->mallo
144f0 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63  cFailed = malloc
14500 46 61 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e  Failed;.    db->
14510 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
14520 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
14530 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
14540 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14550 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
14560 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
14570 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c  ./*.** If an SQL
14580 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
14590 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74  G hook is regist
145a0 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20  ered and the VM 
145b0 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a  has been run, .*
145c0 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a  * invoke it..*/.
145d0 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
145e0 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62  InvokeSqllog(Vdb
145f0 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c  e *v){.  if( sql
14600 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
14610 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72  .xSqllog && v->r
14620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14630 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63  v->zSql && v->pc
14640 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=0 ){.    char 
14650 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c  *zExpanded = sql
14660 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71  ite3VdbeExpandSq
14670 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20  l(v, v->zSql);. 
14680 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62     assert( v->db
14690 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
146a0 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e  ;.    if( zExpan
146b0 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ded ){.      sql
146c0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
146d0 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20  .xSqllog(.      
146e0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
146f0 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
14700 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61  rg, v->db, zExpa
14710 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b  nded, 1.      );
14720 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
14730 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70  Free(v->db, zExp
14740 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  anded);.    }.  
14750 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
14760 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  ne vdbeInvokeSql
14770 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  log(x).#endif../
14780 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
14790 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
147a0 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
147b0 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
147c0 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
147d0 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
147e0 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
147f0 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
14800 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
14810 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
14820 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
14830 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
14840 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
14850 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
14860 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
14870 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
14880 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
14890 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
148a0 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
148b0 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
148c0 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
148d0 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
148e0 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
148f0 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
14900 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
14910 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
14920 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
14930 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
14940 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
14950 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
14960 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
14970 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
14980 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
14990 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
149a0 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
149b0 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
149c0 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
149d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
149e0 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  Halt(p);..  /* I
149f0 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
14a00 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
14a10 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
14a20 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
14a30 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
14a40 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
14a50 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
14a60 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
14a70 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
14a80 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
14a90 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
14aa0 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
14ab0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
14ac0 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
14ad0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
14ae0 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
14af0 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
14b00 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
14b10 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
14b20 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
14b30 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c    vdbeInvokeSqll
14b40 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  og(p);.    sqlit
14b50 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
14b60 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ror(p);.    sqli
14b70 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14b80 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
14b90 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
14ba0 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
14bb0 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
14bc0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
14bd0 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
14be0 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
14bf0 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
14c00 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
14c10 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
14c20 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
14c30 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
14c40 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
14c50 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
14c60 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
14c70 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
14c80 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
14c90 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
14ca0 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
14cb0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
14cc0 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
14cd0 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d   p->rc, p->zErrM
14ce0 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70  sg ? "%s" : 0, p
14cf0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
14d00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14d10 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
14d20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
14d30 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
14d40 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
14d50 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
14d60 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
14d70 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
14d80 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
14d90 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
14da0 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
14db0 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
14dc0 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
14dd0 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
14de0 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
14df0 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
14e00 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
14e10 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
14e20 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
14e30 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
14e40 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
14e50 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
14e60 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
14e70 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
14e80 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
14e90 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
14ea0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71        if( p->zSq
14eb0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  l ){.        cha
14ec0 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20  r c, pc = 0;.   
14ed0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
14ee0 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
14ef0 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
14f00 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20  p->zSql[i])!=0; 
14f10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
14f20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66  if( pc=='\n' ) f
14f30 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
14f40 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  ");.          pu
14f50 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
14f60 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20        pc = c;.  
14f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14f80 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66  if( pc!='\n' ) f
14f90 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
14fa0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14fb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
14fc0 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
14fd0 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d    char zHdr[100]
14fe0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14ff0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
15000 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22  f(zHdr), zHdr, "
15010 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75  %6u %12llu %8llu
15020 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
15030 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
15040 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
15050 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
15060 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
15070 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
15080 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
15090 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
150a0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70     );.        fp
150b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
150c0 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20   zHdr);.        
150d0 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
150e0 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
150f0 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
15100 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
15110 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
15120 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e  dif.  p->iCurren
15130 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  tTime = 0;.  p->
15140 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
15150 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72  IC_INIT;.  retur
15160 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
15170 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
15180 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
15190 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
151a0 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
151b0 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
151c0 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
151d0 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
151e0 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
151f0 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
15200 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
15210 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
15220 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
15230 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15240 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
15250 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
15260 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
15270 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
15280 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
15290 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
152a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
152b0 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
152c0 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a  ask)==rc );.  }.
152d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
152e0 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
152f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
15300 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69   parameter iOp i
15310 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
15320 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
15330 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
15340 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72  .** all auxiliar
15350 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
15360 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
15370 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
15380 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  d as.** the firs
15390 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
153a0 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20  * Or, if iOp is 
153b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
153c0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
153d0 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74  hen the destruct
153e0 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e  or is.** only in
153f0 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20  voked for those 
15400 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
15410 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20  ointers created 
15420 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20  by the user .** 
15430 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64  function invoked
15440 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74   by the OP_Funct
15450 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e  ion opcode at in
15460 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66  struction iOp of
15470 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61   .** VM pVdbe, a
15480 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a  nd only then if:
15490 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
154a0 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74  associated funct
154b0 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  ion parameter is
154c0 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74   the 32nd or lat
154d0 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20  er (counting.** 
154e0 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74       from left t
154f0 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a  o right), or.**.
15500 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72  **    * the corr
15510 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
15520 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69   argument mask i
15530 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74  s clear (where t
15540 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20  he first.**     
15550 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
15560 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ter corresponds 
15570 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a  to bit 0 etc.)..
15580 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
15590 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
155a0 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 69 6e  (Vdbe *pVdbe, in
155b0 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29  t iOp, int mask)
155c0 7b 0a 20 20 41 75 78 44 61 74 61 20 2a 2a 70 70  {.  AuxData **pp
155d0 20 3d 20 26 70 56 64 62 65 2d 3e 70 41 75 78 44   = &pVdbe->pAuxD
155e0 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70  ata;.  while( *p
155f0 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61  p ){.    AuxData
15600 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20   *pAux = *pp;.  
15610 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20    if( (iOp<0).  
15620 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70     || (pAux->iOp
15630 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e  ==iOp && (pAux->
15640 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73  iArg>31 || !(mas
15650 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41  k & MASKBIT32(pA
15660 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20  ux->iArg)))).   
15670 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
15680 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d  se( pAux->iArg==
15690 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  31 );.      if( 
156a0 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
156b0 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
156c0 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
156d0 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
156e0 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e    *pp = pAux->pN
156f0 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
15700 65 33 44 62 46 72 65 65 28 70 56 64 62 65 2d 3e  e3DbFree(pVdbe->
15710 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d  db, pAux);.    }
15720 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20  else{.      pp= 
15730 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  &pAux->pNext;.  
15740 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
15750 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
15760 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15770 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
15780 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
15790 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65  rgument,.** exce
157a0 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74  pt for object it
157b0 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70  self, which is p
157c0 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
157d0 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
157e0 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
157f0 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33  tion and sqlite3
15800 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20  VdbeDelete() is 
15810 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65  that.** VdbeDele
15820 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b  te() also unlink
15830 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  s the Vdbe from 
15840 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20  the list of VMs 
15850 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
15860 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
15870 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66  connection and f
15880 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20  rees the object 
15890 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20  itself..*/.void 
158a0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
158b0 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
158c0 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
158d0 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62  SubProgram *pSub
158e0 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20  , *pNext;.  int 
158f0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  i;.  assert( p->
15900 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d  db==0 || p->db==
15910 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  db );.  releaseM
15920 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
15930 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c   p->nVar);.  rel
15940 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
15950 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
15960 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
15970 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70  N);.  for(pSub=p
15980 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62  ->pProgram; pSub
15990 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20  ; pSub=pNext){. 
159a0 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d     pNext = pSub-
159b0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65  >pNext;.    vdbe
159c0 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
159d0 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d  pSub->aOp, pSub-
159e0 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  >nOp);.    sqlit
159f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
15a00 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  b);.  }.  for(i=
15a10 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30  p->nzVar-1; i>=0
15a20 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62  ; i--) sqlite3Db
15a30 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61  Free(db, p->azVa
15a40 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65  r[i]);.  vdbeFre
15a50 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
15a60 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
15a70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15a80 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
15a90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15aa0 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  db, p->zSql);.  
15ab0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15ac0 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66  , p->pFree);.#if
15ad0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15ae0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
15af0 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  S.  for(i=0; i<p
15b00 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
15b10 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15b20 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d  (db, p->aScan[i]
15b30 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
15b40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15b50 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65 6e 64   p->aScan);.#end
15b60 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  if.}../*.** Dele
15b70 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
15b80 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
15b90 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
15ba0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
15bb0 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56   *db;..  if( NEV
15bc0 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
15bd0 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  n;.  db = p->db;
15be0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15bf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
15c00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15c10 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
15c20 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
15c30 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
15c40 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
15c50 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
15c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
15c70 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
15c80 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
15c90 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
15ca0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
15cb0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
15cc0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
15cd0 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
15ce0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
15cf0 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
15d00 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
15d10 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
15d20 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22  .** The cursor "
15d30 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67  p" has a pending
15d40 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20   seek operation 
15d50 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74  that has not yet
15d60 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64   been.** carried
15d70 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20   out.  Seek the 
15d80 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20  cursor now.  If 
15d90 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
15da0 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61   return.** the a
15db0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
15dc0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
15dd0 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
15de0 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72  LINE handleDefer
15df0 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  redMoveto(VdbeCu
15e00 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
15e10 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
15e20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78  SQLITE_TEST.  ex
15e30 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
15e40 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
15e50 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
15e60 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
15e70 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
15e80 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 72  ->isTable );.  r
15e90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
15ea0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
15eb0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
15ec0 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
15ed0 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
15ee0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
15ef0 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65   if( res!=0 ) re
15f00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
15f10 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66  UPT_BKPT;.#ifdef
15f20 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
15f30 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
15f40 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
15f50 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
15f60 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  o = 0;.  p->cach
15f70 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
15f80 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20  STALE;.  return 
15f90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15fa0 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61  .** Something ha
15fb0 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22  s moved cursor "
15fc0 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e  p" out of place.
15fd0 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20    Maybe the row 
15fe0 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65  it was.** pointe
15ff0 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64  d to was deleted
16000 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
16010 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68  it.  Or maybe th
16020 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72  e btree was.** r
16030 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74  ebalanced.  What
16040 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20  ever the cause, 
16050 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22  try to restore "
16060 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20  p" to the place 
16070 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65  it.** is suppose
16080 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67  d to be pointing
16090 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61  .  If the row wa
160a0 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
160b0 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20  om under the.** 
160c0 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20  cursor, set the 
160d0 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
160e0 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  to a NULL row..*
160f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
16100 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
16110 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56  dleMovedCursor(V
16120 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
16130 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74   int isDifferent
16140 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72  Row, rc;.  asser
16150 74 28 20 70 2d 3e 70 43 75 72 73 6f 72 21 3d 30  t( p->pCursor!=0
16160 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
16170 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
16180 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72  HasMoved(p->pCur
16190 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
161a0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
161b0 72 52 65 73 74 6f 72 65 28 70 2d 3e 70 43 75 72  rRestore(p->pCur
161c0 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e  sor, &isDifferen
161d0 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68  tRow);.  p->cach
161e0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
161f0 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44  STALE;.  if( isD
16200 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d  ifferentRow ) p-
16210 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
16220 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16230 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73  .** Check to ens
16240 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
16250 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52  sor is valid.  R
16260 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
16270 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e  r.** if need be.
16280 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f    Return any I/O
16290 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20   error from the 
162a0 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f  restore operatio
162b0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
162c0 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f  3VdbeCursorResto
162d0 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  re(VdbeCursor *p
162e0 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
162f0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
16300 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20  ved(p->pCursor) 
16310 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
16320 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
16330 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
16340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16350 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
16360 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72  he cursor p is r
16370 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20  eady to read or 
16380 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f  write the row to
16390 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73   which it.** was
163a0 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64   last positioned
163b0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
163c0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f  or code if an OO
163d0 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65  M fault or I/O e
163e0 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73  rror.** prevents
163f0 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f   us from positio
16400 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
16410 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70  to its correct p
16420 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  osition..**.** I
16430 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
16440 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
16450 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
16460 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
16470 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
16480 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20    If no move is 
16490 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74  pending, check t
164a0 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77  o see if the row
164b0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c   has been.** del
164c0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
164d0 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61  der the cursor a
164e0 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61  nd if it has, ma
164f0 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a  rk the row as.**
16500 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a   a NULL row..**.
16510 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
16520 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
16530 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72  ting to the corr
16540 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74  ect row and that
16550 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20   row has.** not 
16560 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
16570 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
16580 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69  cursor, then thi
16590 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
165a0 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
165b0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
165c0 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
165d0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65  *p){.  if( p->de
165e0 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
165f0 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
16600 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
16610 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  p);.  }.  if( p-
16620 3e 70 43 75 72 73 6f 72 20 26 26 20 73 71 6c 69  >pCursor && sqli
16630 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
16640 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
16650 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
16660 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
16670 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  or(p);.  }.  ret
16680 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16690 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
166a0 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a  owing functions:
166b0 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  .**.** sqlite3Vd
166c0 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a  beSerialType().*
166d0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
166e0 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20  ialTypeLen().** 
166f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16700 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lLen().** sqlite
16710 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29  3VdbeSerialPut()
16720 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
16730 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a  erialGet().**.**
16740 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65   encapsulate the
16750 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61   code that seria
16760 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72  lizes values for
16770 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69   storage in SQLi
16780 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69  te.** data and i
16790 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61  ndex records. Ea
167a0 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  ch serialized va
167b0 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  lue consists of 
167c0 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70  a.** 'serial-typ
167d0 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66  e' and a blob of
167e0 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61   data. The seria
167f0 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62  l type is an 8-b
16800 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20  yte unsigned.** 
16810 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20  integer, stored 
16820 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a  as a varint..**.
16830 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20  ** In an SQLite 
16840 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68  index record, th
16850 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
16860 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79   stored directly
16870 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62   before.** the b
16880 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74  lob of data that
16890 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20   it corresponds 
168a0 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72  to. In a table r
168b0 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61  ecord, all seria
168c0 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73  l.** types are s
168d0 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
168e0 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
168f0 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20  , and the blobs 
16900 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68  of data at.** th
16910 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65  e end. Hence the
16920 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c  se functions all
16930 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  ow the caller to
16940 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73   handle the.** s
16950 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64  erial-type and d
16960 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74  ata blob separat
16970 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ely..**.** The f
16980 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
16990 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72  escribes the var
169a0 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61  ious storage cla
169b0 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a  sses for data:.*
169c0 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79  *.**   serial ty
169d0 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20  pe        bytes 
169e0 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70  of data      typ
169f0 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
16a00 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
16a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
16a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
16a30 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
16a40 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
16a50 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20          NULL.** 
16a60 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
16a70 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
16a80 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
16a90 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32  nteger.**      2
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ab0 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
16ac0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
16ad0 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
16af0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
16b00 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
16b10 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
16b20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20           4      
16b30 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
16b40 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20  eger.**      5  
16b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b60 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
16b70 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
16b80 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20  *      6        
16b90 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
16ba0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
16bb0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
16bc0 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20   7              
16bd0 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
16be0 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a      IEEE float.*
16bf0 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20  *      8        
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
16c10 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
16c20 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20  r constant 0.** 
16c30 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20       9          
16c40 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
16c50 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
16c60 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20  constant 1.**   
16c70 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20    10,11         
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c90 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66        reserved f
16ca0 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20  or expansion.** 
16cb0 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65     N>=12 and eve
16cc0 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32  n       (N-12)/2
16cd0 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20          BLOB.** 
16ce0 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64     N>=13 and odd
16cf0 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32          (N-13)/2
16d00 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a          text.**.
16d10 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74  ** The 8 and 9 t
16d20 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20  ypes were added 
16d30 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66  in 3.3.0, file f
16d40 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20  ormat 4.  Prior 
16d50 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53  versions.** of S
16d60 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75  QLite will not u
16d70 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20  nderstand those 
16d80 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f  serial types..*/
16d90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16da0 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66  he serial-type f
16db0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
16dc0 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a  red in pMem..*/.
16dd0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
16de0 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70  erialType(Mem *p
16df0 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
16e00 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61  rmat){.  int fla
16e10 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
16e20 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 69 66  ;.  u32 n;..  if
16e30 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ( flags&MEM_Null
16e40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
16e50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
16e60 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
16e70 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
16e80 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
16e90 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
16ea0 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
16eb0 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
16ec0 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
16ed0 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
16ee0 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
16ef0 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
16f00 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
16f10 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73  u = ~i;.    }els
16f20 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
16f30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
16f40 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 72 65  =127 ){.      re
16f50 74 75 72 6e 20 28 28 69 26 31 29 3d 3d 69 20 26  turn ((i&1)==i &
16f60 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  & file_format>=4
16f70 29 20 3f 20 38 2b 28 75 33 32 29 75 20 3a 20 31  ) ? 8+(u32)u : 1
16f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16f90 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72  u<=32767 ) retur
16fa0 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 2;.    if( u<=
16fb0 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e  8388607 ) return
16fc0 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32   3;.    if( u<=2
16fd0 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75  147483647 ) retu
16fe0 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 4;.    if( u<
16ff0 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74  =MAX_6BYTE ) ret
17000 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72  urn 5;.    retur
17010 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
17020 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
17030 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
17040 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65   }.  assert( pMe
17050 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  m->db->mallocFai
17060 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45  led || flags&(ME
17070 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
17080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
17090 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d  m->n>=0 );.  n =
170a0 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20   (u32)pMem->n;. 
170b0 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
170c0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
170d0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
170e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 28  .  }.  return ((
170f0 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
17100 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
17110 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
17120 73 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c  sizes for serial
17130 20 74 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e   types less than
17140 20 31 32 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f   12.*/.static co
17150 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d  nst u8 sqlite3Sm
17160 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d  allTypeSizes[] =
17170 20 7b 0a 20 20 30 2c 20 31 2c 20 32 2c 20 33 2c   {.  0, 1, 2, 3,
17180 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
17190 30 2c 20 30 2c 20 30 0a 7d 3b 0a 0a 2f 2a 0a 2a  0, 0, 0.};../*.*
171a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
171b0 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
171c0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
171d0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
171e0 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
171f0 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
17200 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
17210 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
17220 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
17230 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  12 ){.    return
17240 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
17250 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
17260 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
17270 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
17280 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
17290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
172a0 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
172b0 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
172c0 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
172d0 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
172e0 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
172f0 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
17300 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
17310 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
17320 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
17330 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
17340 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
17350 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
17360 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
17370 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
17380 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
17390 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
173a0 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
173b0 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
173c0 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
173d0 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
173e0 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
173f0 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
17400 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
17410 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
17420 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
17430 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
17440 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
17450 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
17460 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
17470 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
17480 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
17490 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
174a0 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
174b0 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
174c0 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
174d0 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
174e0 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
174f0 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
17500 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
17510 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
17520 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
17530 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
17540 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
17550 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
17560 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
17570 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
17580 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
17590 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
175a0 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
175b0 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
175c0 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
175d0 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
175e0 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
175f0 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
17600 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
17610 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
17620 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
17630 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
17640 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
17650 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
17660 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
17670 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
17680 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
17690 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
176a0 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
176b0 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
176c0 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
176d0 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
176e0 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
176f0 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
17700 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
17710 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
17720 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
17730 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
17740 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
17750 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
17760 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
17770 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
17780 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
17790 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
177a0 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
177b0 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
177c0 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
177d0 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
177e0 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
177f0 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
17800 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
17810 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
17820 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
17830 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
17840 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
17850 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
17860 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
17870 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
17880 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
17890 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
178a0 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
178b0 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
178c0 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
178d0 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
178e0 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
178f0 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
17900 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
17910 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
17920 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
17930 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
17940 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
17950 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
17960 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
17970 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
17980 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
17990 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
179a0 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
179b0 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
179c0 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
179d0 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
179e0 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
179f0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
17a00 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
17a10 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
17a20 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
17a30 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
17a40 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
17a50 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
17a60 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
17a70 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
17a80 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
17a90 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
17aa0 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
17ab0 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
17ac0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
17ad0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
17ae0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
17af0 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
17b00 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
17b10 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
17b20 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20   in buf[].  The 
17b30 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
17b40 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c  sible.** for all
17b50 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73  ocating enough s
17b60 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f  pace to buf[] to
17b70 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
17b80 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76   field, exclusiv
17b90 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d  e.** of the pMem
17ba0 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20  ->u.nZero bytes 
17bb0 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76  for a MEM_Zero v
17bc0 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  alue..**.** Retu
17bd0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17be0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
17bf0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
17c00 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
17c10 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
17c20 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
17c30 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
17c40 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
17c50 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
17c60 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
17c70 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
17c80 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33  .*/ .u32 sqlite3
17c90 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
17ca0 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   *buf, Mem *pMem
17cb0 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  , u32 serial_typ
17cc0 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a  e){.  u32 len;..
17cd0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64    /* Integer and
17ce0 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73   Real */.  if( s
17cf0 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26  erial_type<=7 &&
17d00 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29   serial_type>0 )
17d10 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20  {.    u64 v;.   
17d20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20   u32 i;.    if( 
17d30 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
17d40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17d50 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f  sizeof(v)==sizeo
17d60 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a  f(pMem->u.r) );.
17d70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c        memcpy(&v,
17d80 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a   &pMem->u.r, siz
17d90 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73  eof(v));.      s
17da0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
17db0 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  oat(v);.    }els
17dc0 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65  e{.      v = pMe
17dd0 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20  m->u.i;.    }.  
17de0 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69    len = i = sqli
17df0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
17e00 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  s[serial_type];.
17e10 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
17e20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
17e30 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29   buf[--i] = (u8)
17e40 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
17e50 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68  v >>= 8;.    }wh
17e60 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65  ile( i );.    re
17e70 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
17e80 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
17e90 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
17ea0 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
17eb0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
17ec0 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
17ed0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
17ee0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
17f00 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65  (int)sqlite3Vdbe
17f10 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
17f20 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
17f30 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
17f40 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
17f50 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
17f60 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
17f70 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f    }..  /* NULL o
17f80 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72  r constants 0 or
17f90 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30   1 */.  return 0
17fa0 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78  ;.}../* Input "x
17fb0 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20  " is a sequence 
17fc0 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  of unsigned char
17fd0 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72  acters that repr
17fe0 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65  esent a.** big-e
17ff0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  ndian integer.  
18000 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76  Return the equiv
18010 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74  alent native int
18020 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  eger.*/.#define 
18030 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  ONE_BYTE_INT(x) 
18040 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a     ((i8)(x)[0]).
18050 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45  #define TWO_BYTE
18060 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a  _INT(x)    (256*
18070 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29  (i8)((x)[0])|(x)
18080 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52  [1]).#define THR
18090 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  EE_BYTE_INT(x)  
180a0 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b  (65536*(i8)((x)[
180b0 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c  0])|((x)[1]<<8)|
180c0 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[2]).#define 
180d0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78  FOUR_BYTE_UINT(x
180e0 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d  )  (((u32)(x)[0]
180f0 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  <<24)|((x)[1]<<1
18100 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
18110 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[3]).#define F
18120 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  OUR_BYTE_INT(x) 
18130 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28  (16777216*(i8)((
18140 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c  x)[0])|((x)[1]<<
18150 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
18160 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44  (x)[3])../*.** D
18170 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64  eserialize the d
18180 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64  ata blob pointed
18190 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65   to by buf as se
181a0 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c  rial type serial
181b0 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f  _type.** and sto
181c0 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
181d0 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74   pMem.  Return t
181e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
181f0 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  es read..**.** T
18200 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18210 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74  implemented as t
18220 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74  wo separate rout
18230 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d  ines for perform
18240 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77  ance..** The few
18250 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75   cases that requ
18260 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  ire local variab
18270 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f  les are broken o
18280 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61  ut into a separa
18290 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f  te.** routine so
182a0 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61   that in most ca
182b0 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64  ses the overhead
182c0 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73   of moving the s
182d0 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  tack pointer.** 
182e0 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a  is avoided..*/ .
182f0 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54  static u32 SQLIT
18300 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61  E_NOINLINE seria
18310 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
18320 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
18330 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
18340 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
18350 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
18360 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
18370 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
18380 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
18390 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
183a0 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
183b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
183c0 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
183d0 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
183e0 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f  .  u64 x = FOUR_
183f0 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a  BYTE_UINT(buf);.
18400 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42    u32 y = FOUR_B
18410 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b  YTE_UINT(buf+4);
18420 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b  .  x = (x<<32) +
18430 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c   y;.  if( serial
18440 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
18450 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18460 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61  R-29851-52272 Va
18470 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
18480 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a  ian 64-bit.    *
18490 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
184a0 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
184b0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
184c0 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65  i64*)&x;.    pMe
184d0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
184e0 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  nt;.    testcase
184f0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
18500 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
18510 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18520 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75  57343-49114 Valu
18530 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
18540 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20  n IEEE 754-2008 
18550 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c  64-bit.    ** fl
18560 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d  oating point num
18570 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66  ber. */.#if !def
18580 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
18590 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
185a0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
185b0 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69  INT).    /* Veri
185c0 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
185d0 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
185e0 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
185f0 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62  he same.    ** b
18600 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
18610 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
18620 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
18630 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a  T_FLOAT is.    *
18640 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
18650 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
18660 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
18670 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
18680 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20   ** endian..    
18690 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
186a0 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75  nst u64 t1 = ((u
186b0 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c  64)0x3ff00000)<<
186c0 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  32;.    static c
186d0 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
186e0 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32   1.0;.    u64 t2
186f0 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d   = t1;.    swapM
18700 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
18710 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t2);.    assert(
18720 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
18730 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
18740 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
18750 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
18760 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
18770 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
18780 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e   sizeof(pMem->u.
18790 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61  r)==8 );.    swa
187a0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
187b0 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  t(x);.    memcpy
187c0 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c  (&pMem->u.r, &x,
187d0 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
187e0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73   pMem->flags = s
187f0 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d  qlite3IsNaN(pMem
18800 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c  ->u.r) ? MEM_Nul
18810 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  l : MEM_Real;.  
18820 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a  }.  return 8;.}.
18830 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
18840 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
18850 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
18860 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
18870 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
18880 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
18890 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
188a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
188b0 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
188c0 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
188d0 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
188e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
188f0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
18900 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
18910 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
18920 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
18930 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
18940 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
18950 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
18960 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
18970 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
18980 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
18990 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a   0: {  /* Null *
189a0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
189b0 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d  NCE-OF: R-24078-
189c0 30 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61  09375 Value is a
189d0 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20   NULL. */.      
189e0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
189f0 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
18a00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
18a10 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f  ase 1: {.      /
18a20 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18a30 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c  -44885-25196 Val
18a40 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74  ue is an 8-bit t
18a50 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20  wos-complement. 
18a60 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
18a70 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
18a80 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49  u.i = ONE_BYTE_I
18a90 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
18aa0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
18ab0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
18ac0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
18ad0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
18ae0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
18af0 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
18b00 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
18b10 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
18b20 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37  IDENCE-OF: R-497
18b30 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69  94-35026 Value i
18b40 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31  s a big-endian 1
18b50 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  6-bit.      ** t
18b60 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
18b70 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
18b80 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f   pMem->u.i = TWO
18b90 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
18ba0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
18bb0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
18bc0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
18bd0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
18be0 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
18bf0 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
18c00 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
18c10 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
18c20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
18c30 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20  : R-37839-54301 
18c40 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
18c50 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20  ndian 24-bit.   
18c60 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
18c70 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
18c80 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
18c90 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  i = THREE_BYTE_I
18ca0 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
18cb0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
18cc0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
18cd0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
18ce0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
18cf0 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 3;.    }.    c
18d00 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
18d10 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
18d20 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
18d30 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38  IDENCE-OF: R-018
18d40 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69  49-26079 Value i
18d50 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33  s a big-endian 3
18d60 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  2-bit.      ** t
18d70 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
18d80 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
18d90 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
18da0 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  R_BYTE_INT(buf);
18db0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
18dc0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
18dd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
18de0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
18df0 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
18e00 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
18e10 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
18e20 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
18e30 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18e40 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34  F: R-50385-09674
18e50 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
18e60 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20  endian 48-bit.  
18e70 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
18e80 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
18e90 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
18ea0 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55  .i = FOUR_BYTE_U
18eb0 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28  INT(buf+2) + (((
18ec0 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
18ed0 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
18ee0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
18ef0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
18f00 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
18f10 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
18f20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
18f30 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
18f40 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
18f50 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
18f60 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
18f70 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
18f80 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  */.      /* Thes
18f90 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69  e use local vari
18fa0 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65  ables, so do the
18fb0 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20  m in a separate 
18fc0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
18fd0 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67   to avoid having
18fe0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61   to move the fra
18ff0 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  me pointer in th
19000 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
19010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65  .      return se
19020 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69  rialGet(buf,seri
19030 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20  al_type,pMem);. 
19040 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
19050 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
19060 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
19070 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
19080 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
19090 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36  ENCE-OF: R-12976
190a0 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20  -22893 Value is 
190b0 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a  the integer 0. *
190c0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
190d0 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d  NCE-OF: R-18143-
190e0 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74  12121 Value is t
190f0 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f  he integer 1. */
19100 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
19110 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
19120 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
19130 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19140 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
19150 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
19160 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
19170 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30  DENCE-OF: R-1460
19180 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73  6-31564 Value is
19190 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20   a BLOB that is 
191a0 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69  (N-12)/2 bytes i
191b0 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74  n.      ** lengt
191c0 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  h..      ** EVID
191d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31  ENCE-OF: R-28401
191e0 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20  -00140 Value is 
191f0 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  a string in the 
19200 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e  text encoding an
19210 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33  d.      ** (N-13
19220 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e  )/2 bytes in len
19230 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74  gth. */.      st
19240 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61  atic const u16 a
19250 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42  Flag[] = { MEM_B
19260 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d  lob|MEM_Ephem, M
19270 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Str|MEM_Ephem
19280 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   };.      pMem->
19290 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
192a0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
192b0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
192c0 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
192d0 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73  >flags = aFlag[s
192e0 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20  erial_type&1];. 
192f0 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d       return pMem
19300 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ->n;.    }.  }. 
19310 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a   return 0;.}./*.
19320 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19330 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
19340 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ate sufficient s
19350 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61  pace for an Unpa
19360 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
19370 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e  ructure large en
19380 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20  ough to be used 
19390 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65  with sqlite3Vdbe
193a0 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69  RecordUnpack() i
193b0 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  f.** the first a
193c0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
193d0 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20  nter to KeyInfo 
193e0 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e  structure pKeyIn
193f0 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70  fo..**.** The sp
19400 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c  ace is either al
19410 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
19420 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
19430 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69  () or from withi
19440 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e  n.** the unalign
19450 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ed buffer passed
19460 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20   via the second 
19470 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65  and third argume
19480 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a  nts (presumably.
19490 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e  ** stack space).
194a0 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20   If the former, 
194b0 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20  then *ppFree is 
194c0 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  set to a pointer
194d0 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
194e0 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
194f0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
19500 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  r using sqlite3D
19510 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20  bFree(). Or, if 
19520 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  the .** allocati
19530 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  on comes from th
19540 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65  e pSpace/szSpace
19550 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65   buffer, *ppFree
19560 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
19570 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
19580 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
19590 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
195a0 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
195b0 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64  ned..*/.Unpacked
195c0 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
195d0 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
195e0 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66  Record(.  KeyInf
195f0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
19600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
19610 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
19620 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72  record */.  char
19630 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20   *pSpace,       
19640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
19650 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61  naligned space a
19660 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  vailable */.  in
19670 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20  t szSpace,      
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19690 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b   Size of pSpace[
196a0 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
196b0 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20  char **ppFree   
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196d0 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73  /* OUT: Caller s
196e0 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20  hould free this 
196f0 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  pointer */.){.  
19700 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
19710 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
19720 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f  /* Unpacked reco
19730 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  rd to return */.
19740 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20    int nOff;     
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19760 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70    /* Increment p
19770 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f  Space by nOff to
19780 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69   align it */.  i
19790 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
197b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
197c0 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a  s required for *
197d0 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61  p */..  /* We wa
197e0 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20  nt to shift the 
197f0 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75  pointer pSpace u
19800 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69  p such that it i
19810 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 8-byte aligned
19820 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20  ..  ** Thus, we 
19830 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74  need to calculat
19840 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c  e a value, nOff,
19850 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37   between 0 and 7
19860 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a  , to shift .  **
19870 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61   it by.  If pSpa
19880 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d  ce is already 8-
19890 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f  byte aligned, nO
198a0 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72  ff should be zer
198b0 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d  o..  */.  nOff =
198c0 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54   (8 - (SQLITE_PT
198d0 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29  R_TO_INT(pSpace)
198e0 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42   & 7)) & 7;.  nB
198f0 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
19900 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
19910 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
19920 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
19930 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e  ield+1);.  if( n
19940 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66  Byte>szSpace+nOf
19950 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  f ){.    p = (Un
19960 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73  packedRecord *)s
19970 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
19980 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
19990 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46  nByte);.    *ppF
199a0 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b  ree = (char *)p;
199b0 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65  .    if( !p ) re
199c0 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
199d0 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  .    p = (Unpack
199e0 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63  edRecord*)&pSpac
199f0 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70  e[nOff];.    *pp
19a00 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Free = 0;.  }.. 
19a10 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
19a20 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
19a30 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
19a40 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
19a50 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
19a60 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
19a70 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  );.  p->pKeyInfo
19a80 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
19a90 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
19aa0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b  nfo->nField + 1;
19ab0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
19ac0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
19ad0 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69  nKey-byte encodi
19ae0 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69  ng of a record i
19af0 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61  n pKey[], popula
19b00 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63  te the .** Unpac
19b10 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
19b20 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  ure indicated by
19b30 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
19b40 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a  ment with the.**
19b50 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
19b60 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e   decoded record.
19b70 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
19b80 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
19b90 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  k(.  KeyInfo *pK
19ba0 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49  eyInfo,     /* I
19bb0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
19bc0 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
19bd0 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  at */.  int nKey
19be0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
19bf0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69  * Size of the bi
19c00 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
19c10 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
19c20 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  y,      /* The b
19c30 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
19c40 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
19c50 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75   *p      /* Popu
19c60 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74  late this struct
19c70 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ure before retur
19c80 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ning. */.){.  co
19c90 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
19ca0 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
19cb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19cc0 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20  )pKey;.  int d; 
19cd0 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20  .  u32 idx;     
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
19d00 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66  aKey[] to read f
19d10 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20  rom */.  u16 u; 
19d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d30 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
19d40 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
19d50 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  r */.  u32 szHdr
19d60 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  ;.  Mem *pMem = 
19d70 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64  p->aMem;..  p->d
19d80 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20  efault_rc = 0;. 
19d90 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
19da0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d  YTE_ALIGNMENT(pM
19db0 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67  em) );.  idx = g
19dc0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
19dd0 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73   szHdr);.  d = s
19de0 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20  zHdr;.  u = 0;. 
19df0 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
19e00 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a  r && d<=nKey ){.
19e10 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
19e20 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d  ype;..    idx +=
19e30 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
19e40 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f  ey[idx], serial_
19e50 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  type);.    pMem-
19e60 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  >enc = pKeyInfo-
19e70 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  >enc;.    pMem->
19e80 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
19e90 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e  b;.    /* pMem->
19ea0 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71  flags = 0; // sq
19eb0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
19ec0 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68  et() will set th
19ed0 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  is for us */.   
19ee0 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20   pMem->szMalloc 
19ef0 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
19f00 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
19f10 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
19f20 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
19f30 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
19f40 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e   if( (++u)>=p->n
19f50 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20  Field ) break;. 
19f60 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d   }.  assert( u<=
19f70 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
19f80 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
19f90 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20  eld = u;.}..#if 
19fa0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
19fb0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
19fc0 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e   compares two in
19fd0 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63  dex or table rec
19fe0 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ord keys in the 
19ff0 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74  same way.** as t
1a000 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1a010 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f  cordCompare() ro
1a020 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64  utine. Unlike Vd
1a030 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1a040 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1a050 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
1a060 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61   and compares va
1a070 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a  lues using the.*
1a080 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1a090 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c  ialGet() and sql
1a0a0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
1a0b0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69   functions. It i
1a0c0 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73  s used.** in ass
1a0d0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1a0e0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1a0f0 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f  the optimized co
1a100 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  de in.** sqlite3
1a110 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1a120 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75  e() returns resu
1a130 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74  lts with these t
1a140 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a  wo primitives..*
1a150 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1a160 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f   if the result o
1a170 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
1a180 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65  equivalent to de
1a190 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20  siredResult..** 
1a1a0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
1a1b0 74 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67  there is a disag
1a1c0 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  reement..*/.stat
1a1d0 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1a1e0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20  dCompareDebug(. 
1a1f0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1a200 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1a210 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1a220 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
1a230 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a  cord *pPKey2, /*
1a240 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1a250 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c  int desiredResul
1a260 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1a270 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   Correct answer 
1a280 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1a290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1a2a0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1a2b0 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1a2c0 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
1a2d0 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dx1;          /*
1a2e0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1a2f0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
1a300 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
1a310 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1a320 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a330 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
1a340 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
1a350 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
1a360 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1a370 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1a380 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1a390 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
1a3a0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1a3b0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
1a3c0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
1a3d0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66  ->pKeyInfo;.  if
1a3e0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ( pKeyInfo->db==
1a3f0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1a400 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
1a410 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
1a420 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1a430 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
1a440 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
1a450 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
1a460 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
1a470 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
1a480 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1a490 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1a4a0 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1a4b0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1a4c0 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
1a4d0 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
1a4e0 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
1a4f0 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
1a500 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
1a510 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
1a520 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
1a530 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
1a540 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
1a550 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
1a560 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
1a570 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
1a580 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
1a590 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
1a5a0 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
1a5b0 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
1a5c0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
1a5d0 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
1a5e0 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
1a5f0 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
1a600 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
1a610 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
1a620 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
1a630 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
1a640 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
1a650 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
1a660 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
1a670 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
1a680 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
1a690 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
1a6a0 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
1a6b0 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
1a6c0 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
1a6d0 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
1a6e0 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
1a6f0 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
1a700 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33    if( szHdr1>983
1a710 30 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  07 ) return SQLI
1a720 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31  TE_CORRUPT;.  d1
1a730 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73   = szHdr1;.  ass
1a740 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1a750 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e  Field+pKeyInfo->
1a760 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
1a770 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55  >nField || CORRU
1a780 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
1a790 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1a7a0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1a7b0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1a7c0 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  ->nField>0 );.  
1a7d0 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1a7e0 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1a7f0 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1a800 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
1a810 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
1a820 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
1a830 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
1a840 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
1a850 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
1a860 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
1a870 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
1a880 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f  _type1 );..    /
1a890 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1a8a0 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65  ere is enough ke
1a8b0 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e  y space remainin
1a8c0 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a  g to avoid.    *
1a8d0 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72  * a buffer overr
1a8e0 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65  ead.  The "d1+se
1a8f0 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75  rial_type1+2" su
1a900 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c  bexpression will
1a910 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62  .    ** always b
1a920 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
1a930 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
1a940 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65  mount of require
1a950 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20  d key space..   
1a960 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70   ** Use that app
1a970 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76  roximation to av
1a980 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70  oid the more exp
1a990 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20  ensive call to. 
1a9a0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
1a9b0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
1a9c0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1a9d0 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1a9e0 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79  if( d1+serial_ty
1a9f0 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31  pe1+2>(u32)nKey1
1aa00 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69  .     && d1+sqli
1aa10 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1aa20 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1aa30 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20  1)>(u32)nKey1 . 
1aa40 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
1aa50 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1aa60 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1aa70 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
1aa80 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
1aa90 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
1aaa0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1aab0 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1aac0 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
1aad0 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
1aae0 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
1aaf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
1ab00 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
1ab10 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
1ab20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1ab30 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
1ab40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
1ab50 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1ab60 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1ab70 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1ab80 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  /.      if( pKey
1ab90 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1aba0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
1abb0 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76  c = -rc;  /* Inv
1abc0 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66  ert the result f
1abd0 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64  or DESC sort ord
1abe0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  er. */.      }. 
1abf0 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43       goto debugC
1ac00 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d  ompareEnd;.    }
1ac10 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69  .    i++;.  }whi
1ac20 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
1ac30 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
1ac40 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  eld );..  /* No 
1ac50 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1ac60 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1ac70 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1ac80 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1ac90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1aca0 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1acb0 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1acc0 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1acd0 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1ace0 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1acf0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1ad00 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a  Release(&mem1)..
1ad10 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
1ad20 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1ad30 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
1ad40 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
1ad50 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
1ad60 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
1ad70 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
1ad80 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
1ad90 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
1ada0 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
1adb0 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
1adc0 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63   value.  */.  rc
1add0 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1ade0 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d  lt_rc;..debugCom
1adf0 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64  pareEnd:.  if( d
1ae00 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20  esiredResult==0 
1ae10 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72  && rc==0 ) retur
1ae20 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72  n 1;.  if( desir
1ae30 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63  edResult<0 && rc
1ae40 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
1ae50 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1ae60 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72  lt>0 && rc>0 ) r
1ae70 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43  eturn 1;.  if( C
1ae80 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
1ae90 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79  rn 1;.  if( pKey
1aea0 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1aeb0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
1aec0 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
1aed0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1aee0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1aef0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
1af00 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e   of fields (a.k.
1af10 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74  a. columns) in t
1af20 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20  he record given 
1af30 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e  by.** pKey,nKey.
1af40 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61    The verify tha
1af50 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20  t this count is 
1af60 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1af70 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d  al to the.** lim
1af80 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79  it given by pKey
1af90 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70  Info->nField + p
1afa0 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1afb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
1afc0 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f  constraint is no
1afd0 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20  t satisfied, it 
1afe0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68  means that the h
1aff0 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62  igh-speed.** vdb
1b000 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1b010 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f  t() and vdbeReco
1b020 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1b030 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a  ) routines will.
1b040 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ** not work corr
1b050 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20  ectly.  If this 
1b060 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69  assert() ever fi
1b070 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79  res, it probably
1b080 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74   means.** that t
1b090 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c  he KeyInfo.nFiel
1b0a0 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46  d or KeyInfo.nXF
1b0b0 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65  ield values were
1b0c0 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63   computed.** inc
1b0d0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
1b0e0 74 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73  tic void vdbeAss
1b0f0 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1b100 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74  hinLimits(.  int
1b110 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69   nKey, const voi
1b120 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68  d *pKey,   /* Th
1b130 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69  e record to veri
1b140 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b  fy */ .  const K
1b150 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1b160 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
1b170 65 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73  e size with this
1b180 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20   KeyInfo */.){. 
1b190 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b   int nField = 0;
1b1a0 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
1b1b0 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e  u32 idx;.  u32 n
1b1c0 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20  otUsed;.  const 
1b1d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1b1e0 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  Key = (const uns
1b1f0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79  igned char*)pKey
1b200 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ;..  if( CORRUPT
1b210 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  _DB ) return;.  
1b220 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
1b230 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
1b240 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d    assert( nKey>=
1b250 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
1b260 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20  zHdr<=(u32)nKey 
1b270 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  );.  while( idx<
1b280 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78  szHdr ){.    idx
1b290 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1b2a0 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65  aKey+idx, notUse
1b2b0 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b  d);.    nField++
1b2c0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1b2d0 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e  nField <= pKeyIn
1b2e0 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49  fo->nField+pKeyI
1b2f0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a  nfo->nXField );.
1b300 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1b310 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1b320 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1b330 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a  s(A,B,C).#endif.
1b340 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65  ./*.** Both *pMe
1b350 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f  m1 and *pMem2 co
1b360 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c  ntain string val
1b370 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65  ues. Compare the
1b380 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75   two values.** u
1b390 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1b3a0 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
1b3b0 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74  l. As usual, ret
1b3c0 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c  urn a negative ,
1b3d0 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1b3e0 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70  tive value if *p
1b3f0 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1b400 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67  n, equal to or g
1b410 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20  reater than .** 
1b420 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69  *pMem2, respecti
1b430 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e  vely. Similar in
1b440 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d   spirit to "rc =
1b450 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d   (*pMem1) - (*pM
1b460 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69  em2);"..*/.stati
1b470 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72  c int vdbeCompar
1b480 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f  eMemString(.  co
1b490 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a  nst Mem *pMem1,.
1b4a0 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1b4b0 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c  m2,.  const Coll
1b4c0 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38  Seq *pColl,.  u8
1b4d0 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20   *prcErr        
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b4f0 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72   If an OOM occur
1b500 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  s, set to SQLITE
1b510 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69  _NOMEM */.){.  i
1b520 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  f( pMem1->enc==p
1b530 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
1b540 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20   /* The strings 
1b550 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74  are already in t
1b560 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64  he correct encod
1b570 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20  ing.  Call the. 
1b580 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
1b590 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63  n function direc
1b5a0 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tly */.    retur
1b5b0 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  n pColl->xCmp(pC
1b5c0 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31  oll->pUser,pMem1
1b5d0 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65  ->n,pMem1->z,pMe
1b5e0 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b  m2->n,pMem2->z);
1b5f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1b600 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20  t rc;.    const 
1b610 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20  void *v1, *v2;. 
1b620 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20     int n1, n2;. 
1b630 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d     Mem c1;.    M
1b640 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74  em c2;.    sqlit
1b650 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63  e3VdbeMemInit(&c
1b660 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45  1, pMem1->db, ME
1b670 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  M_Null);.    sql
1b680 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1b690 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c2, pMem1->db, 
1b6a0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1b6b0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
1b6c0 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d  llowCopy(&c1, pM
1b6d0 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em1, MEM_Ephem);
1b6e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b6f0 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1b700 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45  c2, pMem2, MEM_E
1b710 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20  phem);.    v1 = 
1b720 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1b730 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1b740 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c1, pColl->enc
1b750 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d  );.    n1 = v1==
1b760 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20  0 ? 0 : c1.n;.  
1b770 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61    v2 = sqlite3Va
1b780 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1b790 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f  _value*)&c2, pCo
1b7a0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32  ll->enc);.    n2
1b7b0 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63   = v2==0 ? 0 : c
1b7c0 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43  2.n;.    rc = pC
1b7d0 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1b7e0 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20  >pUser, n1, v1, 
1b7f0 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73 71 6c  n2, v2);.    sql
1b800 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1b810 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c  se(&c1);.    sql
1b820 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1b830 73 65 28 26 63 32 29 3b 0a 20 20 20 20 69 66 28  se(&c2);.    if(
1b840 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30   (v1==0 || v2==0
1b850 29 20 26 26 20 70 72 63 45 72 72 20 29 20 2a 70  ) && prcErr ) *p
1b860 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e  rcErr = SQLITE_N
1b870 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e  OMEM;.    return
1b880 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   rc;.  }.}../*.*
1b890 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c  * Compare two bl
1b8a0 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67  obs.  Return neg
1b8b0 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
1b8c0 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
1b8d0 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73  first.** is less
1b8e0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
1b8f0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1b900 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73   the second, res
1b910 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66  pectively..** If
1b920 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70   one blob is a p
1b930 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68  refix of the oth
1b940 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f  er, then the sho
1b950 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73  rter is the less
1b960 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  or..*/.static SQ
1b970 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
1b980 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  t sqlite3BlobCom
1b990 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1b9a0 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  pB1, const Mem *
1b9b0 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 20 3d 20  pB2){.  int c = 
1b9c0 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70  memcmp(pB1->z, p
1b9d0 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70 42  B2->z, pB1->n>pB
1b9e0 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a 20  2->n ? pB2->n : 
1b9f0 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 63  pB1->n);.  if( c
1ba00 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72   ) return c;.  r
1ba10 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d 20 70  eturn pB1->n - p
1ba20 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  B2->n;.}.../*.**
1ba30 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
1ba40 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79  ues contained by
1ba50 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20   the two memory 
1ba60 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67  cells, returning
1ba70 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  .** negative, ze
1ba80 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ro or positive i
1ba90 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20  f pMem1 is less 
1baa0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1bab0 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68  or greater.** th
1bac0 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e  an pMem2. Sortin
1bad0 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27  g order is NULL'
1bae0 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65  s first, followe
1baf0 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e  d by numbers (in
1bb00 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65  tegers.** and re
1bb10 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65  als) sorted nume
1bb20 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65  rically, followe
1bb30 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65  d by text ordere
1bb40 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69  d by the collati
1bb50 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70  ng.** sequence p
1bb60 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79  Coll and finally
1bb70 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20   blob's ordered 
1bb80 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a  by memcmp()..**.
1bb90 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75  ** Two NULL valu
1bba0 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1bbb0 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20  d equal by this 
1bbc0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1bbd0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1bbe0 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  re(const Mem *pM
1bbf0 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  em1, const Mem *
1bc00 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c  pMem2, const Col
1bc10 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
1bc20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e  int f1, f2;.  in
1bc30 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  t combined_flags
1bc40 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d  ;..  f1 = pMem1-
1bc50 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70  >flags;.  f2 = p
1bc60 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63  Mem2->flags;.  c
1bc70 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20  ombined_flags = 
1bc80 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28  f1|f2;.  assert(
1bc90 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73   (combined_flags
1bca0 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
1bcb0 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f  0 );. .  /* If o
1bcc0 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  ne value is NULL
1bcd0 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  , it is less tha
1bce0 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20  n the other. If 
1bcf0 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a  both values.  **
1bd00 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72   are NULL, retur
1bd10 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
1bd20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
1bd30 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
1bd40 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75  eturn (f2&MEM_Nu
1bd50 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75  ll) - (f1&MEM_Nu
1bd60 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ll);.  }..  /* I
1bd70 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
1bd80 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
1bd90 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20 74 68  other is not, th
1bda0 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e number is less
1bdb0 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61  ..  ** If both a
1bdc0 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d 70  re numbers, comp
1bdd0 61 72 65 20 61 73 20 72 65 61 6c 73 20 69 66 20  are as reals if 
1bde0 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c 20 6f  one is a real, o
1bdf0 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a 20 20  r as integers.  
1be00 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c 75 65  ** if both value
1be10 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e 0a  s are integers..
1be20 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1be30 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49  ned_flags&(MEM_I
1be40 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a  nt|MEM_Real) ){.
1be50 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20 72      double r1, r
1be60 32 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  2;.    if( (f1 &
1be70 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d   f2 & MEM_Int)!=
1be80 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1be90 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d  Mem1->u.i < pMem
1bea0 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
1beb0 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  -1;.      if( pM
1bec0 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32  em1->u.i > pMem2
1bed0 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 31  ->u.i ) return 1
1bee0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1bef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1bf00 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f1&MEM_Real)!=0
1bf10 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 70   ){.      r1 = p
1bf20 4d 65 6d 31 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d  Mem1->u.r;.    }
1bf30 65 6c 73 65 20 69 66 28 20 28 66 31 26 4d 45 4d  else if( (f1&MEM
1bf40 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1bf50 20 20 72 31 20 3d 20 28 64 6f 75 62 6c 65 29 70    r1 = (double)p
1bf60 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  Mem1->u.i;.    }
1bf70 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1bf80 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1bf90 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c  if( (f2&MEM_Real
1bfa0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32  )!=0 ){.      r2
1bfb0 20 3d 20 70 4d 65 6d 32 2d 3e 75 2e 72 3b 0a 20   = pMem2->u.r;. 
1bfc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 32     }else if( (f2
1bfd0 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1bfe0 20 20 20 20 20 20 72 32 20 3d 20 28 64 6f 75 62        r2 = (doub
1bff0 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20  le)pMem2->u.i;. 
1c000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c010 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
1c020 0a 20 20 20 20 69 66 28 20 72 31 3c 72 32 20 29  .    if( r1<r2 )
1c030 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1c040 69 66 28 20 72 31 3e 72 32 20 29 20 72 65 74 75  if( r1>r2 ) retu
1c050 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 1;.    return
1c060 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   0;.  }..  /* If
1c070 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20   one value is a 
1c080 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f  string and the o
1c090 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20  ther is a blob, 
1c0a0 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65  the string is le
1c0b0 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68  ss..  ** If both
1c0c0 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f   are strings, co
1c0d0 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20  mpare using the 
1c0e0 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
1c0f0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
1c100 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
1c110 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66  EM_Str ){.    if
1c120 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29  ( (f1 & MEM_Str)
1c130 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1c140 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1c150 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53   if( (f2 & MEM_S
1c160 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr)==0 ){.      
1c170 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
1c180 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ..    assert( pM
1c190 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d  em1->enc==pMem2-
1c1a0 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65  >enc );.    asse
1c1b0 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  rt( pMem1->enc==
1c1c0 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a  SQLITE_UTF8 || .
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d              pMem
1c1e0 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1c1f0 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d  TF16LE || pMem1-
1c200 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
1c210 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  16BE );..    /* 
1c220 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  The collation se
1c230 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64  quence must be d
1c240 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70  efined at this p
1c250 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20  oint, even if.  
1c260 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65    ** the user de
1c270 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74  letes the collat
1c280 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74  ion sequence aft
1c290 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  er the vdbe prog
1c2a0 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f  ram is.    ** co
1c2b0 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73  mpiled (this was
1c2c0 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20   not always the 
1c2d0 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  case)..    */.  
1c2e0 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c    assert( !pColl
1c2f0 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   || pColl->xCmp 
1c300 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  );..    if( pCol
1c310 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  l ){.      retur
1c320 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  n vdbeCompareMem
1c330 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d  String(pMem1, pM
1c340 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a  em2, pColl, 0);.
1c350 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20      }.    /* If 
1c360 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77  a NULL pointer w
1c370 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  as passed as the
1c380 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f   collate functio
1c390 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a  n, fall through.
1c3a0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c      ** to the bl
1c3b0 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20  ob case and use 
1c3c0 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20  memcmp().  */.  
1c3d0 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61  }. .  /* Both va
1c3e0 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f  lues must be blo
1c3f0 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69  bs.  Compare usi
1c400 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f  ng memcmp().  */
1c410 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1c420 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65  3BlobCompare(pMe
1c430 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a  m1, pMem2);.}...
1c440 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
1c450 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
1c460 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1c470 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70   is a serial-typ
1c480 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73  e that.** corres
1c490 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65  ponds to an inte
1c4a0 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73  ger - all values
1c4b0 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39   between 1 and 9
1c4c0 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65   inclusive .** e
1c4d0 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63  xcept 7. The sec
1c4e0 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ond points to a 
1c4f0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
1c500 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  g an integer val
1c510 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64  ue.** serialized
1c520 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65   according to se
1c530 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20  rial_type. This 
1c540 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
1c550 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74  lizes.** and ret
1c560 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a  urns the value..
1c570 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64  */.static i64 vd
1c580 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
1c590 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  t(u32 serial_typ
1c5a0 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  e, const u8 *aKe
1c5b0 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61  y){.  u32 y;.  a
1c5c0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1c5d0 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  B || (serial_typ
1c5e0 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74  e>=1 && serial_t
1c5f0 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c  ype<=9 && serial
1c600 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73  _type!=7) );.  s
1c610 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
1c620 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30  pe ){.    case 0
1c630 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20  :.    case 1:.  
1c640 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1c650 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1c660 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42      return ONE_B
1c670 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1c680 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20     case 2:.     
1c690 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1c6a0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1c6b0 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45   return TWO_BYTE
1c6c0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1c6d0 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65  case 3:.      te
1c6e0 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1c6f0 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1c700 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f  turn THREE_BYTE_
1c710 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1c720 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74  ase 4: {.      t
1c730 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1c740 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79  &0x80 );.      y
1c750 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1c760 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72  T(aKey);.      r
1c770 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74  eturn (i64)*(int
1c780 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *)&y;.    }.    
1c790 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20  case 5: {.      
1c7a0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1c7b0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1c7c0 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45  return FOUR_BYTE
1c7d0 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20  _UINT(aKey+2) + 
1c7e0 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
1c7f0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1c800 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
1c810 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34  e 6: {.      u64
1c820 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
1c830 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1c840 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1c850 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1c860 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
1c870 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1c880 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74  ey+4);.      ret
1c890 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29  urn (i64)*(i64*)
1c8a0 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  &x;.    }.  }.. 
1c8b0 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
1c8c0 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a  type - 8);.}../*
1c8d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c8e0 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
1c8f0 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
1c900 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
1c910 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
1c920 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
1c930 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
1c940 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
1c950 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
1c960 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
1c970 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
1c980 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
1c990 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
1c9a0 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
1c9b0 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
1c9c0 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
1c9d0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
1c9e0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
1c9f0 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
1ca00 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a  .  The pPKey2.**
1ca10 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70   key must be a p
1ca20 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61  arsed key such a
1ca30 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
1ca40 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61  ** sqlite3VdbePa
1ca50 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  rseRecord..**.**
1ca60 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b   If argument bSk
1ca70 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
1ca80 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
1ca90 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1caa0 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74  s already.** det
1cab0 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
1cac0 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1cad0 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
1cae0 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20  ual..**.** Key1 
1caf0 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20  and Key2 do not 
1cb00 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  have to contain 
1cb10 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
1cb20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c  of fields. If al
1cb30 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61  l .** fields tha
1cb40 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68  t appear in both
1cb50 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c   keys are equal,
1cb60 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65   then pPKey2->de
1cb70 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20  fault_rc is .** 
1cb80 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1cb90 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  If database corr
1cba0 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76  uption is discov
1cbb0 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32  ered, set pPKey2
1cbc0 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a  ->errCode to .**
1cbd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1cbe0 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66  and return 0. If
1cbf0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73   an OOM error is
1cc00 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a   encountered, .*
1cc10 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  * pPKey2->errCod
1cc20 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  e is set to SQLI
1cc30 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66  TE_NOMEM and, if
1cc40 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c   it is not NULL,
1cc50 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66   the.** malloc-f
1cc60 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f  ailed flag set o
1cc70 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
1cc80 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  e (pPKey2->pKeyI
1cc90 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74  nfo->db)..*/.int
1cca0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1ccb0 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1ccc0 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  p(.  int nKey1, 
1ccd0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1cce0 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79  1,   /* Left key
1ccf0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1cd00 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20  cord *pPKey2,   
1cd10 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1cd20 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69  ey */.  int bSki
1cd30 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
1cd40 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
1cd50 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72  ue, skip the fir
1cd60 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20  st field */.){. 
1cd70 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1cda0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
1cdb0 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
1cdc0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cde0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78   /* Index of nex
1cdf0 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61  t field to compa
1ce00 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  re */.  u32 szHd
1ce10 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
1ce20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1ce30 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  of record header
1ce40 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1ce50 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ce70 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
1ce80 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72  t type in header
1ce90 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   */.  int rc = 0
1cea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ceb0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1cec0 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  value */.  Mem *
1ced0 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61  pRhs = pPKey2->a
1cee0 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  Mem;       /* Ne
1cef0 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  xt field of pPKe
1cf00 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  y2 to compare */
1cf10 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1cf20 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
1cf30 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74  KeyInfo;.  const
1cf40 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1cf50 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
1cf60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
1cf70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Key1;.  Mem mem1
1cf80 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70  ;..  /* If bSkip
1cf90 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
1cfa0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1cfb0 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64  ready determined
1cfc0 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a   that the first.
1cfd0 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74    ** two element
1cfe0 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72  s in the keys ar
1cff0 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65  e equal. Fix the
1d000 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76   various stack v
1d010 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a  ariables so.  **
1d020 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
1d030 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72  ne begins compar
1d040 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e  ing at the secon
1d050 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66  d field. */.  if
1d060 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75  ( bSkip ){.    u
1d070 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20  32 s1;.    idx1 
1d080 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33  = 1 + getVarint3
1d090 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29  2(&aKey1[1], s1)
1d0a0 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61  ;.    szHdr1 = a
1d0b0 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20  Key1[0];.    d1 
1d0c0 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74  = szHdr1 + sqlit
1d0d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1d0e0 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d  Len(s1);.    i =
1d0f0 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a   1;.    pRhs++;.
1d100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78    }else{.    idx
1d110 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
1d120 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
1d130 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b      d1 = szHdr1;
1d140 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73  .    if( d1>(uns
1d150 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a  igned)nKey1 ){ .
1d160 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
1d170 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
1d180 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1d190 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1d1a0 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1d1b0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  */.    }.    i =
1d1c0 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f   0;.  }..  VVA_O
1d1d0 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
1d1e0 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
1d1f0 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
1d200 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1d210 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  */.  assert( pPK
1d220 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1d230 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b  Field+pPKey2->pK
1d240 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e  eyInfo->nXField>
1d250 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  =pPKey2->nField 
1d260 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
1d270 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
1d280 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1d290 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1d2a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1d2b0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1d2c0 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  ->nField>0 );.  
1d2d0 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1d2e0 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1d2f0 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1d300 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
1d310 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1d320 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  an integer */.  
1d330 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67    if( pRhs->flag
1d340 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
1d350 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1d360 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1d370 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d380 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1d390 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1d3a0 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a  ial_type>=10 ){.
1d3b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1d3c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d3d0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
1d3e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d3f0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
1d400 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1d410 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  =7 ){.        do
1d420 75 62 6c 65 20 72 68 73 20 3d 20 28 64 6f 75 62  uble rhs = (doub
1d430 6c 65 29 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20  le)pRhs->u.i;.  
1d440 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d450 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1d460 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1d470 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
1d480 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72      if( mem1.u.r
1d490 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  <rhs ){.        
1d4a0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1d4b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d     }else if( mem
1d4c0 31 2e 75 2e 72 3e 72 68 73 20 29 7b 0a 20 20 20  1.u.r>rhs ){.   
1d4d0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1d4e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d4f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1d500 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63  64 lhs = vdbeRec
1d510 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72  ordDecodeInt(ser
1d520 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31  ial_type, &aKey1
1d530 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  [d1]);.        i
1d540 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75  64 rhs = pRhs->u
1d550 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  .i;.        if( 
1d560 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs<rhs ){.     
1d570 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1d580 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d590 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs>rhs ){.     
1d5a0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1d5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d5c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1d5d0 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20  S is real */.   
1d5e0 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
1d5f0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
1d600 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
1d610 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1d620 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73  x1];.      if( s
1d630 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
1d640 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72  {.        /* Ser
1d650 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20  ial types 12 or 
1d660 67 72 65 61 74 65 72 20 61 72 65 20 73 74 72 69  greater are stri
1d670 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67  ngs and blobs (g
1d680 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20  reater than.    
1d690 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e      ** numbers).
1d6a0 20 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 31   Types 10 and 11
1d6b0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22   are currently "
1d6c0 72 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  reserved for fut
1d6d0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
1d6e0 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73  use", so it does
1d6f0 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65  n't really matte
1d700 72 20 77 68 61 74 20 74 68 65 20 72 65 73 75 6c  r what the resul
1d710 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a  ts of comparing.
1d720 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20          ** them 
1d730 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75  to numberic valu
1d740 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20  es are.  */.    
1d750 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1d760 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1d770 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
1d780 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1d790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d7a0 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20       double rhs 
1d7b0 3d 20 70 52 68 73 2d 3e 75 2e 72 3b 0a 20 20 20  = pRhs->u.r;.   
1d7c0 20 20 20 20 20 64 6f 75 62 6c 65 20 6c 68 73 3b       double lhs;
1d7d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d7e0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1d7f0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1d800 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20  _type, &mem1);. 
1d810 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61         if( seria
1d820 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1d830 20 20 20 20 20 20 20 6c 68 73 20 3d 20 6d 65 6d         lhs = mem
1d840 31 2e 75 2e 72 3b 0a 20 20 20 20 20 20 20 20 7d  1.u.r;.        }
1d850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d860 6c 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 6d 65  lhs = (double)me
1d870 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20  m1.u.i;.        
1d880 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68  }.        if( lh
1d890 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  s<rhs ){.       
1d8a0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1d8b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68      }else if( lh
1d8c0 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  s>rhs ){.       
1d8d0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1d8e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d8f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1d900 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20  is a string */. 
1d910 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1d920 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
1d930 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61  r ){.      getVa
1d940 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
1d950 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
1d960 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1d970 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1d980 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1d990 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29  serial_type<12 )
1d9a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1d9b0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1d9c0 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65  f( !(serial_type
1d9d0 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20   & 0x01) ){.    
1d9e0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1d9f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1da00 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69    mem1.n = (seri
1da10 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
1da20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  2;.        testc
1da30 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29  ase( (d1+mem1.n)
1da40 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1da50 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
1da60 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
1da70 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  n+1)==(unsigned)
1da80 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1da90 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29   if( (d1+mem1.n)
1daa0 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65   > (unsigned)nKe
1dab0 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y1 ){.          
1dac0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1dad0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1dae0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1daf0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1db10 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1db20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1db30 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1db40 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [i] ){.         
1db50 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
1db60 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20  Info->enc;.     
1db70 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70       mem1.db = p
1db80 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
1db90 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67         mem1.flag
1dba0 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20  s = MEM_Str;.   
1dbb0 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20         mem1.z = 
1dbc0 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31  (char*)&aKey1[d1
1dbd0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ];.          rc 
1dbe0 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  = vdbeCompareMem
1dbf0 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20  String(.        
1dc00 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68        &mem1, pRh
1dc10 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  s, pKeyInfo->aCo
1dc20 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e  ll[i], &pPKey2->
1dc30 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20  errCode.        
1dc40 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c    );.        }el
1dc50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1dc60 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d  t nCmp = MIN(mem
1dc70 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  1.n, pRhs->n);. 
1dc80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
1dc90 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
1dca0 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
1dcb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1dcc0 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31  c==0 ) rc = mem1
1dcd0 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20  .n - pRhs->n; . 
1dce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dcf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1dd00 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  HS is a blob */.
1dd10 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1dd20 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  s->flags & MEM_B
1dd30 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74  lob ){.      get
1dd40 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1dd50 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
1dd60 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
1dd70 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1dd80 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1dd90 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1dda0 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
1ddb0 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20   & 0x01) ){.    
1ddc0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1ddd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dde0 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65    int nStr = (se
1ddf0 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
1de00 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
1de10 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29  tcase( (d1+nStr)
1de20 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1de30 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
1de40 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b  tcase( (d1+nStr+
1de50 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  1)==(unsigned)nK
1de60 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ey1 );.        i
1de70 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28  f( (d1+nStr) > (
1de80 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1de90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  {.          pPKe
1dea0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1deb0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1dec0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1ded0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1dee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1def0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
1df00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1df10 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d      int nCmp = M
1df20 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e  IN(nStr, pRhs->n
1df30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1df40 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
1df50 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43  d1], pRhs->z, nC
1df60 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp);.          i
1df70 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
1df80 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a  nStr - pRhs->n;.
1df90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dfa0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1dfb0 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20  RHS is null */. 
1dfc0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73     else{.      s
1dfd0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1dfe0 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1dff0 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  rc = (serial_typ
1e000 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e!=0);.    }..  
1e010 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1e020 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
1e030 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
1e040 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e050 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -rc;.      }.  
1e060 20 20 20 20 61 73 73 65 72 74 28 20 76 64 62 65      assert( vdbe
1e070 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1e080 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1e090 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a   pPKey2, rc) );.
1e0a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
1e0b0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1e0c0 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
1e0d0 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
1e0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e0f0 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  }..    i++;.    
1e100 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b  pRhs++;.    d1 +
1e110 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1e120 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
1e130 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78  l_type);.    idx
1e140 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69  1 += sqlite3Vari
1e150 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  ntLen(serial_typ
1e160 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64  e);.  }while( id
1e170 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48  x1<(unsigned)szH
1e180 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
1e190 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28  >nField && d1<=(
1e1a0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1e1b0 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72  ;..  /* No memor
1e1c0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
1e1d0 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d  ever used on mem
1e1e0 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75  1.  Prove this u
1e1f0 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f  sing.  ** the fo
1e200 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
1e210 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74  .  If the assert
1e220 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64  () fails, it ind
1e230 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65  icates a.  ** me
1e240 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20  mory leak and a 
1e250 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  need to call sql
1e260 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1e270 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20  se(&mem1).  */. 
1e280 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1e290 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20  Malloc==0 );..  
1e2a0 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65  /* rc==0 here me
1e2b0 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20  ans that one or 
1e2c0 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73  both of the keys
1e2d0 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
1e2e0 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
1e2f0 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
1e300 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
1e310 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
1e320 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
1e330 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
1e340 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1e350 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64  DB .       || vd
1e360 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1e370 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1e380 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79  1, pPKey2, pPKey
1e390 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a  2->default_rc) .
1e3a0 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e         || pKeyIn
1e3b0 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
1e3c0 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75  iled.  );.  retu
1e3d0 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
1e3e0 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  lt_rc;.}.int sql
1e3f0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1e400 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
1e410 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1e420 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1e430 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1e440 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1e450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
1e460 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72  ht key */.){.  r
1e470 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1e480 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
1e490 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
1e4a0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b  ey1, pPKey2, 0);
1e4b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1e4c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
1e4d0 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
1e4e0 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
1e4f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
1e500 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
1e510 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
1e520 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65  PKey2 is an inte
1e530 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65  ger, and (b) the
1e540 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61   .** size-of-hea
1e550 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68  der varint at th
1e560 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
1e570 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
1e580 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74   a single.** byt
1e590 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20  e (i.e. is less 
1e5a0 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a  than 128)..**.**
1e5b0 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72   To avoid concer
1e5c0 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20  ns about buffer 
1e5d0 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20  overreads, this 
1e5e0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
1e5f0 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d  used.** on schem
1e600 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78  as where the max
1e610 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65  imum valid heade
1e620 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74  r size is 63 byt
1e630 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73  es or less..*/.s
1e640 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1e650 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a  cordCompareInt(.
1e660 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1e670 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1e680 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1e690 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1e6a0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
1e6b0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
1e6c0 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
1e6d0 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38  ey = &((const u8
1e6e0 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74  *)pKey1)[*(const
1e6f0 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33   u8*)pKey1 & 0x3
1e700 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  F];.  int serial
1e710 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20  _type = ((const 
1e720 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20  u8*)pKey1)[1];. 
1e730 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20   int res;.  u32 
1e740 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36  y;.  u64 x;.  i6
1e750 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d  4 v = pPKey2->aM
1e760 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34  em[0].u.i;.  i64
1e770 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73   lhs;..  vdbeAss
1e780 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1e790 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c  hinLimits(nKey1,
1e7a0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e   pKey1, pPKey2->
1e7b0 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73  pKeyInfo);.  ass
1e7c0 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79  ert( (*(u8*)pKey
1e7d0 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52  1)<=0x3F || CORR
1e7e0 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74  UPT_DB );.  swit
1e7f0 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
1e800 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b  ){.    case 1: {
1e810 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
1e820 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1e830 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54     lhs = ONE_BYT
1e840 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1e850 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1e860 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1e870 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e880 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
1e890 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1e8a0 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54  */.      lhs = T
1e8b0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1e8c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e8d0 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
1e8e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1e8f0 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
1e900 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
1e910 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
1e920 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f  hs = THREE_BYTE_
1e930 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1e940 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1e950 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1e960 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e970 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
1e980 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1e990 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
1e9a0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1e9b0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36  .      lhs = (i6
1e9c0 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
1e9d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1e9e0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1e9f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ea00 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
1ea10 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1ea20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46  */.      lhs = F
1ea30 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1ea40 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
1ea50 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1ea60 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1ea70 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1ea80 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1ea90 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1eaa0 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73  6: { /* 8-byte s
1eab0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1eac0 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f  .      x = FOUR_
1ead0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1eae0 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
1eaf0 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
1eb00 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
1eb10 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29     lhs = *(i64*)
1eb20 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  &x;.      testca
1eb30 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1eb40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1eb50 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20      case 8: .   
1eb60 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20     lhs = 0;.    
1eb70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1eb80 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d  e 9:.      lhs =
1eb90 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
1eba0 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  ..    /* This ca
1ebb0 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f  se could be remo
1ebc0 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e  ved without chan
1ebd0 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ging the results
1ebe0 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20   of running.    
1ebf0 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e  ** this code. In
1ec00 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65  cluding it cause
1ec10 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74  s gcc to generat
1ec20 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63  e a faster switc
1ec30 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  h .    ** statem
1ec40 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72  ent (since the r
1ec50 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74  ange of switch t
1ec60 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74  argets now start
1ec70 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20  s at zero and.  
1ec80 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f    ** is contiguo
1ec90 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  us) but does not
1eca0 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69   cause any dupli
1ecb0 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20  cate code to be 
1ecc0 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a  generated.    **
1ecd0 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76   (as gcc is clev
1ece0 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d  er enough to com
1ecf0 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b  bine the two lik
1ed00 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20  e cases). Other 
1ed10 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72  .    ** compiler
1ed20 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c  s might be simil
1ed30 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73  ar.  */ .    cas
1ed40 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20  e 0: case 7:.   
1ed50 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1ed60 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1ed70 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
1ed80 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64   pPKey2);..    d
1ed90 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
1eda0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1edb0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
1edc0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1edd0 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  y2);.  }..  if( 
1ede0 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v>lhs ){.    res
1edf0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
1ee00 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73   }else if( v<lhs
1ee10 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
1ee20 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73  Key2->r2;.  }els
1ee30 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46  e if( pPKey2->nF
1ee40 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ield>1 ){.    /*
1ee50 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
1ee60 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
1ee70 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d  s are equal. Com
1ee80 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e  pare the trailin
1ee90 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73  g .    ** fields
1eea0 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  .  */.    res = 
1eeb0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1eec0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1eed0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1eee0 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c  PKey2, 1);.  }el
1eef0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  se{.    /* The f
1ef00 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
1ef10 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
1ef20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20  equal and there 
1ef30 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a  are no trailing.
1ef40 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52      ** fields. R
1ef50 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
1ef60 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73  fault_rc in this
1ef70 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65   case. */.    re
1ef80 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  s = pPKey2->defa
1ef90 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20 20 61  ult_rc;.  }..  a
1efa0 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
1efb0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1efc0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1efd0 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65  y2, res) );.  re
1efe0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1eff0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1f000 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
1f010 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
1f020 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1f030 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20  pare() .** that 
1f040 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (a) the first fi
1f050 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73  eld of pPKey2 is
1f060 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20   a string, that 
1f070 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (b) the first fi
1f080 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20  eld.** uses the 
1f090 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1f0a0 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63  ce BINARY and (c
1f0b0 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  ) that the size-
1f0c0 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
1f0d0 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72   .** at the star
1f0e0 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
1f0f0 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
1f100 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61  gle byte..*/.sta
1f110 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f  tic int vdbeReco
1f120 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1f130 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1f140 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1f150 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1f160 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1f170 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
1f180 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1f190 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
1f1a0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38  Key1 = (const u8
1f1b0 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73  *)pKey1;.  int s
1f1c0 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e  erial_type;.  in
1f1d0 74 20 72 65 73 3b 0a 0a 20 20 76 64 62 65 41 73  t res;..  vdbeAs
1f1e0 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1f1f0 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
1f200 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
1f210 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65  >pKeyInfo);.  ge
1f220 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1f230 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [1], serial_type
1f240 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  );.  if( serial_
1f250 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72  type<12 ){.    r
1f260 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
1f270 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
1f280 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62  nKey1) is a numb
1f290 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a  er or a null */.
1f2a0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
1f2b0 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1f2c0 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20  ) ){ .    res = 
1f2d0 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20  pPKey2->r2;     
1f2e0 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
1f2f0 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  ) is a blob */. 
1f300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1f310 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53  nCmp;.    int nS
1f320 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64  tr;.    int szHd
1f330 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20  r = aKey1[0];.. 
1f340 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61     nStr = (seria
1f350 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a  l_type-12) / 2;.
1f360 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b      if( (szHdr +
1f370 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29   nStr) > nKey1 )
1f380 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e  {.      pPKey2->
1f390 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1f3a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f3b0 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
1f3c0 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74  0;    /* Corrupt
1f3d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
1f3e0 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b   nCmp = MIN( pPK
1f3f0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20  ey2->aMem[0].n, 
1f400 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20  nStr );.    res 
1f410 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
1f420 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e  szHdr], pPKey2->
1f430 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29  aMem[0].z, nCmp)
1f440 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  ;..    if( res==
1f450 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  0 ){.      res =
1f460 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e   nStr - pPKey2->
1f470 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20  aMem[0].n;.     
1f480 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
1f490 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79         if( pPKey
1f4a0 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
1f4b0 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73           res = s
1f4c0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1f4d0 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
1f4e0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1f4f0 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  Key2, 1);.      
1f500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f510 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1f520 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
1f530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1f540 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
1f550 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
1f560 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20  Key2->r2;.      
1f570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1f580 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
1f590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1f5a0 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
1f5b0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1f5c0 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73  y2->r2;.    }els
1f5d0 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  e{.      res = p
1f5e0 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d  PKey2->r1;.    }
1f5f0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1f600 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1f610 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1f620 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
1f630 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
1f640 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c  UPT_DB.       ||
1f650 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1f660 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
1f670 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
1f680 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
1f690 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1f6a0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64   to an sqlite3Vd
1f6b0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1f6c0 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e  ) compatible fun
1f6d0 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c  ction.** suitabl
1f6e0 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  e for comparing 
1f6f0 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72  serialized recor
1f700 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b  ds to the unpack
1f710 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64  ed record passed
1f720 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  .** as the only 
1f730 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63  argument..*/.Rec
1f740 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74  ordCompare sqlit
1f750 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
1f760 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e(UnpackedRecord
1f770 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e   *p){.  /* varin
1f780 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
1f790 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65  t() and varintRe
1f7a0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1f7b0 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a  g() both assume.
1f7c0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69    ** that the si
1f7d0 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
1f7e0 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20  int that occurs 
1f7f0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1f800 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a  each record.  **
1f810 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
1f820 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  e byte (i.e. is 
1f830 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61  127 or less). va
1f840 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
1f850 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f  eInt().  ** also
1f860 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
1f870 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
1f880 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79  read a buffer by
1f890 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20   at least the . 
1f8a0 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73   ** maximum poss
1f8b0 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65  ible legal heade
1f8c0 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79  r size plus 8 by
1f8d0 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65  tes. Because the
1f8e0 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61  re is.  ** guara
1f8f0 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c  nteed to be at l
1f900 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74  east 74 (but not
1f910 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70   136) bytes of p
1f920 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
1f930 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65   each.  ** buffe
1f940 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69  r passed to vari
1f950 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
1f960 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20  nt() this makes 
1f970 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  it convenient to
1f980 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20  .  ** limit the 
1f990 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
1f9a0 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69  er to 64 bytes i
1f9b0 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  n cases where th
1f9c0 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20  e first field.  
1f9d0 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ** is an integer
1f9e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1f9f0 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65  easiest way to e
1fa00 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69  nforce this limi
1fa10 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  t is to consider
1fa20 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69   only records wi
1fa30 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64  th.  ** 13 field
1fa40 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68  s or less. If th
1fa50 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73  e first field is
1fa60 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65   an integer, the
1fa70 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20   maximum legal. 
1fa80 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20   ** header size 
1fa90 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31  is (12*5 + 1 + 1
1faa0 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69  ) bytes.  */.  i
1fab0 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  f( (p->pKeyInfo-
1fac0 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65  >nField + p->pKe
1fad0 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c  yInfo->nXField)<
1fae0 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  =13 ){.    int f
1faf0 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30  lags = p->aMem[0
1fb00 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28  ].flags;.    if(
1fb10 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   p->pKeyInfo->aS
1fb20 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20  ortOrder[0] ){. 
1fb30 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a       p->r1 = 1;.
1fb40 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31        p->r2 = -1
1fb50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1fb60 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20     p->r1 = -1;. 
1fb70 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a       p->r2 = 1;.
1fb80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1fb90 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20  lags & MEM_Int) 
1fba0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1fbb0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1fbc0 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eInt;.    }.    
1fbd0 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
1fbe0 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
1fbf0 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
1fc00 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  s & MEM_Null );.
1fc10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
1fc20 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
1fc30 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
1fc40 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d   & (MEM_Real|MEM
1fc50 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29  _Null|MEM_Blob))
1fc60 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e  ==0 && p->pKeyIn
1fc70 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20  fo->aColl[0]==0 
1fc80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1fc90 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72   flags & MEM_Str
1fca0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1fcb0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1fcc0 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a  reString;.    }.
1fcd0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
1fce0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1fcf0 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ompare;.}../*.**
1fd00 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
1fd10 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
1fd20 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
1fd30 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1fd40 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
1fd50 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
1fd60 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
1fd70 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
1fd80 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
1fd90 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1fda0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
1fdb0 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
1fdc0 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
1fdd0 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  ise..**.** pCur 
1fde0 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e  might be pointin
1fdf0 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  g to text obtain
1fe00 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70  ed from a corrup
1fe10 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  t database file.
1fe20 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65  .** So the conte
1fe30 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  nt cannot be tru
1fe40 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70  sted.  Do approp
1fe50 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20  riate checks on 
1fe60 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  the content..*/.
1fe70 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
1fe80 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20  dxRowid(sqlite3 
1fe90 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  *db, BtCursor *p
1fea0 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
1feb0 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
1fec0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
1fed0 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
1fee0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1fef0 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
1ff00 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
1ff10 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
1ff20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
1ff30 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
1ff40 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1ff50 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
1ff60 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65  m m, v;..  /* Ge
1ff70 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
1ff80 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20  e index entry.  
1ff90 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74  Only indices ent
1ffa0 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a  ries of less.  *
1ffb0 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20  * than 2GiB are 
1ffc0 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69  support - anythi
1ffd0 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65  ng large must be
1ffe0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1fff0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63  tion..  ** Any c
20000 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
20010 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33  ected in sqlite3
20020 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
20030 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a  r(), though, so.
20040 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63    ** this code c
20050 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65  an safely assume
20060 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69   that nCellKey i
20070 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f  s 32-bits  .  */
20080 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20090 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
200a0 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
200b0 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
200c0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
200d0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
200e0 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
200f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
20100 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
20110 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
20120 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
20130 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  il */.  assert( 
20140 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
20150 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
20160 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
20170 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
20180 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
20190 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
201a0 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  try */.  sqlite3
201b0 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
201c0 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
201d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
201e0 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
201f0 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (u32)nCellKey, 1
20200 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
20210 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
20220 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
20230 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
20240 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
20250 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
20260 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
20270 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
20280 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
20290 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
202a0 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
202b0 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
202c0 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
202d0 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
202e0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
202f0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
20300 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
20310 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
20320 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
20330 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
20340 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
20350 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
20360 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
20370 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
20380 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
20390 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
203a0 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
203b0 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
203c0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
203d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
203e0 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
203f0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
20400 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
20410 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
20420 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
20430 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
20440 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
20450 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
20460 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
20470 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
20480 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
20490 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
204a0 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
204b0 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
204c0 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
204d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
204e0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
204f0 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
20500 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  d = sqlite3Small
20510 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f  TypeSizes[typeRo
20520 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65  wid];.  testcase
20530 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
20540 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
20550 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
20560 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
20570 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
20580 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
20590 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
205a0 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
205b0 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
205c0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
205d0 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
205e0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
205f0 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
20600 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
20610 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
20620 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
20630 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
20640 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
20650 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
20660 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
20670 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
20680 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
20690 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
206a0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
206b0 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
206c0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
206d0 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
206e0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
206f0 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
20700 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29   m.szMalloc!=0 )
20710 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
20720 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
20730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
20740 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
20750 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
20760 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
20770 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
20780 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
20790 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
207a0 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
207b0 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
207c0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
207d0 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
207e0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
207f0 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
20800 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
20810 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
20820 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
20830 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
20840 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
20850 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
20860 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
20870 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
20880 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
20890 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
208a0 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
208b0 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
208c0 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
208d0 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
208e0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
208f0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
20900 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
20910 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
20920 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
20930 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
20940 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
20950 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
20960 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
20970 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
20980 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
20990 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
209a0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
209b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
209c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
209d0 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
209e0 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
209f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
20a00 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
20a10 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
20a20 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
20a30 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20  acked,       /* 
20a40 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
20a50 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74   of key */.  int
20a60 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20a80 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
20a90 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
20aa0 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
20ab0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
20ac0 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
20ad0 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75   *pCur = pC->pCu
20ae0 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  rsor;.  Mem m;..
20af0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20b00 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
20b10 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
20b20 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
20b30 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
20b40 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
20b50 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
20b60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
20b70 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
20b80 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
20b90 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
20ba0 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65   */.  /* nCellKe
20bb0 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  y will always be
20bc0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30   between 0 and 0
20bd0 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73  xffffffff becaus
20be0 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a  e of the way.  *
20bf0 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73  * that btreePars
20c00 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73  eCellPtr() and s
20c10 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
20c20 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  2() are implemen
20c30 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65  ted */.  if( nCe
20c40 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
20c50 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
20c60 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
20c70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20c80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20c90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
20ca0 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
20cb0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
20cc0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
20cd0 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72  tree(pC->pCursor
20ce0 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b  , 0, (u32)nCellK
20cf0 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
20d00 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
20d10 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65  rn rc;.  }.  *re
20d20 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
20d30 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e  ecordCompare(m.n
20d40 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64  , m.z, pUnpacked
20d50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
20d60 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
20d70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20d80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
20d90 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
20da0 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
20db0 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
20dc0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
20dd0 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
20de0 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
20df0 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
20e00 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
20e10 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
20e20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
20e30 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73   nChange){.  ass
20e40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
20e50 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
20e60 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  x) );.  db->nCha
20e70 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
20e80 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
20e90 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
20ea0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
20eb0 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
20ec0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
20ed0 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
20ee0 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
20ef0 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
20f00 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
20f10 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
20f20 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
20f30 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
20f40 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
20f50 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
20f60 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
20f70 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
20f80 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
20f90 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
20fa0 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
20fb0 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
20fc0 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
20fd0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
20fe0 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
20ff0 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
21000 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
21010 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
21020 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
21030 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
21040 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
21050 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
21060 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
21070 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
21080 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
21090 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
210a0 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
210b0 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
210c0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
210d0 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
210e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
210f0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
21100 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
21110 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
21120 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
21130 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
21140 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
21150 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
21160 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
21170 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
21180 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
21190 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
211a0 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
211b0 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
211c0 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
211d0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
211e0 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
211f0 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
21200 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
21210 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70  value bound.** p
21220 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66  arameter iVar of
21230 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69   VM v. Except, i
21240 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
21250 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75  n SQL NULL, retu
21260 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64  rn .** 0 instead
21270 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e  . Unless it is N
21280 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e  ULL, apply affin
21290 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20  ity aff (one of 
212a0 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a  the SQLITE_AFF_*
212b0 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74  .** constants) t
212c0 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f  o the value befo
212d0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e  re returning it.
212e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
212f0 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62  ned value must b
21300 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
21310 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
21320 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
21330 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
21340 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
21350 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20  BoundValue(Vdbe 
21360 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38  *v, int iVar, u8
21370 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28   aff){.  assert(
21380 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
21390 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   v ){.    Mem *p
213a0 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69  Mem = &v->aVar[i
213b0 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20  Var-1];.    if( 
213c0 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  0==(pMem->flags 
213d0 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20  & MEM_Null) ){. 
213e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
213f0 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  ue *pRet = sqlit
21400 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62  e3ValueNew(v->db
21410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
21420 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
21430 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
21440 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65  (Mem *)pRet, pMe
21450 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
21460 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
21470 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c  inity(pRet, aff,
21480 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
21490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
214a0 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a  urn pRet;.    }.
214b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
214c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
214d0 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  re SQL variable 
214e0 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e  iVar so that bin
214f0 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65  ding a new value
21500 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a   to it signals.*
21510 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f  * to sqlite3_reo
21520 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72  ptimize() that r
21530 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e-preparing the 
21540 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65  statement may re
21550 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74  sult.** in a bet
21560 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  ter query plan..
21570 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
21580 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64  dbeSetVarmask(Vd
21590 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29  be *v, int iVar)
215a0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
215b0 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  >0 );.  if( iVar
215c0 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78  >32 ){.    v->ex
215d0 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66  pmask = 0xffffff
215e0 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ff;.  }else{.   
215f0 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
21600 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
21610 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  1));.  }.}..#ifn
21620 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21630 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
21640 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f  ** Transfer erro
21650 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66  r message text f
21660 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  rom an sqlite3_v
21670 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  tab.zErrMsg (tex
21680 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
21690 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
216a0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
216b0 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e  oc) into a Vdbe.
216c0 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
216d0 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
216e0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
216f0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29  sqlite3DbMalloc)
21700 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21710 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73  3VtabImportErrms
21720 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74  g(Vdbe *p, sqlit
21730 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
21740 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
21750 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65   p->db;.  sqlite
21760 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
21770 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
21780 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44  rrMsg = sqlite3D
21790 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61  bStrDup(db, pVta
217a0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b->zErrMsg);.  s
217b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
217c0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
217d0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
217e0 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
217f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
21800 41 4c 54 41 42 4c 45 20 2a 2f 0a                 ALTABLE */.