/ Hex Artifact Content
Login

Artifact e8dbcc838ca29f0d2767e789f4fe5883541e4f6e:


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 4f 70 20 3d 20 30 3b 0a   char *zOp = 0;.
7cc0: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 77 69 74 63    int n;.  switc
7cd0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
7ce0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
7cf0: 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  NG:.      sqlite
7d00: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7d10: 2c 20 7a 54 65 6d 70 2c 20 22 25 51 22 2c 20 70  , zTemp, "%Q", p
7d20: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
7d30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7d40: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
7d50: 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  R:.      sqlite3
7d60: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7d70: 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 45   zTemp, "%d", pE
7d80: 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a  xpr->u.iValue);.
7d90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7da0: 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20   case TK_NULL:. 
7db0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7dc0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7dd0: 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  mp, "NULL");.   
7de0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
7df0: 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
7e00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7e10: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7e20: 7a 54 65 6d 70 2c 20 22 72 5b 25 64 5d 22 2c 20  zTemp, "r[%d]", 
7e30: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
7e40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7e50: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
7e60: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
7e70: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
7e80: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  n<0 ){.        s
7e90: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7ea0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 72  nTemp, zTemp, "r
7eb0: 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65  owid");.      }e
7ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
7ed0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7ee0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 25 64  emp, zTemp, "c%d
7ef0: 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69  ", (int)pExpr->i
7f00: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
7f10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7f20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
7f30: 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  LT:      zOp = "
7f40: 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  LT";      break;
7f50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
7f60: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22        zOp = "LE"
7f70: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
7f80: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20    case TK_GT:   
7f90: 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20     zOp = "GT";  
7fa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
7fb0: 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20  ase TK_GE:      
7fc0: 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20  zOp = "GE";     
7fd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7fe0: 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70   TK_NE:      zOp
7ff0: 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72   = "NE";      br
8000: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8010: 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _EQ:      zOp = 
8020: 22 45 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "EQ";      break
8030: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
8040: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53  :      zOp = "IS
8050: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8060: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
8070: 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54  :   zOp = "ISNOT
8080: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
8090: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20  case TK_AND:    
80a0: 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20   zOp = "AND";   
80b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
80c0: 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f  e TK_OR:      zO
80d0: 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62  p = "OR";      b
80e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
80f0: 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d  K_PLUS:    zOp =
8100: 20 22 41 44 44 22 3b 20 20 20 20 20 62 72 65 61   "ADD";     brea
8110: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
8120: 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d  TAR:    zOp = "M
8130: 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  UL";     break;.
8140: 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
8150: 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22  S:   zOp = "SUB"
8160: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
8170: 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20   case TK_REM:   
8180: 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20    zOp = "REM";  
8190: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
81a0: 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a  se TK_BITAND:  z
81b0: 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20  Op = "BITAND";  
81c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
81d0: 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20  TK_BITOR:   zOp 
81e0: 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65  = "BITOR";   bre
81f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8200: 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22  SLASH:   zOp = "
8210: 44 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  DIV";     break;
8220: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
8230: 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48  IFT:  zOp = "LSH
8240: 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  IFT";  break;.  
8250: 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
8260: 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54  :  zOp = "RSHIFT
8270: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
8280: 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20  ase TK_CONCAT:  
8290: 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20  zOp = "CONCAT"; 
82a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
82b0: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70   TK_UMINUS:  zOp
82c0: 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72   = "MINUS";   br
82d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
82e0: 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20  _UPLUS:   zOp = 
82f0: 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b  "PLUS";    break
8300: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
8310: 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49  TNOT:  zOp = "BI
8320: 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  TNOT";  break;. 
8330: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
8340: 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b      zOp = "NOT";
8350: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8360: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20  case TK_ISNULL: 
8370: 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b   zOp = "ISNULL";
8380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8390: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f  e TK_NOTNULL: zO
83a0: 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62  p = "NOTNULL"; b
83b0: 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
83c0: 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  lt:.      sqlite
83d0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
83e0: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 22  , zTemp, "%s", "
83f0: 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72  expr");.      br
8400: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eak;.  }..  if( 
8410: 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  zOp ){.    sqlit
8420: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8430: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 22 2c  p, zTemp, "%s(",
8440: 20 7a 4f 70 29 3b 0a 20 20 20 20 6e 20 3d 20 73   zOp);.    n = s
8450: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8460: 54 65 6d 70 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  Temp);.    n += 
8470: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e 54  displayP4Expr(nT
8480: 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20  emp-n, zTemp+n, 
8490: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
84a0: 20 20 20 69 66 28 20 6e 3c 6e 54 65 6d 70 2d 31     if( n<nTemp-1
84b0: 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
84c0: 74 20 29 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70  t ){.      zTemp
84d0: 5b 6e 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [n++] = ',';.   
84e0: 20 20 20 6e 20 2b 3d 20 64 69 73 70 6c 61 79 50     n += displayP
84f0: 34 45 78 70 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a  4Expr(nTemp-n, z
8500: 54 65 6d 70 2b 6e 2c 20 70 45 78 70 72 2d 3e 70  Temp+n, pExpr->p
8510: 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Right);.    }.  
8520: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8530: 74 66 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65 6d  tf(nTemp-n, zTem
8540: 70 2b 6e 2c 20 22 29 22 29 3b 0a 20 20 7d 0a 20  p+n, ")");.  }. 
8550: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
8560: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a  trlen30(zTemp);.
8570: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45  }.#endif /* VDBE
8580: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
8590: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
85a0: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
85b0: 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45  S) */...#if VDBE
85c0: 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a  _DISPLAY_P4./*.*
85d0: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
85e0: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
85f0: 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74  s the P4 paramet
8600: 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65  er for an opcode
8610: 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66  ..** Use zTemp f
8620: 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  or any required 
8630: 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
8640: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
8650: 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50  c char *displayP
8660: 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20  4(Op *pOp, char 
8670: 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d  *zTemp, int nTem
8680: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20  p){.  char *zP4 
8690: 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72  = zTemp;.  asser
86a0: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
86b0: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
86c0: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
86d0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
86e0: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
86f0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
8700: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
8710: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
8720: 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
8730: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
8740: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
8750: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8760: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64 22  p, zTemp, "k(%d"
8770: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
8780: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
8790: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
87a0: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
87b0: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
87c0: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
87d0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
87e0: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
87f0: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
8800: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
8810: 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f  *zColl = pColl ?
8820: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
8830: 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 69  "nil";.        i
8840: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
8850: 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20  rlen30(zColl);. 
8860: 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 36 20         if( n==6 
8870: 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c  && memcmp(zColl,
8880: 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20 29  "BINARY",6)==0 )
8890: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c  {.          zCol
88a0: 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20  l = "B";.       
88b0: 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20     n = 1;.      
88c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
88d0: 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+n>nTemp-6 ){. 
88e0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
88f0: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22  &zTemp[i],",..."
8900: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ,4);.          b
8910: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
8920: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
8930: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
8940: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
8950: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b  aSortOrder[j] ){
8960: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
8970: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
8980: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
8990: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
89a0: 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20   zColl, n+1);.  
89b0: 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20        i += n;.  
89c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
89d0: 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  p[i++] = ')';.  
89e0: 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30      zTemp[i] = 0
89f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8a00: 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20  i<nTemp );.     
8a10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
8a20: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8a30: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
8a40: 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 52      case P4_EXPR
8a50: 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61  : {.      displa
8a60: 79 50 34 45 78 70 72 28 6e 54 65 6d 70 2c 20 7a  yP4Expr(nTemp, z
8a70: 54 65 6d 70 2c 20 70 4f 70 2d 3e 70 34 2e 70 45  Temp, pOp->p4.pE
8a80: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
8a90: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
8aa0: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
8ab0: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
8ac0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
8ad0: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
8ae0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8af0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8b00: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
8b10: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
8b20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8b30: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
8b40: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
8b50: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
8b60: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
8b70: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8b80: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8b90: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
8ba0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
8bb0: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
8bc0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
8bd0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 63  LITE_DEBUG.    c
8be0: 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20  ase P4_FUNCCTX: 
8bf0: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
8c00: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
8c10: 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pCtx->pFunc;.   
8c20: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8c30: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8c40: 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66  , "%s(%d)", pDef
8c50: 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e  ->zName, pDef->n
8c60: 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Arg);.      brea
8c70: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
8c80: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
8c90: 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  4: {.      sqlit
8ca0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8cb0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
8cc0: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
8cd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8ce0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
8cf0: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
8d00: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8d10: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8d20: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
8d30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8d40: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
8d50: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
8d60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8d70: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
8d80: 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70  16g", *pOp->p4.p
8d90: 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Real);.      bre
8da0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8db0: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
8dc0: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70     Mem *pMem = p
8dd0: 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20  Op->p4.pMem;.   
8de0: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
8df0: 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
8e00: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d          zP4 = pM
8e10: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c  em->z;.      }el
8e20: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
8e30: 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
8e40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8e50: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8e60: 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70  zTemp, "%lld", p
8e70: 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20  Mem->u.i);.     
8e80: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
8e90: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
8ea0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
8eb0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8ec0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
8ed0: 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b  6g", pMem->u.r);
8ee0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8ef0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
8f00: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
8f10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8f20: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8f30: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  , "NULL");.     
8f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8f50: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c  assert( pMem->fl
8f60: 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
8f70: 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  ;.        zP4 = 
8f80: 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20  "(blob)";.      
8f90: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8fa0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
8fb0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
8fc0: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
8fd0: 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  4_VTAB: {.      
8fe0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
8ff0: 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56  tab = pOp->p4.pV
9000: 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20  tab->pVtab;.    
9010: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9020: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
9030: 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61   "vtab:%p", pVta
9040: 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  b);.      break;
9050: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9060: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
9070: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
9080: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9090: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61  mp, zTemp, "inta
90a0: 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72  rray");.      br
90b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
90c0: 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  ase P4_SUBPROGRA
90d0: 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M: {.      sqlit
90e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
90f0: 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72  p, zTemp, "progr
9100: 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  am");.      brea
9110: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9120: 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a  e P4_ADVANCE: {.
9130: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
9140: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
9150: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
9160: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
9170: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
9180: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
9190: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
91a0: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
91b0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
91c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
91d0: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
91e0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
91f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45  }.#endif /* VDBE
9200: 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a  _DISPLAY_P4 */..
9210: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
9220: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
9230: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
9240: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
9250: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
9260: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
9270: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
9280: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
9290: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
92a0: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
92b0: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
92c0: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
92d0: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
92e0: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
92f0: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
9300: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
9310: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
9320: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
9330: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
9340: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
9350: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
9360: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
9370: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
9380: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
9390: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
93a0: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
93b0: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
93c0: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
93d0: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
93e0: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
93f0: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62  eMask)*8 );.  Db
9400: 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65  MaskSet(p->btree
9410: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20  Mask, i);.  if( 
9420: 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42  i!=1 && sqlite3B
9430: 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e  treeSharable(p->
9440: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
9450: 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
9460: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29  (p->lockMask, i)
9470: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
9480: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9490: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
94a0: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
94b0: 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20  SAFE>0./*.** If 
94c0: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
94d0: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68  ed to support sh
94e0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
94f0: 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  and to be thread
9500: 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  safe,.** this ro
9510: 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68  utine obtains th
9520: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
9530: 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53  ed with each BtS
9540: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a  hared structure.
9550: 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61  ** that may be a
9560: 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56  ccessed by the V
9570: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
9580: 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e  rgument. In doin
9590: 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20  g so it also.** 
95a0: 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65  sets the BtShare
95b0: 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65  d.db member of e
95c0: 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61  ach of the BtSha
95d0: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20  red structures, 
95e0: 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74  ensuring.** that
95f0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73   the correct bus
9600: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
9610: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66  ck is invoked if
9620: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
9630: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
9640: 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74  t threadsafe but
9650: 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68   does support sh
9660: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
9670: 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33   then.** sqlite3
9680: 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20  BtreeEnter() is 
9690: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
96a0: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
96b0: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
96c0: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
96d0: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
96e0: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
96f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
9700: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9710: 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49   the VM..**.** I
9720: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
9730: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
9740: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
9750: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
9760: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
9770: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
9780: 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72  **.** The p->btr
9790: 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20  eeMask field is 
97a0: 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c  a bitmask of all
97b0: 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65   btrees that the
97c0: 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74   prepared .** st
97d0: 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65  atement p will e
97e0: 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20  ver use.  Let N 
97f0: 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
9800: 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65   bits in p->btre
9810: 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  eMask.** corresp
9820: 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73  onding to btrees
9830: 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
9840: 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68   cache.  Then th
9850: 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20  e runtime of.** 
9860: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9870: 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69  N*N.  But as N i
9880: 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68  s rarely more th
9890: 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c  an 1, this shoul
98a0: 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72  d not.** be a pr
98b0: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
98c0: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
98d0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
98e0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
98f0: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
9900: 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62  nt nDb;.  if( Db
9910: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
9920: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
9930: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
9940: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
9950: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
9960: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
9970: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
9980: 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29  i=0; i<nDb; i++)
9990: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
99a0: 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  & DbMaskTest(p->
99b0: 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41  lockMask,i) && A
99c0: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
99d0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
99e0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
99f0: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
9a00: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
9a10: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9a20: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9a30: 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54  _CACHE) && SQLIT
9a40: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f  E_THREADSAFE>0./
9a50: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20  *.** Unlock all 
9a60: 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72  of the btrees pr
9a70: 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20  eviously locked 
9a80: 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  by a call to sql
9a90: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e  ite3VdbeEnter().
9aa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
9ab0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
9ac0: 76 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  vdbeLeave(Vdbe *
9ad0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
9ae0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
9af0: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
9b00: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
9b10: 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b    aDb = db->aDb;
9b20: 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62  .  nDb = db->nDb
9b30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
9b40: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
9b50: 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b  ( i!=1 && DbMask
9b60: 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Test(p->lockMask
9b70: 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44  ,i) && ALWAYS(aD
9b80: 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a  b[i].pBt!=0) ){.
9b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
9ba0: 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70  eeLeave(aDb[i].p
9bb0: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
9bc0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9bd0: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b  eLeave(Vdbe *p){
9be0: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
9bf0: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
9c00: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
9c10: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
9c20: 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70  */.  vdbeLeave(p
9c30: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
9c40: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
9c50: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
9c60: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
9c70: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69  /*.** Print a si
9c80: 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68  ngle opcode.  Th
9c90: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
9ca0: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
9cb0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
9cc0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
9cd0: 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e  p(FILE *pOut, in
9ce0: 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a  t pc, Op *pOp){.
9cf0: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
9d00: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
9d10: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
9d20: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
9d30: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
9d40: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
9d50: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
9d60: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
9d70: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
9d80: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
9d90: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
9da0: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
9db0: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
9dc0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
9dd0: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
9de0: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
9df0: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
9e00: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
9e10: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
9e20: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
9e30: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
9e40: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
9e50: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
9e60: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
9e70: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
9e80: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
9e90: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
9ea0: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
9eb0: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
9ec0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
9ed0: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
9ee0: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
9ef0: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
9f00: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
9f10: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
9f20: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
9f30: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
9f40: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
9f50: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
9f60: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
9f70: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
9f80: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
9f90: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
9fa0: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
9fb0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
9fc0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
9fd0: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
9fe0: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   N ){.    Mem *p
9ff0: 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20  End = &p[N];.   
a000: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a010: 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c  ->db;.    u8 mal
a020: 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d  loc_failed = db-
a030: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
a040: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
a050: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
a060: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
a070: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
a080: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a090: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
a0a0: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
a0b0: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  )<pEnd );.      
a0c0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
a0d0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65    do{.      asse
a0e0: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
a0f0: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
a100: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
a110: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
a120: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
a130: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
a140: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
a150: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
a160: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
a170: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
a180: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
a190: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
a1a0: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
a1b0: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
a1c0: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
a1d0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
a1e0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
a1f0: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
a200: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
a210: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
a220: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
a230: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
a240: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
a250: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
a260: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
a270: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
a280: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
a290: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
a2a0: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
a2b0: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
a2c0: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
a2d0: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
a2e0: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
a2f0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
a300: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
a310: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
a320: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
a330: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
a340: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
a350: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
a360: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
a370: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
a380: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
a390: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
a3a0: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
a3b0: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
a3c0: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
a3d0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
a3e0: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
a3f0: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
a400: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
a410: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
a420: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
a430: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
a440: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
a450: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
a460: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a470: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46  p->flags & MEM_F
a480: 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65  rame );.      te
a490: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
a4a0: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b   & MEM_RowSet );
a4b0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
a4c0: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
a4d0: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
a4e0: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
a4f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a500: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
a510: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a520: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20  p->szMalloc ){. 
a530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
a540: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
a550: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  loc);.        p-
a560: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  >szMalloc = 0;. 
a570: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
a580: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  >flags = MEM_Und
a590: 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69  efined;.    }whi
a5a0: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
a5b0: 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ;.    db->malloc
a5c0: 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f  Failed = malloc_
a5d0: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f  failed;.  }.}../
a5e0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64  *.** Delete a Vd
a5f0: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61  beFrame object a
a600: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
a610: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
a620: 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ts are.** alloca
a630: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72  ted by the OP_Pr
a640: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
a650: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
a660: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
a670: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
a680: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b  e(VdbeFrame *p){
a690: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
a6a0: 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d  *aMem = VdbeFram
a6b0: 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43  eMem(p);.  VdbeC
a6c0: 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20  ursor **apCsr = 
a6d0: 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
a6e0: 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65  aMem[p->nChildMe
a6f0: 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m];.  for(i=0; i
a700: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
a710: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
a720: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
a730: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
a740: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
a750: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
a760: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
a770: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
a780: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
a790: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a7a0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
a7b0: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
a7c0: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
a7d0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
a7e0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
a7f0: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
a800: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
a810: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
a820: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
a830: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
a840: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
a850: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
a860: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
a870: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
a880: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
a890: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
a8a0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
a8b0: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
a8c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
a8d0: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
a8e0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
a8f0: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
a900: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
a910: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
a920: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
a930: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
a940: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
a950: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
a960: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
a970: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
a980: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
a990: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
a9a0: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
a9b0: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
a9c0: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
a9d0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
a9e0: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
a9f0: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
aa00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
aa10: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
aa40: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
aa70: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
aa80: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
aa90: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
aac0: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
aad0: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
aae0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
aaf0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
ab00: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
ab10: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
ab20: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab40: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
ab50: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
ab60: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
ab70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
ab80: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
ab90: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
aba0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
abb0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
abe0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
abf0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ac00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ac10: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
ac20: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
ac30: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ac50: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75  irst Mem of resu
ac60: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73  lt set */..  ass
ac70: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
ac80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
ac90: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
aca0: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72  C_RUN );.  asser
acb0: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
acc0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
acd0: 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e  LITE_BUSY || p->
ace0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
acf0: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
ad00: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
ad10: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
ad20: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
ad30: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
ad40: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
ad50: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
ad60: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
ad70: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
ad80: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
ad90: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
ada0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
adb0: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
adc0: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
add0: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b  mArray(pMem, 8);
ade0: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
adf0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
ae00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
ae10: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
ae20: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
ae30: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
ae40: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
ae50: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
ae60: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
ae70: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
ae80: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
ae90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
aea0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
aeb0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
aec0: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  }..  /* When the
aed0: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
aee0: 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e  t rows reaches n
aef0: 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  Row, that means 
af00: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67  the.  ** listing
af10: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e   has finished an
af20: 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  d sqlite3_step()
af30: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
af40: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a  QLITE_DONE..  **
af50: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d   nRow is the sum
af60: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
af70: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  f rows in the ma
af80: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73  in program, plus
af90: 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66  .  ** the sum of
afa0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
afb0: 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67  ows in all trigg
afc0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65  er subprograms e
afd0: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
afe0: 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f  so far.  The nRo
aff0: 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63  w value will inc
b000: 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69  rease as new tri
b010: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
b020: 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e   are.  ** encoun
b030: 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63  tered, but p->pc
b040: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
b050: 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f   catch up to nRo
b060: 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  w..  */.  nRow =
b070: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70   p->nOp;.  if( p
b080: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
b090: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
b0a0: 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20   8 memory cells 
b0b0: 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  are used for the
b0c0: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f   result set.  So
b0d0: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   we will.    ** 
b0e0: 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39  commandeer the 9
b0f0: 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61  th cell to use a
b100: 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e  s storage for an
b110: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
b120: 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69  rs.    ** to tri
b130: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
b140: 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67  .  The VDBE is g
b150: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
b160: 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20  e at least 9.   
b170: 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20   ** cells.  */. 
b180: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d     assert( p->nM
b190: 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62  em>9 );.    pSub
b1a0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a   = &p->aMem[9];.
b1b0: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c      if( pSub->fl
b1c0: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
b1d0: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20        /* On the 
b1e0: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
b1f0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53  lite3_step(), pS
b200: 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e  ub will hold a N
b210: 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ULL.  It is.    
b220: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
b230: 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68   to a BLOB by th
b240: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  e P4_SUBPROGRAM 
b250: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
b260: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
b270: 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73  nSub = pSub->n/s
b280: 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20  izeof(Vdbe*);.  
b290: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
b2a0: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
b2b0: 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  >z;.    }.    fo
b2c0: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69  r(i=0; i<nSub; i
b2d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ++){.      nRow 
b2e0: 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70  += apSub[i]->nOp
b2f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
b300: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
b310: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
b320: 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61  nRow && p->expla
b330: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
b340: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
b350: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
b360: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d  >=nRow ){.    p-
b370: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
b380: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
b390: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
b3a0: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
b3b0: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
b3c0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
b3d0: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
b3e0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
b3f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
b400: 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45  rror(p, sqlite3E
b410: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
b420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
b430: 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70   *zP4;.    Op *p
b440: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
b450: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
b460: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
b470: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
b480: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
b490: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
b4a0: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
b4b0: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
b4c0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
b4d0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
b4e0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
b4f0: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
b500: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
b510: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
b520: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
b530: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
b540: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
b550: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
b560: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
b570: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
b580: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
b590: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
b5a0: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
b5b0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
b5c0: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
b5d0: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
b5e0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
b5f0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
b600: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
b610: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
b620: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b650: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
b660: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
b670: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
b680: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
b690: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
b6a0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
b6b0: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
b6c0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
b6d0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f  p->opcode); /* O
b6e0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61  pcode */.      a
b6f0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
b700: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
b710: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
b720: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
b730: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
b740: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
b750: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
b760: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
b770: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
b780: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
b790: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
b7a0: 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20  at has.      ** 
b7b0: 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  a P4_SUBPROGRAM 
b7c0: 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e  argument), expan
b7d0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
b7e0: 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  e array of subpr
b7f0: 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20  ograms.      ** 
b800: 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b  kept in p->aMem[
b810: 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65  9].z to hold the
b820: 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61   new program - a
b830: 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62  ssuming this sub
b840: 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a  program.      **
b850: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
b860: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
b870: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
b880: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
b890: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
b8a0: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
b8b0: 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66   (nSub+1)*sizeof
b8c0: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
b8d0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
b8e0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
b8f0: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
b900: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
b910: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
b920: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
b930: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b940: 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20   if( j==nSub && 
b950: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74  SQLITE_OK==sqlit
b960: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
b970: 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21  ub, nByte, nSub!
b980: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
b990: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
b9a0: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
b9b0: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
b9c0: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
b9d0: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
b9e0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
b9f0: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
ba00: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
ba10: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
ba20: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
ba30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ba40: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
ba50: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
ba60: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
ba70: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
baa0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
bab0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
bac0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
bad0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baf0: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
bb00: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
bb10: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
bb20: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
bb30: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
bb60: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
bb70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
bb80: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
bb90: 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29 20  size(pMem, 100) 
bba0: 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20  ){ /* P4 */.    
bbb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
bbc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
bbd0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
bbe0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
bbf0: 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  }.    pMem->flag
bc00: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
bc10: 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20  Term;.    zP4 = 
bc20: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70  displayP4(pOp, p
bc30: 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a  Mem->z, pMem->sz
bc40: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  Malloc);.    if(
bc50: 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b   zP4!=pMem->z ){
bc60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bc70: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
bc80: 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54  , zP4, -1, SQLIT
bc90: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20  E_UTF8, 0);.    
bca0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
bcb0: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
bcc0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
bcd0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
bce0: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
bcf0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
bd00: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
bd10: 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  }.    pMem++;.. 
bd20: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
bd30: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66  n==1 ){.      if
bd40: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
bd50: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
bd60: 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20  Mem, 4) ){.     
bd70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
bd80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bd90: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
bda0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
bdb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
bdc0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
bdd0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
bde0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
bdf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
be00: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
be10: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
be20: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
be30: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
be40: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
be50: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
be60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
be70: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
be80: 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20  MENTS.      if( 
be90: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
bea0: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
beb0: 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20  m, 500) ){.     
bec0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
bed0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bee0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
bef0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
bf00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
bf10: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
bf20: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
bf30: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73     pMem->n = dis
bf40: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c  playComment(pOp,
bf50: 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35   zP4, pMem->z, 5
bf60: 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  00);.      pMem-
bf70: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
bf80: 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  F8;.#else.      
bf90: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
bfa0: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bfc0: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64   Comment */.#end
bfd0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d  if.    }..    p-
bfe0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20  >nResColumn = 8 
bff0: 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d  - 4*(p->explain-
c000: 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75  1);.    p->pResu
c010: 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d  ltSet = &p->aMem
c020: 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  [1];.    p->rc =
c030: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c040: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
c050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c060: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
c070: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
c080: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
c090: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
c0a0: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
c0b0: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
c0c0: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
c0d0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
c0e0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
c0f0: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
c100: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
c110: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c  0;.  if( p->zSql
c120: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a   ){.    z = p->z
c130: 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Sql;.  }else if(
c140: 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20   p->nOp>=1 ){.  
c150: 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a    const VdbeOp *
c160: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
c170: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
c180: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
c190: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
c1a0: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d  {.      z = pOp-
c1b0: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69  >p4.z;.      whi
c1c0: 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  le( sqlite3Isspa
c1d0: 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  ce(*z) ) z++;.  
c1e0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20    }.  }.  if( z 
c1f0: 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b  ) printf("SQL: [
c200: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65  %s]\n", z);.}.#e
c210: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
c220: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
c230: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
c240: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
c250: 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72  OTRACE)./*.** Pr
c260: 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d  int an IOTRACE m
c270: 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53  essage showing S
c280: 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76  QL content..*/.v
c290: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
c2a0: 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a  OTraceSql(Vdbe *
c2b0: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
c2c0: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
c2d0: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c   *pOp;.  if( sql
c2e0: 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29  ite3IoTrace==0 )
c2f0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e   return;.  if( n
c300: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
c310: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
c320: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
c330: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
c340: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
c350: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
c360: 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b     char z[1000];
c370: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
c380: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
c390: 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70   z, "%s", pOp->p
c3a0: 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  4.z);.    for(i=
c3b0: 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  0; sqlite3Isspac
c3c0: 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  e(z[i]); i++){}.
c3d0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69      for(j=0; z[i
c3e0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
c3f0: 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  f( sqlite3Isspac
c400: 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  e(z[i]) ){.     
c410: 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27     if( z[i-1]!='
c420: 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ' ){.          
c430: 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  z[j++] = ' ';.  
c440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
c450: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
c460: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
c470: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
c480: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
c490: 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20  te3IoTrace("SQL 
c4a0: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
c4b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
c4c0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
c4d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
c4e0: 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  OTRACE */../*.**
c4f0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
c500: 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a  from a fixed siz
c510: 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74  e buffer and ret
c520: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
c530: 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20  .** that space. 
c540: 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74   If insufficient
c550: 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
c560: 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ble, return NULL
c570: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66  ..**.** The pBuf
c580: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
c590: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
c5a0: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69  of a pointer whi
c5b0: 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69  ch will.** recei
c5c0: 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72  ve the new memor
c5d0: 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d  y.  pBuf is norm
c5e0: 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70  ally NULL.  If p
c5f0: 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55  Buf is not.** NU
c600: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
c610: 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68  t memory space h
c620: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
c630: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
c640: 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  at.** this routi
c650: 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c  ne should not al
c660: 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d  locate any new m
c670: 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75  emory.  When pBu
c680: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
c690: 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70   simply return p
c6a0: 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63  Buf.  Only alloc
c6b0: 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73  ate new memory s
c6c0: 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a  pace when pBuf.*
c6d0: 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  * is NULL..**.**
c6e0: 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75   nByte is the nu
c6f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
c700: 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a   space needed..*
c710: 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69  *.** *ppFrom poi
c720: 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65  nts to available
c730: 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20   space and pEnd 
c740: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e  points to the en
c750: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69  d of the.** avai
c760: 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68  lable space.  Wh
c770: 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f  en space is allo
c780: 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69  cated, *ppFrom i
c790: 73 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a  s advanced past.
c7a0: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
c7b0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  e allocated spac
c7c0: 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65  e..**.** *pnByte
c7d0: 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66   is a counter of
c7e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
c7f0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68  ytes of space th
c800: 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a  at have failed.*
c810: 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20  * to allocate.  
c820: 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75  If there is insu
c830: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
c840: 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74  n *ppFrom to sat
c850: 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75  isfy the.** requ
c860: 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  est, then increm
c870: 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74  ent *pnByte by t
c880: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
c890: 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61   request..*/.sta
c8a0: 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53  tic void *allocS
c8b0: 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42  pace(.  void *pB
c8c0: 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uf,          /* 
c8d0: 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69  Where return poi
c8e0: 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f  nter will be sto
c8f0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  red */.  int nBy
c900: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
c910: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
c920: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
c930: 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20    u8 **ppFrom,  
c940: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
c950: 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20  : Allocate from 
c960: 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20  *ppFrom */.  u8 
c970: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
c980: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
c990: 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  1 byte past the 
c9a0: 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62  end of *ppFrom b
c9b0: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  uffer */.  int *
c9c0: 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20  pnByte          
c9d0: 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  /* If allocation
c9e0: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c   cannot be made,
c9f0: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79   increment *pnBy
ca00: 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  te */.){.  asser
ca10: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
ca20: 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29  IGNMENT(*ppFrom)
ca30: 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29   );.  if( pBuf )
ca40: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20   return pBuf;.  
ca50: 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e  nByte = ROUND8(n
ca60: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a  Byte);.  if( &(*
ca70: 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c  ppFrom)[nByte] <
ca80: 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42  = pEnd ){.    pB
ca90: 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46  uf = (void*)*ppF
caa0: 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d  rom;.    *ppFrom
cab0: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c   += nByte;.  }el
cac0: 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20  se{.    *pnByte 
cad0: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20  += nByte;.  }.  
cae0: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
caf0: 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65  /*.** Rewind the
cb00: 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68   VDBE back to th
cb10: 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70  e beginning in p
cb20: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a  reparation for.*
cb30: 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f  * running it..*/
cb40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
cb50: 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29  eRewind(Vdbe *p)
cb60: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
cb70: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
cb80: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
cb90: 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65  ILE).  int i;.#e
cba0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
cbb0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
cbc0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
cbd0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20  MAGIC_INIT );.. 
cbe0: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
cbf0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
cc00: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
cc10: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
cc20: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
cc30: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
cc40: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
cc50: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
cc60: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  er. */.  p->magi
cc70: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
cc80: 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  UN;..#ifdef SQLI
cc90: 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
cca0: 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =1; i<p->nMem; i
ccb0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
ccc0: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d   p->aMem[i].db==
ccd0: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e  p->db );.  }.#en
cce0: 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  dif.  p->pc = -1
ccf0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
cd00: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
cd10: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
cd20: 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  rt;.  p->magic =
cd30: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
cd40: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
cd50: 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
cd60: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
cd70: 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
cd80: 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  255;.  p->iState
cd90: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  ment = 0;.  p->n
cda0: 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30  FkConstraint = 0
cdb0: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
cdc0: 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b  OFILE.  for(i=0;
cdd0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
cde0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
cdf0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  nt = 0;.    p->a
ce00: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
ce10: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
ce20: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
ce30: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
ce40: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f  for execution fo
ce50: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
ce60: 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69   after.** creati
ce70: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  ng the virtual m
ce80: 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e  achine.  This in
ce90: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
cea0: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
ceb0: 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e  ing registers an
cec0: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
ced0: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
cee0: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
cef0: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
cf00: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
cf10: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
cf20: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
cf30: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
cf40: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
cf50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
cf60: 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74   be called exact
cf70: 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  ly once on each 
cf80: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
cf90: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
cfa0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
cfb0: 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
cfc0: 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20   "packaged" and 
cfd0: 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72  is ready.** to r
cfe0: 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  un.  After this 
cff0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d000: 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73  d, further calls
d010: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
d020: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
d030: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
d040: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
d050: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
d060: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
d070: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
d080: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
d090: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
d0a0: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
d0b0: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
d0c0: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
d0d0: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
d0e0: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
d0f0: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
d100: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
d110: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
d120: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
d130: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
d140: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
d150: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
d160: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
d170: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
d180: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
d190: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
d1c0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
d1d0: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
d1e0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
d1f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
d200: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d220: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
d230: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
d240: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d260: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
d270: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
d280: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
d290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d2a0: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
d2b0: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
d2c0: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d2e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
d2f0: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
d300: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
d330: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
d340: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
d350: 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  nOnce;          
d360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d370: 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20  mber of OP_Once 
d380: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  instructions */.
d390: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
d3c0: 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20   */.  u8 *zCsr; 
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
d3f0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
d400: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  ocation */.  u8 
d410: 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *zEnd;          
d420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d430: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61  irst byte past a
d440: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20  llocated memory 
d450: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d470: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
d480: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20  extra memory is 
d490: 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73  needed */..  ass
d4a0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
d4b0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
d4c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
d4d0: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
d4e0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
d4f0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
d500: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
d510: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
d520: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
d530: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
d540: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
d550: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
d560: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
d570: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
d580: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
d590: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
d5a0: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
d5b0: 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73  .  nOnce = pPars
d5c0: 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20  e->nOnce;.  if( 
d5d0: 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65  nOnce==0 ) nOnce
d5e0: 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20   = 1; /* Ensure 
d5f0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
d600: 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  e in p->aOnceFla
d610: 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46  g[] */.  .  /* F
d620: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
d630: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
d640: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
d650: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
d660: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
d670: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
d680: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
d690: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
d6a0: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
d6b0: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
d6c0: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
d6d0: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
d6e0: 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  for.  ** VdbeCur
d6f0: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
d700: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
d710: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
d720: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
d730: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
d740: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
d750: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
d760: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
d770: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
d780: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
d790: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
d7a0: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
d7b0: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
d7c0: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
d7d0: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
d7e0: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
d7f0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
d800: 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  for memory regis
d810: 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62  ters, SQL variab
d820: 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72  les, VDBE cursor
d830: 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61  s and .  ** an a
d840: 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20  rray to marshal 
d850: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  SQL function arg
d860: 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a  uments in..  */.
d870: 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70    zCsr = (u8*)&p
d880: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
d890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
d8a0: 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f  ory avaliable fo
d8b0: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
d8c0: 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70    zEnd = (u8*)&p
d8d0: 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f  ->aOp[pParse->nO
d8e0: 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72  pAlloc];  /* Fir
d8f0: 73 74 20 62 79 74 65 20 70 61 73 74 20 65 6e 64  st byte past end
d900: 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20   of zCsr[] */.. 
d910: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
d920: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d  (p, &nArg);.  p-
d930: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
d940: 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e   = (u8)(pParse->
d950: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20  isMultiWrite && 
d960: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
d970: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
d980: 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  >explain && nMem
d990: 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20  <10 ){.    nMem 
d9a0: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  = 10;.  }.  mems
d9b0: 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64  et(zCsr, 0, zEnd
d9c0: 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b  -zCsr);.  zCsr +
d9d0: 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30  = (zCsr - (u8*)0
d9e0: 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45  )&7;.  assert( E
d9f0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
da00: 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70  ENT(zCsr) );.  p
da10: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a  ->expired = 0;..
da20: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20    /* Memory for 
da30: 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d  registers, param
da40: 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65  eters, cursor, e
da50: 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  tc, is allocated
da60: 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73   in two.  ** pas
da70: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72  ses.  On the fir
da80: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20  st pass, we try 
da90: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20  to reuse unused 
daa0: 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20  space at the .  
dab0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
dac0: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
dad0: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
dae0: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
daf0: 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
db00: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
db10: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
db20: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
db30: 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
db40: 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
db50: 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61 20  he rest using a 
db60: 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  fresh allocation
db70: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
db80: 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72  is two-pass appr
db90: 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73  oach that reuses
dba0: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
dbb0: 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
dbc0: 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76  .  ** the leftov
dbd0: 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20  er space at the 
dbe0: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
dbf0: 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e  e array can sign
dc00: 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
dc10: 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
dc20: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
dc30: 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
dc40: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
dc50: 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  do {.    nByte =
dc60: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20   0;.    p->aMem 
dc70: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
dc80: 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  aMem, nMem*sizeo
dc90: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
dca0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
dcb0: 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
dcc0: 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20  cSpace(p->aVar, 
dcd0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
dce0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
dcf0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
dd00: 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
dd10: 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67  e(p->apArg, nArg
dd20: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26  *sizeof(Mem*), &
dd30: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
dd40: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61  te);.    p->azVa
dd50: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
dd60: 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69  ->azVar, nVar*si
dd70: 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43  zeof(char*), &zC
dd80: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
dd90: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20  );.    p->apCsr 
dda0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
ddb0: 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73  apCsr, nCursor*s
ddc0: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
ddd0: 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  *),.            
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
ddf0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
de00: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65  e);.    p->aOnce
de10: 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Flag = allocSpac
de20: 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  e(p->aOnceFlag, 
de30: 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45  nOnce, &zCsr, zE
de40: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 23 69 66  nd, &nByte);.#if
de50: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
de60: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
de70: 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20  S.    p->anExec 
de80: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
de90: 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73  anExec, p->nOp*s
dea0: 69 7a 65 6f 66 28 69 36 34 29 2c 20 26 7a 43 73  izeof(i64), &zCs
deb0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
dec0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
ded0: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
dee0: 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74  p->pFree = sqlit
def0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
df00: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  b, nByte);.    }
df10: 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70  .    zCsr = p->p
df20: 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  Free;.    zEnd =
df30: 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20   &zCsr[nByte];. 
df40: 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26   }while( nByte &
df50: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
df60: 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75  led );..  p->nCu
df70: 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a  rsor = nCursor;.
df80: 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    p->nOnceFlag =
df90: 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d   nOnce;.  if( p-
dfa0: 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >aVar ){.    p->
dfb0: 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
dfc0: 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  ar;.    for(n=0;
dfd0: 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20   n<nVar; n++){. 
dfe0: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
dff0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
e000: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b  ;.      p->aVar[
e010: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
e020: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
e030: 7a 56 61 72 20 26 26 20 70 50 61 72 73 65 2d 3e  zVar && pParse->
e040: 6e 7a 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 70  nzVar>0 ){.    p
e050: 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65  ->nzVar = pParse
e060: 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d  ->nzVar;.    mem
e070: 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50  cpy(p->azVar, pP
e080: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e  arse->azVar, p->
e090: 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e  nzVar*sizeof(p->
e0a0: 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20  azVar[0]));.    
e0b0: 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61  memset(pParse->a
e0c0: 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d  zVar, 0, pParse-
e0d0: 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50  >nzVar*sizeof(pP
e0e0: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29  arse->azVar[0]))
e0f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
e100: 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d  Mem ){.    p->aM
e110: 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20  em--;           
e120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
e130: 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31  em[] goes from 1
e140: 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d  ..nMem */.    p-
e150: 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20  >nMem = nMem;   
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e170: 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20         not from 
e180: 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20  0..nMem-1 */.   
e190: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65   for(n=1; n<=nMe
e1a0: 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70  m; n++){.      p
e1b0: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20  ->aMem[n].flags 
e1c0: 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
e1d0: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e  .      p->aMem[n
e1e0: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d  ].db = db;.    }
e1f0: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69  .  }.  p->explai
e200: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  n = pParse->expl
e210: 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ain;.  sqlite3Vd
e220: 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a  beRewind(p);.}..
e230: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
e240: 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
e250: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
e260: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
e270: 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
e280: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
e290: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
e2a0: 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
e2b0: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29  VdbeCursor *pCx)
e2c0: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
e2d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
e2e0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  }.  sqlite3VdbeS
e2f0: 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62  orterClose(p->db
e300: 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43  , pCx);.  if( pC
e310: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71  x->pBt ){.    sq
e320: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
e330: 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f  pCx->pBt);.    /
e340: 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
e350: 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
e360: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
e370: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
e380: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c  .    ** the call
e390: 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c   above. */.  }el
e3a0: 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  se if( pCx->pCur
e3b0: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
e3c0: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
e3d0: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
e3e0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
e3f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
e400: 4c 54 41 42 4c 45 0a 20 20 65 6c 73 65 20 69 66  LTABLE.  else if
e410: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
e420: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
e430: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
e440: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
e450: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
e460: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
e470: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
e480: 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e   = pVtabCursor->
e490: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
e4a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 56 74 61      assert( pVta
e4b0: 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e  bCursor->pVtab->
e4c0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 56  nRef>0 );.    pV
e4d0: 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
e4e0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 70 4d  ->nRef--;.    pM
e4f0: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
e500: 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  tabCursor);.  }.
e510: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
e520: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
e530: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
e540: 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   frame..*/.stati
e550: 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73  c void closeCurs
e560: 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20  orsInFrame(Vdbe 
e570: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70  *p){.  if( p->ap
e580: 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Csr ){.    int i
e590: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
e5a0: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
e5b0: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72  ){.      VdbeCur
e5c0: 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43  sor *pC = p->apC
e5d0: 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  sr[i];.      if(
e5e0: 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73   pC ){.        s
e5f0: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
e600: 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20  rsor(p, pC);.   
e610: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
e620: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
e630: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
e640: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
e650: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
e660: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
e670: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
e680: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
e690: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
e6a0: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
e6b0: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
e6c0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
e6d0: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
e6e0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
e6f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
e700: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
e710: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
e720: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
e730: 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43  ame->v;.  closeC
e740: 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29  ursorsInFrame(v)
e750: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
e760: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
e770: 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78  STATUS.  v->anEx
e780: 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45  ec = pFrame->anE
e790: 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d  xec;.#endif.  v-
e7a0: 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72  >aOnceFlag = pFr
e7b0: 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a  ame->aOnceFlag;.
e7c0: 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    v->nOnceFlag =
e7d0: 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c   pFrame->nOnceFl
e7e0: 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70  ag;.  v->aOp = p
e7f0: 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d  Frame->aOp;.  v-
e800: 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  >nOp = pFrame->n
e810: 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20  Op;.  v->aMem = 
e820: 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20  pFrame->aMem;.  
e830: 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->nMem = pFrame
e840: 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43  ->nMem;.  v->apC
e850: 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43  sr = pFrame->apC
e860: 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72  sr;.  v->nCursor
e870: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73   = pFrame->nCurs
e880: 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73  or;.  v->db->las
e890: 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d  tRowid = pFrame-
e8a0: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d  >lastRowid;.  v-
e8b0: 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
e8c0: 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d  e->nChange;.  v-
e8d0: 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70  >db->nChange = p
e8e0: 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65  Frame->nDbChange
e8f0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
e900: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
e910: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
e920: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
e930: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
e940: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
e950: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
e960: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
e970: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
e980: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
e990: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
e9a0: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
e9b0: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
e9c0: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
e9d0: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
e9e0: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
e9f0: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
ea00: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
ea10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
ea20: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
ea30: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
ea40: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
ea50: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
ea60: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
ea70: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
ea80: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
ea90: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
eaa0: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
eab0: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
eac0: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20  re(pFrame);.    
ead0: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->pFrame = 0;. 
eae0: 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30     p->nFrame = 0
eaf0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
eb00: 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a  p->nFrame==0 );.
eb10: 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
eb20: 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20  Frame(p);.  if( 
eb30: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
eb40: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26  eleaseMemArray(&
eb50: 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e  p->aMem[1], p->n
eb60: 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  Mem);.  }.  whil
eb70: 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20  e( p->pDelFrame 
eb80: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
eb90: 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c   *pDel = p->pDel
eba0: 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44  Frame;.    p->pD
ebb0: 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e  elFrame = pDel->
ebc0: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
ebd0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
ebe0: 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a  ete(pDel);.  }..
ebf0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
ec00: 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69  auxdata allocati
ec10: 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ons made by the 
ec20: 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  VM */.  if( p->p
ec30: 41 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65  AuxData ) sqlite
ec40: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
ec50: 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  ta(p, -1, 0);.  
ec60: 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44  assert( p->pAuxD
ec70: 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ata==0 );.}../*.
ec80: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
ec90: 56 4d 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c  VM after a singl
eca0: 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  e run..*/.static
ecb0: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
ecc0: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
ecd0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
ece0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
ecf0: 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  BUG.  /* Execute
ed00: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
ed10: 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
ed20: 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43  hat the Vdbe.apC
ed30: 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56  sr[] and .  ** V
ed40: 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79  dbe.aMem[] array
ed50: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
ed60: 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20  een cleaned up. 
ed70: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
ed80: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f  f( p->apCsr ) fo
ed90: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
eda0: 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  sor; i++) assert
edb0: 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  ( p->apCsr[i]==0
edc0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65   );.  if( p->aMe
edd0: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  m ){.    for(i=1
ede0: 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  ; i<=p->nMem; i+
edf0: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d  +) assert( p->aM
ee00: 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d  em[i].flags==MEM
ee10: 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20  _Undefined );.  
ee20: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
ee30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
ee40: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
ee50: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
ee60: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
ee70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
ee80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
ee90: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ult columns that
eea0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
eeb0: 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a  d by this SQL.**
eec0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
eed0: 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63   is now set at c
eee0: 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74  ompile time, rat
eef0: 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a  her than during.
ef00: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
ef10: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
ef20: 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
ef30: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20  _column_count() 
ef40: 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64  can.** be called
ef50: 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65   on an SQL state
ef60: 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69  ment before sqli
ef70: 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76  te3_step()..*/.v
ef80: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
ef90: 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a  etNumCols(Vdbe *
efa0: 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d  p, int nResColum
efb0: 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  n){.  Mem *pColN
efc0: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ame;.  int n;.  
efd0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
efe0: 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d  >db;..  releaseM
eff0: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
f000: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
f010: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
f020: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f030: 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
f040: 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
f050: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70  n*COLNAME_N;.  p
f060: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28  ->nResColumn = (
f070: 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a  u16)nResColumn;.
f080: 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20    p->aColName = 
f090: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a  pColName = (Mem*
f0a0: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
f0b0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
f0c0: 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20  Mem)*n );.  if( 
f0d0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  p->aColName==0 )
f0e0: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
f0f0: 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
f100: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73   pColName->flags
f110: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
f120: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20   pColName->db = 
f130: 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e  p->db;.    pColN
f140: 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ame++;.  }.}../*
f150: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
f160: 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63   of the idx'th c
f170: 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75  olumn to be retu
f180: 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  rned by the SQL 
f190: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e  statement..** zN
f1a0: 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ame must be a po
f1b0: 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74  inter to a nul t
f1c0: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
f1d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
f1e0: 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61  l must be made a
f1f0: 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
f200: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
f210: 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cols()..**.** Th
f220: 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
f230: 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65  r, xDel, must be
f240: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44   one of SQLITE_D
f250: 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53  YNAMIC, SQLITE_S
f260: 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49  TATIC.** or SQLI
f270: 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66  TE_TRANSIENT. If
f280: 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59   it is SQLITE_DY
f290: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20  NAMIC, then the 
f2a0: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a  buffer pointed.*
f2b0: 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69  * to by zName wi
f2c0: 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73  ll be freed by s
f2d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77  qlite3DbFree() w
f2e0: 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
f2f0: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e  destroyed..*/.in
f300: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  t sqlite3VdbeSet
f310: 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20  ColName(.  Vdbe 
f320: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
f330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
f340: 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67  dbe being config
f350: 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ured */.  int id
f360: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
f370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
f380: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e  dex of column zN
f390: 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a  ame applies to *
f3a0: 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20  /.  int var,    
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
f3d0: 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e  he COLNAME_* con
f3e0: 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  stants */.  cons
f3f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f410: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
f420: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d  r containing nam
f430: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
f440: 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20  el)(void*)      
f450: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
f460: 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72  y management str
f470: 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20  ategy for zName 
f480: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
f490: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
f4a0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
f4b0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
f4c0: 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
f4d0: 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
f4e0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
f4f0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  iled ){.    asse
f500: 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44  rt( !zName || xD
f510: 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d  el!=SQLITE_DYNAM
f520: 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  IC );.    return
f530: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f540: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
f550: 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  aColName!=0 );. 
f560: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d   pColName = &(p-
f570: 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61  >aColName[idx+va
f580: 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d  r*p->nResColumn]
f590: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
f5a0: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
f5b0: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
f5c0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
f5d0: 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74   xDel);.  assert
f5e0: 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d  ( rc!=0 || !zNam
f5f0: 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e  e || (pColName->
f600: 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21  flags&MEM_Term)!
f610: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
f620: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65  c;.}../*.** A re
f630: 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
f640: 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d  saction may or m
f650: 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65  ay not be active
f660: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
f670: 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20  dle.** db. If a 
f680: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
f690: 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74  ctive, commit it
f6a0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a  . If there is a.
f6b0: 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
f6c0: 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f  tion spanning mo
f6d0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
f6e0: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
f6f0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73  routine.** takes
f700: 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73   care of the mas
f710: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63  ter journal tric
f720: 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  kery..*/.static 
f730: 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73  int vdbeCommit(s
f740: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
f750: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
f760: 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b   int nTrans = 0;
f770: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
f780: 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e  atabases with an
f790: 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72   active write-tr
f7a0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ansaction */.  i
f7b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
f7c0: 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
f7d0: 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65  mmit = 0;..#ifde
f7e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f7f0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
f800: 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e  With this option
f810: 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  , sqlite3VtabSyn
f820: 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  c() is defined t
f830: 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a  o be simply .  *
f840: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70  * SQLITE_OK so p
f850: 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20   is not used. . 
f860: 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
f870: 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69  AMETER(p);.#endi
f880: 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  f..  /* Before d
f890: 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
f8a0: 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
f8b0: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
f8c0: 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
f8d0: 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
f8e0: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
f8f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
f900: 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
f910: 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
f920: 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
f930: 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
f940: 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
f950: 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
f960: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
f970: 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
f980: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
f990: 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
f9a0: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
f9b0: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
f9c0: 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f  ync(db, p);..  /
f9d0: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65  * This loop dete
f9e0: 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68  rmines (a) if th
f9f0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68  e commit hook sh
fa00: 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
fa10: 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77  and.  ** (b) how
fa20: 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66   many database f
fa30: 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77  iles have open w
fa40: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
fa50: 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63  s, not .  ** inc
fa60: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20  luding the temp 
fa70: 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73  database. (b) is
fa80: 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75   important becau
fa90: 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20  se if more than 
faa0: 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61  .  ** one databa
fab0: 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f  se file has an o
fac0: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
fad0: 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20  ction, a master 
fae0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
faf0: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
fb00: 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d  r an atomic comm
fb10: 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  it..  */ .  for(
fb20: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
fb30: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
fb40: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
fb50: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
fb60: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
fb70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
fb80: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
fb90: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
fba0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
fbb0: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
fbc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
fbd0: 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20  reeEnter(pBt);. 
fbe0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
fbf0: 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
fc00: 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65  ock(sqlite3Btree
fc10: 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20  Pager(pBt));.   
fc20: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
fc30: 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  eave(pBt);.    }
fc40: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
fc50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fc60: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
fc70: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
fc80: 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
fc90: 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
fca0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
fcb0: 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
fcc0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
fcd0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
fce0: 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
fcf0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
fd00: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
fd10: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
fd20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fd30: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
fd40: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20  T_COMMITHOOK;.  
fd50: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
fd60: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
fd70: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
fd80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
fd90: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
fda0: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
fdb0: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
fdc0: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
fdd0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
fde0: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
fdf0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
fe00: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
fe10: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
fe20: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
fe30: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
fe40: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
fe50: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
fe60: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
fe70: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
fe80: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
fe90: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
fea0: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
feb0: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
fec0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
fed0: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
fee0: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
fef0: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
ff00: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
ff10: 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
ff20: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
ff30: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
ff40: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
ff50: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
ff60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
ff70: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
ff80: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
ff90: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
ffa0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
ffb0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
ffc0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
ffd0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
ffe0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
fff0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
10000 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
10010 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
10020 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
10030 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
10040 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
10050 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
10060 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
10070 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
10080 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
10090 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
100a0 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
100b0 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
100c0 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
100d0 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
100e0 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
100f0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
10100 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
10110 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
10120 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
10130 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
10140 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
10150 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
10160 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
10170 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10180 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
10190 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
101a0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
101b0 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
101c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
101d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
101e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
101f0 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
10200 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
10210 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
10220 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
10230 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
10240 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10250 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
10260 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
10270 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10280 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
10290 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
102a0 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
102b0 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23  omically..  */.#
102c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
102d0 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
102e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
102f0 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
10300 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  fs;.    int need
10310 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68  Sync = 0;.    ch
10320 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
10330 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
10340 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
10350 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
10360 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
10370 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
10380 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
10390 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
103a0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
103b0 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
103c0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
103d0 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ;.    int res;. 
103e0 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e     int retryCoun
103f0 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
10400 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  MainFile;..    /
10410 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
10420 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
10430 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e  ame */.    nMain
10440 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74  File = sqlite3St
10450 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65  rlen30(zMainFile
10460 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
10470 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
10480 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58  db, "%s-mjXXXXXX
10490 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  9XXz", zMainFile
104a0 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74  );.    if( zMast
104b0 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  er==0 ) return S
104c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
104d0 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20   do {.      u32 
104e0 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69  iRandom;.      i
104f0 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b  f( retryCount ){
10500 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
10510 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20  ryCount>100 ){. 
10520 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10530 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
10540 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73  , "MJ delete: %s
10550 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
10560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
10570 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
10580 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
10590 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
105a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74     }else if( ret
105b0 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20  ryCount==1 ){.  
105c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
105d0 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
105e0 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73   "MJ collide: %s
105f0 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
10600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10610 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b       retryCount+
10620 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
10630 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
10640 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52  of(iRandom), &iR
10650 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71  andom);.      sq
10660 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
10670 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69  3, &zMaster[nMai
10680 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58  nFile], "-mj%06X
10690 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20  9%02X",.        
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106b0 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e         (iRandom>
106c0 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52  >8)&0xffffff, iR
106d0 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20  andom&0xff);.   
106e0 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65     /* The antipe
106f0 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63  nultimate charac
10700 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65  ter of the maste
10710 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
10720 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
10730 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d  "9" to avoid nam
10740 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65  e collisions whe
10750 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65  n using 8+3 file
10760 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  names. */.      
10770 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b  assert( zMaster[
10780 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
10790 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27  zMaster)-3]=='9'
107a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
107b0 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61  3FileSuffix3(zMa
107c0 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29  inFile, zMaster)
107d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
107e0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
107f0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
10800 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
10810 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68  , &res);.    }wh
10820 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
10830 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20  OK && res );.   
10840 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  OK ){.      /* O
10860 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
10870 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
10880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
10890 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
108a0 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
108b0 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51  r, .          SQ
108c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
108d0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
108e0 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
108f0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
10900 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
10910 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
10920 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  AL, 0.      );. 
10930 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
10940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10950 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
10960 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
10970 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10980 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
10990 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
109a0 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
109b0 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
109c0 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
109d0 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
109e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
109f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
10a00 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
10a10 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
10a20 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
10a30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10a40 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
10a50 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
10a60 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
10a70 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
10a80 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10a90 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
10aa0 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
10ab0 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
10ac0 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
10ad0 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
10ae0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
10af0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
10b00 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
10b10 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
10b20 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
10b30 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
10b40 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
10b50 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
10b60 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
10b70 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
10b80 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
10b90 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29    if( zFile==0 )
10ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
10bb0 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
10bc0 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72   TEMP and :memor
10bd0 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
10be0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10bf0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b    assert( zFile[
10c00 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  0]!=0 );.       
10c10 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
10c20 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
10c30 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
10c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
10c50 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
10c60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
10c70 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10c80 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
10c90 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
10ca0 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
10cb0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
10cc0 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
10cd0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
10ce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
10cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10d00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
10d10 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
10d20 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
10d30 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
10d40 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
10d50 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10d60 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
10d70 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
10d80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10da0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
10db0 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
10dc0 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
10dd0 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
10de0 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
10df0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
10e00 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
10e10 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
10e20 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  ( needSync .    
10e30 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f   && 0==(sqlite3O
10e40 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
10e50 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26  istics(pMaster)&
10e60 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
10e70 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26  UENTIAL).     &&
10e80 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
10e90 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
10ea0 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  pMaster, SQLITE_
10eb0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20  SYNC_NORMAL)).  
10ec0 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
10ed0 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
10ee0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
10ef0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
10f00 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
10f10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
10f20 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
10f30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10f40 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
10f50 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
10f60 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
10f70 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
10f80 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
10f90 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
10fa0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10fb0 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
10fc0 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
10fd0 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
10fe0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
10ff0 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
11000 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
11010 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
11020 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
11030 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
11040 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
11050 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
11060 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
11070 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
11080 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
11090 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
110a0 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
110b0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
110c0 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
110d0 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
110e0 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
110f0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
11100 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
11110 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
11120 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
11130 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
11140 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
11150 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
11160 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
11170 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
11180 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
11190 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
111a0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
111b0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
111c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
111d0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
111e0 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
111f0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
11200 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11210 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
11220 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
11230 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
11240 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Y );.    if( rc!
11250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11260 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11270 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
11280 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11290 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
112a0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
112b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
112c0 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
112d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
112e0 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
112f0 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
11300 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
11310 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
11320 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
11330 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
11340 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
11350 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
11360 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
11370 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 65  Vfs, zMaster, ne
11380 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 73 71 6c  edSync);.    sql
11390 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
113a0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
113b0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
113c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
113d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
113e0 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
113f0 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73   and directories
11400 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
11410 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68  en synced, so th
11420 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
11430 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
11440 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
11450 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c  aseTwo() are onl
11460 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20  y closing files 
11470 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  and.    ** delet
11480 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
11490 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73  g journals. If s
114a0 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
114b0 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a  ong while.    **
114c0 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
114d0 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c  ng we don't real
114e0 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74  ly care. The int
114f0 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20  egrity of the.  
11500 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
11510 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72   is already guar
11520 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65  anteed, but some
11530 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f   stray 'cold' jo
11540 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61  urnals.    ** ma
11550 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e  y be lying aroun
11560 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  d. Returning an 
11570 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74  error code won't
11580 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20   help matters.. 
11590 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c     */.    disabl
115a0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
115b0 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
115c0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
115d0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72  alloc();.    for
115e0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
115f0 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
11600 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
11610 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
11620 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
11630 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11640 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
11650 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 1);.      }.
11660 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11670 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
11680 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  ();.    enable_s
11690 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
116a0 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  rs();..    sqlit
116b0 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
116c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
116d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
116e0 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
116f0 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  e checks that th
11700 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41  e sqlite3.nVdbeA
11710 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69  ctive count vari
11720 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
11730 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
11740 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
11750 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
11760 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
11770 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
11780 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
11790 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
117a0 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
117b0 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
117c0 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
117d0 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
117e0 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
117f0 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
11800 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
11810 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
11820 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
11830 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
11840 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
11850 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
11860 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
11870 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
11880 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  cnt = 0;.  int n
11890 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Write = 0;.  int
118a0 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20   nRead = 0;.  p 
118b0 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
118c0 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
118d0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  f( sqlite3_stmt_
118e0 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74  busy((sqlite3_st
118f0 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20  mt*)p) ){.      
11900 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
11910 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
11920 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
11930 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64    if( p->bIsRead
11940 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20  er ) nRead++;.  
11950 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
11960 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
11970 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64  rt( cnt==db->nVd
11980 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73  beActive );.  as
11990 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
119a0 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
119b0 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d    assert( nRead=
119c0 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
119d0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
119e0 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
119f0 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
11a00 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62  /*.** If the Vdb
11a10 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
11a20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f  first argument o
11a30 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e  pened a statemen
11a40 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  t-transaction,.*
11a50 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20  * close it now. 
11a60 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73  Argument eOp mus
11a70 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45  t be either SAVE
11a80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
11a90 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  r.** SAVEPOINT_R
11aa0 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73  ELEASE. If it is
11ab0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
11ac0 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ACK, then the st
11ad0 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
11ae0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
11af0 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73   back. If eOp is
11b00 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
11b10 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  SE, then the .**
11b20 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
11b30 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
11b40 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
11b50 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
11b60 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
11b70 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
11b80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
11b90 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49  * Otherwise SQLI
11ba0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
11bb0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
11bc0 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
11bd0 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c   int eOp){.  sql
11be0 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d  ite3 *const db =
11bf0 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
11c00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
11c10 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65   /* If p->iState
11c20 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  ment is greater 
11c30 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
11c40 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64  this Vdbe opened
11c50 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65   a .  ** stateme
11c60 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  nt transaction t
11c70 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  hat should be cl
11c80 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f  osed here. The o
11c90 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  nly exception.  
11ca0 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f  ** is that an IO
11cb0 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20   error may have 
11cc0 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e  occurred, causin
11cd0 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
11ce0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
11cf0 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
11d00 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
11d10 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
11d20 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
11d30 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
11d40 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
11d50 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
11d60 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
11d70 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
11d80 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
11d90 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
11da0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
11db0 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
11dc0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
11dd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
11de0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
11df0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
11e00 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
11e10 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
11e20 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
11e30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11e40 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
11e50 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
11e60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
11e70 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11e80 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
11e90 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
11ea0 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
11eb0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
11ec0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
11ed0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
11ee0 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
11ef0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
11f00 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
11f10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11f20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
11f30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11f40 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
11f50 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
11f60 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
11f70 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
11f80 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
11f90 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
11fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11fb0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
11fc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11fd0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
11fe0 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
11ff0 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
12000 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  = 0;..    if( rc
12010 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12020 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
12030 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12040 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
12050 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
12060 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
12070 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
12080 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
12090 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
120a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
120b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
120c0 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
120d0 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
120e0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
120f0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
12100 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
12110 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
12120 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
12130 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73  rolled back, als
12140 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20  o restore the . 
12150 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68     ** database h
12160 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
12170 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
12180 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  er to the value 
12190 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20  it had when .   
121a0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
121b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
121c0 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
121d0 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
121e0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
121f0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
12200 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
12210 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
12220 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
12230 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  mmCons = p->nStm
12240 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20  tDefImmCons;.   
12250 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12260 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
12270 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
12280 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
12290 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62  saction opened b
122a0 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  y the database .
122b0 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69  ** handle associ
122c0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
122d0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
122e0 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20  gument is about 
122f0 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74  to be .** commit
12300 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72  ted. If there ar
12310 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65  e outstanding de
12320 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
12330 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ey constraint.**
12340 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74   violations, ret
12350 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
12360 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
12370 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
12380 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
12390 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74  anding FK violat
123a0 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75  ions and this fu
123b0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
123c0 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ** SQLITE_ERROR,
123d0 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
123e0 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c  of the VM to SQL
123f0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
12400 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64  OREIGNKEY.** and
12410 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20   write an error 
12420 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
12430 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
12440 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
12450 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12460 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
12470 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
12480 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
12490 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
124a0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
124b0 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
124c0 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72  d && (db->nDefer
124d0 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66  redCons+db->nDef
124e0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29  erredImmCons)>0)
124f0 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72   .   || (!deferr
12500 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73  ed && p->nFkCons
12510 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a  traint>0) .  ){.
12520 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
12530 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
12540 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d  REIGNKEY;.    p-
12550 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
12560 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c  E_Abort;.    sql
12570 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
12580 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   "FOREIGN KEY co
12590 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
125a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
125b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
125c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
125d0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
125e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
125f0 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
12600 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
12610 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
12620 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
12630 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
12640 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
12650 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
12660 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
12670 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
12680 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
12690 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
126a0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
126b0 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
126c0 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
126d0 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
126e0 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
126f0 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
12700 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20  ITE_MAGIC_HALT. 
12710 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20   It is harmless 
12720 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20  to.** call this 
12730 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20  on a VM that is 
12740 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
12750 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a  GIC_HALT state..
12760 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
12770 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
12780 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
12790 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
127a0 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
127b0 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
127c0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
127d0 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
127e0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
127f0 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
12800 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
12810 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
12820 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
12830 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
12840 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
12850 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12870 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65  /* Used to store
12880 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72   transient retur
12890 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c  n codes */.  sql
128a0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
128b0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
128c0 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
128d0 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
128e0 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
128f0 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
12900 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
12910 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
12920 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
12930 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
12940 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
12950 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
12960 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
12970 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
12980 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
12990 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
129a0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
129b0 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
129c0 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
129d0 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
129e0 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
129f0 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
12a00 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
12a10 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
12a20 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
12a30 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
12a40 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
12a50 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
12a60 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
12a70 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
12a80 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
12a90 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
12aa0 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
12ab0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
12ac0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12ad0 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
12ae0 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
12af0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
12b00 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
12b10 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  EM;.  }.  if( p-
12b20 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d  >aOnceFlag ) mem
12b30 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  set(p->aOnceFlag
12b40 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61  , 0, p->nOnceFla
12b50 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75  g);.  closeAllCu
12b60 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20  rsors(p);.  if( 
12b70 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
12b80 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
12b90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12ba0 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74  ;.  }.  checkAct
12bb0 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
12bc0 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20  .  /* No commit 
12bd0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
12be0 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ed if the progra
12bf0 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20  m never started 
12c00 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53  or if the.  ** S
12c10 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65  QL statement doe
12c20 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72  s not read or wr
12c30 69 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ite a database f
12c40 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ile.  */.  if( p
12c50 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49  ->pc>=0 && p->bI
12c60 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69  sReader ){.    i
12c70 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69  nt mrc;   /* Pri
12c80 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20  mary error code 
12c90 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20  from p->rc */.  
12ca0 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74    int eStatement
12cb0 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  Op = 0;.    int 
12cc0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20  isSpecialError; 
12cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
12ce0 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27  t to true if a '
12cf0 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a  special' error *
12d00 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61  /..    /* Lock a
12d10 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62  ll btrees used b
12d20 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
12d30 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
12d40 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20  beEnter(p);..   
12d50 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
12d60 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
12d70 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
12d80 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
12d90 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  f;.    isSpecial
12da0 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
12db0 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
12dc0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
12df0 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
12e00 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
12e10 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
12e20 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
12e30 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
12e40 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20  y was read-only 
12e50 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
12e60 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54  de is SQLITE_INT
12e70 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a  ERRUPT, .      *
12e80 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73  * no rollback is
12e90 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65   necessary. Othe
12ea0 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20  rwise, at least 
12eb0 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  a savepoint .   
12ec0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
12ed0 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  n must be rolled
12ee0 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65   back to restore
12ef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
12f00 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   a .      ** con
12f10 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
12f20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
12f30 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61   Even if the sta
12f40 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f  tement is read-o
12f50 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72  nly, it is impor
12f60 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a  tant to perform.
12f70 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65        ** a state
12f80 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  ment or transact
12f90 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  ion rollback ope
12fa0 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
12fb0 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f  rror .      ** o
12fc0 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72  ccurred while wr
12fd0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
12fe0 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61  rnal, sub-journa
12ff0 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20  l or database.  
13000 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70      ** file as p
13010 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74  art of an effort
13020 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68   to free up cach
13030 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e  e space (see fun
13040 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70  ction.      ** p
13050 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20  agerStress() in 
13060 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f  pager.c), the ro
13070 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72  llback is requir
13080 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20  ed to restore . 
13090 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65       ** the page
130a0 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e  r to a consisten
130b0 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
130c0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  /.      if( !p->
130d0 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  readOnly || mrc!
130e0 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
130f0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
13100 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f   (mrc==SQLITE_NO
13110 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
13120 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75  TE_FULL) && p->u
13130 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
13140 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
13150 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
13160 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
13170 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13180 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
13190 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
131a0 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
131b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
131c0 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
131d0 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
131e0 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
131f0 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
13200 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
13210 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
13220 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
13230 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
13240 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
13250 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
13260 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13270 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
13280 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
13290 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
132a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  1;.          p->
132b0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
132c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
132d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
132e0 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65  ck for immediate
132f0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f   foreign key vio
13300 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  lations. */.    
13310 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
13330 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
13340 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
13350 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
13360 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
13370 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
13380 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
13390 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a  ve writer .    *
133a0 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f  * VM, then we do
133b0 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
133c0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
133d0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
133e0 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
133f0 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
13400 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
13410 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
13420 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
13430 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
13440 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
13450 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
13460 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
13470 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
13480 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
13490 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
134a0 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e  nVdbeWrite==(p->
134b0 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
134c0 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
134d0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
134e0 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
134f0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
13500 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
13510 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13520 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
13530 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
13540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
13560 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
13570 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
13580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13590 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
135a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
135b0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
135c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
135d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
135e0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
135f0 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  NKEY;.        }e
13600 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20  lse{ .          
13610 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
13620 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
13630 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
13640 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
13650 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
13660 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
13670 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  L' constraint an
13680 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  d there are no d
13690 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a  eferred foreign.
136a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79            ** key
136b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
136c0 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
136d0 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
136e0 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
136f0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
13700 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
13710 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
13720 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
13730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
13740 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
13750 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c  SY && p->readOnl
13760 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
13770 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
13780 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
13790 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
137a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
137b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
137c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
137d0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
137e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
137f0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
13800 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
13810 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
13820 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13830 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
13840 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
13850 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
13860 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
13870 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
13880 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
13890 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20  LITE_DeferFKs;. 
138a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
138b0 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
138c0 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
138d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
138e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
138f0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
13900 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20   SQLITE_OK);.   
13910 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
13920 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13930 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
13940 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
13950 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
13960 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
13970 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13980 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
13990 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
139a0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
139b0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
139c0 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
139d0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
139e0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
139f0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
13a00 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
13a10 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
13a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
13a40 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
13a50 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
13a60 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
13a70 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
13a80 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
13a90 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
13aa0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
13ab0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
13ac0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
13ad0 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
13ae0 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
13af0 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
13b00 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
13b10 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
13b20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
13b30 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
13b40 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
13b50 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
13b60 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
13b70 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
13b80 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
13b90 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
13ba0 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
13bb0 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
13bc0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
13bd0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
13be0 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
13bf0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
13c00 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
13c10 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
13c20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
13c30 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
13c40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
13c50 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
13c60 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
13c70 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
13c80 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
13c90 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
13ca0 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->rc&0xff)==SQLI
13cb0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
13cc0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
13cd0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
13ce0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13cf0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
13d00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72            p->zEr
13d10 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
13d20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
13d30 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
13d40 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
13d50 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
13d60 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
13d70 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
13d80 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
13d90 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
13da0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
13db0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
13dc0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
13dd0 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
13de0 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
13df0 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d  TE and no statem
13e00 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
13e10 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
13e20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64  rolled back, upd
13e30 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
13e40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e   connection chan
13e50 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge-counter. .   
13e60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
13e70 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20  hangeCntOn ){.  
13e80 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
13e90 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f  ntOp!=SAVEPOINT_
13ea0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
13eb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
13ec0 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
13ed0 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
13ee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13ef0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
13f00 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
13f10 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
13f20 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
13f30 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
13f40 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
13f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
13f60 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ave(p);.  }..  /
13f70 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
13f80 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
13f90 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
13fa0 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
13fb0 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
13fc0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
13fd0 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a  >nVdbeActive--;.
13fe0 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
13ff0 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65  Only ) db->nVdbe
14000 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28  Write--;.    if(
14010 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
14020 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b  db->nVdbeRead--;
14030 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
14040 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62  >nVdbeActive>=db
14050 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20  ->nVdbeRead );. 
14060 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
14070 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56  VdbeRead>=db->nV
14080 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20  dbeWrite );.    
14090 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
140a0 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d  eWrite>=0 );.  }
140b0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
140c0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
140d0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
140e0 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
140f0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
14100 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
14110 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
14120 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
14130 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
14140 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
14150 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
14160 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
14170 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
14180 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
14190 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
141a0 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
141b0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
141c0 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
141d0 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
141e0 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
141f0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
14200 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
14210 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
14220 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
14230 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
14240 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
14250 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
14260 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
14270 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
14280 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
14290 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
142a0 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
142b0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
142c0 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
142d0 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
142e0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
142f0 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
14300 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
14310 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
14320 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
14330 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
14340 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
14350 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
14360 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
14370 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
14380 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14390 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
143a0 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
143b0 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
143c0 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
143d0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
143e0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
143f0 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
14400 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
14410 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
14420 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
14430 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
14440 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
14450 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
14460 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14470 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
14480 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
14490 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
144a0 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
144b0 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
144c0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
144d0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
144e0 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
144f0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
14500 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
14510 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
14520 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
14530 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63  ){.    u8 malloc
14540 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  Failed = db->mal
14550 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73  locFailed;.    s
14560 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
14570 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
14580 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  f( db->pErr==0 )
14590 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69   db->pErr = sqli
145a0 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
145b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
145c0 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
145d0 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
145e0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
145f0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
14600 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
14610 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
14620 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
14630 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69  iled = mallocFai
14640 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72  led;.    db->err
14650 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c  Code = rc;.  }el
14660 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
14670 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20  rror(db, rc);.  
14680 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
14690 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
146a0 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a  ENABLE_SQLLOG./*
146b0 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45  .** If an SQLITE
146c0 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68  _CONFIG_SQLLOG h
146d0 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65  ook is registere
146e0 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73  d and the VM has
146f0 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69   been run, .** i
14700 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  nvoke it..*/.sta
14710 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76  tic void vdbeInv
14720 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a  okeSqllog(Vdbe *
14730 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  v){.  if( sqlite
14740 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
14750 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d  qllog && v->rc==
14760 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e  SQLITE_OK && v->
14770 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30  zSql && v->pc>=0
14780 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
14790 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65  xpanded = sqlite
147a0 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76  3VdbeExpandSql(v
147b0 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20  , v->zSql);.    
147c0 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69  assert( v->db->i
147d0 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
147e0 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64     if( zExpanded
147f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14800 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
14810 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20  qllog(.         
14820 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14830 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
14840 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65   v->db, zExpande
14850 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20  d, 1.      );.  
14860 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14870 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  e(v->db, zExpand
14880 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ed);.    }.  }.}
14890 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
148a0 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
148b0 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
148c0 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
148d0 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
148e0 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
148f0 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
14900 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
14910 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
14920 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
14930 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
14940 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
14950 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
14960 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
14970 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
14980 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
14990 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
149a0 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
149b0 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
149c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
149d0 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
149e0 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
149f0 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
14a00 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
14a10 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
14a20 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
14a30 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
14a40 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
14a50 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
14a60 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
14a70 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
14a80 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
14a90 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
14aa0 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
14ab0 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
14ac0 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
14ad0 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
14ae0 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
14af0 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
14b00 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
14b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
14b20 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t(p);..  /* If t
14b30 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72  he VDBE has be r
14b40 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c  un even partiall
14b50 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  y, then transfer
14b60 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
14b70 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d    ** and error m
14b80 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20  essage from the 
14b90 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61  VDBE into the ma
14ba0 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
14bb0 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a  cture.  But.  **
14bc0 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73   if the VDBE has
14bd0 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74   just been set t
14be0 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f  o run but has no
14bf0 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  t actually execu
14c00 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73  ted any.  ** ins
14c10 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c  tructions yet, l
14c20 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61  eave the main da
14c30 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66  tabase error inf
14c40 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  ormation unchang
14c50 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
14c60 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76  ->pc>=0 ){.    v
14c70 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
14c80 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
14c90 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
14ca0 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
14cb0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
14cc0 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
14cd0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
14ce0 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  if( p->runOnlyOn
14cf0 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20  ce ) p->expired 
14d00 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
14d10 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
14d20 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
14d30 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
14d40 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
14d50 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
14d60 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
14d70 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
14d80 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
14d90 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
14da0 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
14db0 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
14dc0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
14dd0 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
14de0 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
14df0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
14e00 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d  orWithMsg(db, p-
14e10 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20  >rc, p->zErrMsg 
14e20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a  ? "%s" : 0, p->z
14e30 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
14e40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
14e50 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
14e60 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
14e70 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
14e80 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
14e90 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
14ea0 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
14eb0 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
14ec0 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
14ed0 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
14ee0 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65   run..  */.#ifde
14ef0 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
14f00 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
14f10 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
14f20 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
14f30 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
14f40 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
14f50 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
14f60 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
14f70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
14f80 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
14f90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
14fa0 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
14fb0 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
14fc0 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
14fd0 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
14fe0 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29     if( p->zSql )
14ff0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
15000 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  , pc = 0;.      
15010 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
15020 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66  -- ");.        f
15030 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e  or(i=0; (c = p->
15040 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  zSql[i])!=0; i++
15050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
15060 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc=='\n' ) fpri
15070 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
15080 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28  .          putc(
15090 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  c, out);.       
150a0 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20     pc = c;.     
150b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
150c0 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc!='\n' ) fpri
150d0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
150e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
150f0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
15100 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
15110 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20  har zHdr[100];. 
15120 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
15130 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
15140 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75  Hdr), zHdr, "%6u
15150 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c   %12llu %8llu ",
15160 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
15170 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
15180 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
15190 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
151a0 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
151b0 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
151c0 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
151d0 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
151e0 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
151f0 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48  tf(out, "%s", zH
15200 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dr);.        sql
15210 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
15220 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
15230 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
15240 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
15250 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15260 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69  .  p->iCurrentTi
15270 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67  me = 0;.  p->mag
15280 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
15290 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70  INIT;.  return p
152a0 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61  ->rc & db->errMa
152b0 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  sk;.}. ./*.** Cl
152c0 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
152d0 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
152e0 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
152f0 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
15300 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
15310 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
15320 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
15330 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
15340 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
15350 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
15360 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
15370 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15380 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  K;.  if( p->magi
15390 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
153a0 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  N || p->magic==V
153b0 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
153c0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
153d0 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a  e3VdbeReset(p);.
153e0 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20      assert( (rc 
153f0 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b  & p->db->errMask
15400 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73  )==rc );.  }.  s
15410 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
15420 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
15430 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61  ;.}../*.** If pa
15440 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c  rameter iOp is l
15450 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
15460 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  hen invoke the d
15470 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a  estructor for.**
15480 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64   all auxiliary d
15490 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72  ata pointers cur
154a0 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79  rently cached by
154b0 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
154c0 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  s.** the first a
154d0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  rgument..**.** O
154e0 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65  r, if iOp is gre
154f0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
15500 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  al to zero, then
15510 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
15520 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b  is.** only invok
15530 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78  ed for those aux
15540 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
15550 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20  ters created by 
15560 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e  the user .** fun
15570 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79  ction invoked by
15580 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e   the OP_Function
15590 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72   opcode at instr
155a0 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a  uction iOp of .*
155b0 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20  * VM pVdbe, and 
155c0 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a  only then if:.**
155d0 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73  .**    * the ass
155e0 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  ociated function
155f0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
15600 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20  e 32nd or later 
15610 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20  (counting.**    
15620 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72    from left to r
15630 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20  ight), or.**.** 
15640 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70     * the corresp
15650 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72  onding bit in ar
15660 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63  gument mask is c
15670 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20  lear (where the 
15680 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75  first.**      fu
15690 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
156a0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
156b0 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a  bit 0 etc.)..*/.
156c0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
156d0 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64  DeleteAuxData(Vd
156e0 62 65 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69  be *pVdbe, int i
156f0 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20  Op, int mask){. 
15700 20 41 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20   AuxData **pp = 
15710 26 70 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61  &pVdbe->pAuxData
15720 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29  ;.  while( *pp )
15730 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70  {.    AuxData *p
15740 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69  Aux = *pp;.    i
15750 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20  f( (iOp<0).     
15760 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69  || (pAux->iOp==i
15770 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72  Op && (pAux->iAr
15780 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26  g>31 || !(mask &
15790 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d   MASKBIT32(pAux-
157a0 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b  >iArg)))).    ){
157b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
157c0 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20   pAux->iArg==31 
157d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  );.      if( pAu
157e0 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20  x->xDelete ){.  
157f0 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
15800 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  ete(pAux->pAux);
15810 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
15820 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74  pp = pAux->pNext
15830 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
15840 62 46 72 65 65 28 70 56 64 62 65 2d 3e 64 62 2c  bFree(pVdbe->db,
15850 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73   pAux);.    }els
15860 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41  e{.      pp= &pA
15870 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ux->pNext;.    }
15880 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
15890 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
158a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
158b0 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
158c0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
158d0 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20  ment,.** except 
158e0 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  for object itsel
158f0 66 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73  f, which is pres
15900 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  erved..**.** The
15910 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
15920 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
15930 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62  n and sqlite3Vdb
15940 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61  eDelete() is tha
15950 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28  t.** VdbeDelete(
15960 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74  ) also unlinks t
15970 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
15980 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73   list of VMs ass
15990 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
159a0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
159b0 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  nection and free
159c0 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73  s the object its
159d0 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  elf..*/.void sql
159e0 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
159f0 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
15a00 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62   Vdbe *p){.  Sub
15a10 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a  Program *pSub, *
15a20 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  pNext;.  int i;.
15a30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d    assert( p->db=
15a40 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20  =0 || p->db==db 
15a50 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
15a60 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d  rray(p->aVar, p-
15a70 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73  >nVar);.  releas
15a80 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
15a90 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
15aa0 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
15ab0 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70  .  for(pSub=p->p
15ac0 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70  Program; pSub; p
15ad0 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  Sub=pNext){.    
15ae0 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e  pNext = pSub->pN
15af0 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65  ext;.    vdbeFre
15b00 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75  eOpArray(db, pSu
15b10 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f  b->aOp, pSub->nO
15b20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
15b30 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b  bFree(db, pSub);
15b40 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  .  }.  for(i=p->
15b50 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69  nzVar-1; i>=0; i
15b60 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  --) sqlite3DbFre
15b70 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69  e(db, p->azVar[i
15b80 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70  ]);.  vdbeFreeOp
15b90 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70  Array(db, p->aOp
15ba0 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c  , p->nOp);.  sql
15bb0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
15bc0 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
15bd0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15be0 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c   p->zSql);.  sql
15bf0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
15c00 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 64 65 66  ->pFree);.#ifdef
15c10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
15c20 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
15c30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
15c40 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Scan; i++){.    
15c50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15c60 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e  , p->aScan[i].zN
15c70 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
15c80 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
15c90 3e 61 53 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a  >aScan);.#endif.
15ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
15cb0 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
15cc0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
15cd0 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
15ce0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
15cf0 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  b;..  if( NEVER(
15d00 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  p==0) ) return;.
15d10 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
15d20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15d30 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
15d40 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
15d50 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63  e3VdbeClearObjec
15d60 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20  t(db, p);.  if( 
15d70 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
15d80 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
15d90 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  = p->pNext;.  }e
15da0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
15db0 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b   db->pVdbe==p );
15dc0 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d  .    db->pVdbe =
15dd0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
15de0 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
15df0 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
15e00 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
15e10 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
15e20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41  = VDBE_MAGIC_DEA
15e30 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a  D;.  p->db = 0;.
15e40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15e50 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
15e60 20 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20   The cursor "p" 
15e70 68 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65  has a pending se
15e80 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  ek operation tha
15e90 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
15ea0 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75  en.** carried ou
15eb0 74 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72  t.  Seek the cur
15ec0 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20  sor now.  If an 
15ed0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
15ee0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72  turn.** the appr
15ef0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
15f00 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
15f10 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
15f20 45 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64  E handleDeferred
15f30 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
15f40 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73  r *p){.  int res
15f50 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
15f60 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72  ITE_TEST.  exter
15f70 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
15f80 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
15f90 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  if.  assert( p->
15fa0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
15fb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
15fc0 73 54 61 62 6c 65 20 29 3b 0a 20 20 72 63 20 3d  sTable );.  rc =
15fd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
15fe0 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70  etoUnpacked(p->p
15ff0 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
16000 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
16010 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  res);.  if( rc )
16020 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
16030 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
16040 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
16050 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51  _BKPT;.#ifdef SQ
16060 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
16070 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
16080 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e  ++;.#endif.  p->
16090 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
160a0 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74   0;.  p->cacheSt
160b0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
160c0 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  LE;.  return SQL
160d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
160e0 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d   Something has m
160f0 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20  oved cursor "p" 
16100 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d  out of place.  M
16110 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20  aybe the row it 
16120 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  was.** pointed t
16130 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  o was deleted ou
16140 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e  t from under it.
16150 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62    Or maybe the b
16160 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61  tree was.** reba
16170 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65  lanced.  Whateve
16180 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79  r the cause, try
16190 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20   to restore "p" 
161a0 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a  to the place it.
161b0 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  ** is supposed t
161c0 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20  o be pointing.  
161d0 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64  If the row was d
161e0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
161f0 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72  under the.** cur
16200 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72  sor, set the cur
16210 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
16220 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73  a NULL row..*/.s
16230 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
16240 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
16250 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65  MovedCursor(Vdbe
16260 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
16270 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  t isDifferentRow
16280 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  , rc;.  assert( 
16290 70 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  p->pCursor!=0 );
162a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
162b0 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
162c0 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  Moved(p->pCursor
162d0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
162e0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
162f0 73 74 6f 72 65 28 70 2d 3e 70 43 75 72 73 6f 72  store(p->pCursor
16300 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f  , &isDifferentRo
16310 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74  w);.  p->cacheSt
16320 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
16330 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66  LE;.  if( isDiff
16340 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75  erentRow ) p->nu
16350 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74  llRow = 1;.  ret
16360 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16370 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65   Check to ensure
16380 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
16390 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74   is valid.  Rest
163a0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ore the cursor.*
163b0 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52  * if need be.  R
163c0 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72  eturn any I/O er
163d0 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ror from the res
163e0 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  tore operation..
163f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
16400 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
16410 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
16420 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
16430 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
16440 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a  (p->pCursor) ){.
16450 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
16460 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b  eMovedCursor(p);
16470 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
16480 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16490 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
164a0 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64  cursor p is read
164b0 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  y to read or wri
164c0 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68  te the row to wh
164d0 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61  ich it.** was la
164e0 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20  st positioned.  
164f0 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
16500 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66  code if an OOM f
16510 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f  ault or I/O erro
16520 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73  r.** prevents us
16530 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e   from positionin
16540 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
16550 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69  its correct posi
16560 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
16570 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
16580 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
16590 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
165a0 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
165b0 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49  * MoveTo now.  I
165c0 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e  f no move is pen
165d0 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73  ding, check to s
165e0 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61  ee if the row ha
165f0 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65  s been.** delete
16600 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
16610 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20   the cursor and 
16620 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20  if it has, mark 
16630 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20  the row as.** a 
16640 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  NULL row..**.** 
16650 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
16660 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
16670 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  g to the correct
16680 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f   row and that ro
16690 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65  w has.** not bee
166a0 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
166b0 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
166c0 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  sor, then this r
166d0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
166e0 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
166f0 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
16700 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
16710 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72  {.  if( p->defer
16720 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
16730 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65   return handleDe
16740 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b  ferredMoveto(p);
16750 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 43  .  }.  if( p->pC
16760 75 72 73 6f 72 20 26 26 20 73 71 6c 69 74 65 33  ursor && sqlite3
16770 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
16780 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20  ved(p->pCursor) 
16790 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
167a0 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
167b0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
167c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
167d0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
167e0 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
167f0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
16800 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
16810 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16820 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
16830 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
16840 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
16850 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
16860 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16870 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
16880 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
16890 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
168a0 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
168b0 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
168c0 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
168d0 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
168e0 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
168f0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
16900 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
16910 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
16920 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
16930 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
16940 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
16950 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
16960 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
16970 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
16980 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
16990 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
169a0 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
169b0 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
169c0 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
169d0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
169e0 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
169f0 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
16a00 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
16a10 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
16a20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
16a30 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
16a40 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
16a50 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
16a60 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
16a70 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
16a80 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
16a90 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
16aa0 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79   blob separately
16ab0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
16ac0 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
16ad0 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
16ae0 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
16af0 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
16b00 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
16b10 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
16b20 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
16b30 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
16b40 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
16b50 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
16b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
16b70 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
16b80 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
16b90 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
16ba0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
16bb0 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
16bc0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
16bd0 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
16be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bf0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
16c00 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
16c10 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
16c20 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
16c30 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
16c40 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
16c50 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
16c60 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
16c70 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
16c80 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
16c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ca0 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
16cb0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
16cc0 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
16cd0 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
16ce0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
16cf0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
16d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d10 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
16d20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
16d30 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
16d40 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
16d50 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
16d60 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
16d70 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
16d80 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
16d90 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
16da0 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
16db0 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dd0 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
16de0 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
16df0 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
16e00 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
16e10 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
16e20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
16e30 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
16e40 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
16e50 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
16e60 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
16e70 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
16e80 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
16e90 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
16ea0 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
16eb0 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
16ec0 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
16ed0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16ee0 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
16ef0 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
16f00 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
16f10 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16f20 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
16f30 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
16f40 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
16f50 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
16f60 20 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 66   u32 n;..  if( f
16f70 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
16f80 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16f90 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
16fa0 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
16fb0 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
16fc0 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
16fd0 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
16fe0 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
16ff0 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
17000 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
17010 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
17020 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
17030 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
17040 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d  i<0 ){.      u =
17050 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ~i;.    }else{.
17060 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20        u = i;.   
17070 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32   }.    if( u<=12
17080 37 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  7 ){.      retur
17090 6e 20 28 28 69 26 31 29 3d 3d 69 20 26 26 20 66  n ((i&1)==i && f
170a0 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f  ile_format>=4) ?
170b0 20 38 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a 20   8+(u32)u : 1;. 
170c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
170d0 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32  32767 ) return 2
170e0 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  ;.    if( u<=838
170f0 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b  8607 ) return 3;
17100 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
17110 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20  483647 ) return 
17120 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41  4;.    if( u<=MA
17130 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e  X_6BYTE ) return
17140 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   5;.    return 6
17150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
17160 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
17170 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
17180 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
17190 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
171a0 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
171b0 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
171c0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
171d0 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75  n>=0 );.  n = (u
171e0 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66  32)pMem->n;.  if
171f0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
17200 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
17210 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
17220 7d 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  }.  return ((n*2
17230 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
17240 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
17250 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  }../*.** The siz
17260 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79  es for serial ty
17270 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32  pes less than 12
17280 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
17290 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c   u8 sqlite3Small
172a0 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a  TypeSizes[] = {.
172b0 20 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c    0, 1, 2, 3, 4,
172c0 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20   6, 8, 8, 0, 0, 
172d0 30 2c 20 30 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  0, 0.};../*.** R
172e0 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
172f0 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
17300 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
17310 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
17320 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73  l-type..*/.u32 s
17330 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17340 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69  TypeLen(u32 seri
17350 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20  al_type){.  if( 
17360 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
17370 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
17380 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
17390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
173a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
173b0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
173c0 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
173d0 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
173e0 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
173f0 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
17400 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
17410 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
17420 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
17430 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
17440 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
17450 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
17460 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
17470 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
17480 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
17490 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
174a0 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
174b0 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
174c0 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
174d0 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
174e0 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
174f0 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
17500 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
17510 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
17520 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
17530 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
17540 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
17550 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
17560 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
17570 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
17580 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
17590 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
175a0 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
175b0 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
175c0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
175d0 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
175e0 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
175f0 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
17600 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
17610 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
17620 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
17630 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
17640 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
17650 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
17660 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
17670 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
17680 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
17690 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
176a0 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
176b0 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
176c0 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
176d0 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
176e0 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
176f0 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
17700 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
17710 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
17720 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
17730 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
17740 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
17750 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
17760 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
17770 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
17780 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
17790 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
177a0 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
177b0 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
177c0 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
177d0 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
177e0 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
177f0 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
17800 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
17810 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
17820 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
17830 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
17840 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
17850 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
17860 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
17870 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
17880 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
17890 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
178a0 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
178b0 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
178c0 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
178d0 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
178e0 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
178f0 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
17900 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
17910 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
17920 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
17930 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
17940 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
17950 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
17960 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
17970 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
17980 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
17990 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
179a0 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
179b0 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
179c0 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
179d0 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
179e0 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
179f0 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
17a00 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
17a10 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
17a20 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
17a30 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
17a40 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
17a50 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
17a60 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
17a70 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
17a80 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
17a90 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
17aa0 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
17ab0 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
17ac0 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
17ad0 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
17ae0 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
17af0 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
17b00 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
17b10 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
17b20 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
17b30 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
17b40 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
17b50 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
17b60 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
17b70 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
17b80 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
17b90 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
17ba0 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
17bb0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
17bc0 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
17bd0 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
17be0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
17bf0 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
17c00 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
17c10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
17c20 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
17c30 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
17c40 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
17c50 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
17c60 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c   buf[].  The cal
17c70 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
17c80 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61  le.** for alloca
17c90 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63  ting enough spac
17ca0 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f  e to buf[] to ho
17cb0 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
17cc0 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a  eld, exclusive.*
17cd0 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75  * of the pMem->u
17ce0 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72  .nZero bytes for
17cf0 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75   a MEM_Zero valu
17d00 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
17d10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
17d20 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
17d30 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
17d40 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
17d50 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
17d60 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
17d70 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
17d80 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
17d90 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
17da0 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
17db0 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
17dc0 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
17dd0 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
17de0 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75  uf, Mem *pMem, u
17df0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
17e00 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f  .  u32 len;..  /
17e10 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
17e20 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
17e30 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
17e40 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
17e50 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33     u64 v;.    u3
17e60 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  2 i;.    if( ser
17e70 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
17e80 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
17e90 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
17ea0 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20  Mem->u.r) );.   
17eb0 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
17ec0 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66  Mem->u.r, sizeof
17ed0 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
17ee0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
17ef0 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
17f00 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
17f10 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
17f20 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
17f30 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
17f40 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20  erial_type];.   
17f50 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
17f60 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75      do{.      bu
17f70 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26  f[--i] = (u8)(v&
17f80 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e  0xFF);.      v >
17f90 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65  >= 8;.    }while
17fa0 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ( i );.    retur
17fb0 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
17fc0 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   String or blob 
17fd0 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
17fe0 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
17ff0 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20  assert( pMem->n 
18000 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  + ((pMem->flags 
18010 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d  & MEM_Zero)?pMem
18020 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20  ->u.nZero:0).   
18030 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e            == (in
18040 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t)sqlite3VdbeSer
18050 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
18060 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c  l_type) );.    l
18070 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  en = pMem->n;.  
18080 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
18090 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
180a0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
180b0 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
180c0 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
180d0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
180e0 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69  ../* Input "x" i
180f0 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  s a sequence of 
18100 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63 74  unsigned charact
18110 65 72 73 20 74 68 61 74 20 72 65 70 72 65 73 65  ers that represe
18120 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69  nt a.** big-endi
18130 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74  an integer.  Ret
18140 75 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65  urn the equivale
18150 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65  nt native intege
18160 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45  r.*/.#define ONE
18170 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20  _BYTE_INT(x)    
18180 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65  ((i8)(x)[0]).#de
18190 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e  fine TWO_BYTE_IN
181a0 54 28 78 29 20 20 20 20 28 32 35 36 2a 28 69 38  T(x)    (256*(i8
181b0 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d  )((x)[0])|(x)[1]
181c0 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f  ).#define THREE_
181d0 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35  BYTE_INT(x)  (65
181e0 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  536*(i8)((x)[0])
181f0 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29  |((x)[1]<<8)|(x)
18200 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55  [2]).#define FOU
18210 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20  R_BYTE_UINT(x)  
18220 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32  (((u32)(x)[0]<<2
18230 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c  4)|((x)[1]<<16)|
18240 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[2]<<8)|(x)[
18250 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52  3]).#define FOUR
18260 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36  _BYTE_INT(x) (16
18270 37 37 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b  777216*(i8)((x)[
18280 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29  0])|((x)[1]<<16)
18290 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29  |((x)[2]<<8)|(x)
182a0 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  [3])../*.** Dese
182b0 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
182c0 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
182d0 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
182e0 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
182f0 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
18300 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
18310 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
18320 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
18330 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
18340 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
18350 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20  lemented as two 
18360 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65  separate routine
18370 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63  s for performanc
18380 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61  e..** The few ca
18390 73 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65  ses that require
183a0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
183b0 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20   are broken out 
183c0 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a  into a separate.
183d0 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68  ** routine so th
183e0 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73  at in most cases
183f0 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
18400 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63   moving the stac
18410 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20  k pointer.** is 
18420 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61  avoided..*/ .sta
18430 74 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e  tic u32 SQLITE_N
18440 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65  OINLINE serialGe
18450 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t(.  const unsig
18460 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20  ned char *buf,  
18470 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
18480 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d  deserialize from
18490 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
184a0 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  _type,          
184b0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
184c0 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  pe to deserializ
184d0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184f0 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
18500 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c  ell to write val
18510 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ue into */.){.  
18520 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54  u64 x = FOUR_BYT
18530 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75  E_UINT(buf);.  u
18540 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45  32 y = FOUR_BYTE
18550 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20  _UINT(buf+4);.  
18560 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b  x = (x<<32) + y;
18570 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
18580 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==6 ){.    /* 
18590 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
185a0 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65  9851-52272 Value
185b0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
185c0 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74   64-bit.    ** t
185d0 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
185e0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70  nteger. */.    p
185f0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
18600 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  *)&x;.    pMem->
18610 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
18620 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
18630 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
18640 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56  }else{.    /* EV
18650 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33  IDENCE-OF: R-573
18660 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69  43-49114 Value i
18670 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49  s a big-endian I
18680 45 45 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d  EEE 754-2008 64-
18690 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74  bit.    ** float
186a0 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72  ing point number
186b0 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  . */.#if !define
186c0 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
186d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
186e0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
186f0 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ).    /* Verify 
18700 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
18710 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
18720 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
18730 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65  same.    ** byte
18740 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61   order.  Or, tha
18750 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  t if SQLITE_MIXE
18760 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
18770 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64  LOAT is.    ** d
18780 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62  efined that 64-b
18790 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  it floating poin
187a0 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20  t values really 
187b0 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a  are mixed.    **
187c0 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a   endian..    */.
187d0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
187e0 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
187f0 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
18800 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
18810 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
18820 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20  0;.    u64 t2 = 
18830 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65  t1;.    swapMixe
18840 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
18850 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
18860 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66  zeof(r1)==sizeof
18870 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26  (t2) && memcmp(&
18880 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28  r1, &t2, sizeof(
18890 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  r1))==0 );.#endi
188a0 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  f.    assert( si
188b0 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
188c0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d  zeof(pMem->u.r)=
188d0 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69  =8 );.    swapMi
188e0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78  xedEndianFloat(x
188f0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
18900 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69  Mem->u.r, &x, si
18910 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d  zeof(x));.    pM
18920 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69  em->flags = sqli
18930 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75  te3IsNaN(pMem->u
18940 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a  .r) ? MEM_Null :
18950 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20   MEM_Real;.  }. 
18960 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32   return 8;.}.u32
18970 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18980 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
18990 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
189a0 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
189b0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
189c0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
189d0 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
189e0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
189f0 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
18a00 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
18a10 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
18a20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
18a30 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
18a40 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
18a50 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  {.  switch( seri
18a60 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
18a70 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73  ase 10:   /* Res
18a80 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
18a90 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
18aa0 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   11:   /* Reserv
18ab0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
18ac0 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a  e */.    case 0:
18ad0 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20   {  /* Null */. 
18ae0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
18af0 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33  -OF: R-24078-093
18b00 37 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55  75 Value is a NU
18b10 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  LL. */.      pMe
18b20 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
18b30 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
18b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18b50 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45   1: {.      /* E
18b60 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
18b70 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20  885-25196 Value 
18b80 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73  is an 8-bit twos
18b90 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20  -complement.    
18ba0 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f    ** integer. */
18bb0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
18bc0 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
18bd0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
18be0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
18bf0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
18c00 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
18c10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
18c20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18c30 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
18c40 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
18c50 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
18c60 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d  NCE-OF: R-49794-
18c70 33 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61  35026 Value is a
18c80 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62   big-endian 16-b
18c90 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
18ca0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
18cb0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
18cc0 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59  em->u.i = TWO_BY
18cd0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
18ce0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
18cf0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
18d00 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
18d10 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
18d20 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
18d30 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
18d40 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
18d50 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
18d60 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18d70 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c  -37839-54301 Val
18d80 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
18d90 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20  an 24-bit.      
18da0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
18db0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
18dc0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
18dd0 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
18de0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
18df0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
18e00 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
18e10 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
18e20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
18e30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18e40 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
18e50 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
18e60 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
18e70 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d  NCE-OF: R-01849-
18e80 32 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61  26079 Value is a
18e90 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62   big-endian 32-b
18ea0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
18eb0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
18ec0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
18ed0 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
18ee0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
18ef0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
18f00 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
18f10 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
18f20 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
18f30 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
18f40 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
18f50 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
18f60 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
18f70 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18f80 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 61  R-50385-09674 Va
18f90 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
18fa0 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20  ian 48-bit.     
18fb0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
18fc0 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
18fd0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
18fe0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
18ff0 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34  (buf+2) + (((i64
19000 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
19010 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
19020 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19030 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
19040 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
19050 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
19060 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
19070 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
19080 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
19090 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
190a0 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
190b0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
190c0 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75        /* These u
190d0 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  se local variabl
190e0 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69  es, so do them i
190f0 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75  n a separate rou
19100 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  tine.      ** to
19110 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f   avoid having to
19120 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20   move the frame 
19130 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63  pointer in the c
19140 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
19150 20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61      return seria
19160 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f  lGet(buf,serial_
19170 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20  type,pMem);.    
19180 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
19190 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
191a0 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
191b0 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
191c0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
191d0 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32  E-OF: R-12976-22
191e0 38 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 65  893 Value is the
191f0 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20   integer 0. */. 
19200 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
19210 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31  -OF: R-18143-121
19220 32 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 20  21 Value is the 
19230 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20  integer 1. */.  
19240 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
19250 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
19260 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
19270 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
19280 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
19290 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
192a0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
192b0 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33  CE-OF: R-14606-3
192c0 31 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 20  1564 Value is a 
192d0 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d  BLOB that is (N-
192e0 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20  12)/2 bytes in. 
192f0 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a       ** length..
19300 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
19310 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30  E-OF: R-28401-00
19320 31 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 73  140 Value is a s
19330 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78  tring in the tex
19340 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20  t encoding and. 
19350 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32       ** (N-13)/2
19360 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
19370 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  . */.      stati
19380 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61  c const u16 aFla
19390 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62  g[] = { MEM_Blob
193a0 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f  |MEM_Ephem, MEM_
193b0 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b  Str|MEM_Ephem };
193c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
193d0 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
193e0 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73      pMem->n = (s
193f0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
19400 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
19410 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69  ags = aFlag[seri
19420 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20  al_type&1];.    
19430 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e    return pMem->n
19440 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
19450 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  turn 0;.}./*.** 
19460 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
19470 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
19480 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
19490 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65  e for an Unpacke
194a0 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
194b0 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67  ture large enoug
194c0 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  h to be used wit
194d0 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  h sqlite3VdbeRec
194e0 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a  ordUnpack() if.*
194f0 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
19500 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
19510 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72  r to KeyInfo str
19520 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e  ucture pKeyInfo.
19530 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65  .**.** The space
19540 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63   is either alloc
19550 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ated using sqlit
19560 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20  e3DbMallocRaw() 
19570 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a  or from within.*
19580 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20  * the unaligned 
19590 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69  buffer passed vi
195a0 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64  a the second and
195b0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73   third arguments
195c0 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20   (presumably.** 
195d0 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66  stack space). If
195e0 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65   the former, the
195f0 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  n *ppFree is set
19600 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68   to a pointer th
19610 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
19620 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
19630 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
19640 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
19650 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  ee(). Or, if the
19660 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   .** allocation 
19670 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70  comes from the p
19680 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75  Space/szSpace bu
19690 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73  ffer, *ppFree is
196a0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
196b0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
196c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
196d0 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
196e0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
196f0 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63  ..*/.UnpackedRec
19700 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65  ord *sqlite3Vdbe
19710 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
19720 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ord(.  KeyInfo *
19730 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
19740 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69         /* Descri
19750 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63  ption of the rec
19760 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ord */.  char *p
19770 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
19780 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c           /* Unal
19790 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69  igned space avai
197a0 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  lable */.  int s
197b0 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  zSpace,         
197c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
197d0 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69  ze of pSpace[] i
197e0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
197f0 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20  r **ppFree      
19800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19810 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75  OUT: Caller shou
19820 6c 64 20 66 72 65 65 20 74 68 69 73 20 70 6f 69  ld free this poi
19830 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70  nter */.){.  Unp
19840 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20  ackedRecord *p; 
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19860 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  Unpacked record 
19870 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
19880 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20  nt nOff;        
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
198a0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61  * Increment pSpa
198b0 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c  ce by nOff to al
198c0 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20  ign it */.  int 
198d0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
198e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
198f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
19900 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a  equired for *p *
19910 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20  /..  /* We want 
19920 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69  to shift the poi
19930 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73  nter pSpace up s
19940 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38  uch that it is 8
19950 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20  -byte aligned.. 
19960 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65   ** Thus, we nee
19970 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61  d to calculate a
19980 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65   value, nOff, be
19990 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74  tween 0 and 7, t
199a0 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74  o shift .  ** it
199b0 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20   by.  If pSpace 
199c0 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74  is already 8-byt
199d0 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20  e aligned, nOff 
199e0 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a  should be zero..
199f0 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38    */.  nOff = (8
19a00 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54   - (SQLITE_PTR_T
19a10 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20  O_INT(pSpace) & 
19a20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65  7)) & 7;.  nByte
19a30 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
19a40 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
19a50 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
19a60 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  (pKeyInfo->nFiel
19a70 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  d+1);.  if( nByt
19a80 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29  e>szSpace+nOff )
19a90 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63  {.    p = (Unpac
19aa0 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69  kedRecord *)sqli
19ab0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
19ac0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79  KeyInfo->db, nBy
19ad0 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65  te);.    *ppFree
19ae0 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20   = (char *)p;.  
19af0 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
19b00 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
19b10 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
19b20 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e  ecord*)&pSpace[n
19b30 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65  Off];.    *ppFre
19b40 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d  e = 0;.  }..  p-
19b50 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28  >aMem = (Mem*)&(
19b60 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38  (char*)p)[ROUND8
19b70 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
19b80 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73  Record))];.  ass
19b90 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
19ba0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
19bb0 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20    p->pKeyInfo = 
19bc0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e  pKeyInfo;.  p->n
19bd0 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
19be0 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20  ->nField + 1;.  
19bf0 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
19c00 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65  ** Given the nKe
19c10 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20  y-byte encoding 
19c20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70  of a record in p
19c30 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20  Key[], populate 
19c40 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64  the .** Unpacked
19c50 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
19c60 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
19c70 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e  e fourth argumen
19c80 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f  t with the.** co
19c90 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65  ntents of the de
19ca0 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f  coded record..*/
19cb0 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64   .void sqlite3Vd
19cc0 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a  beRecordUnpack(.
19cd0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
19ce0 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f  nfo,     /* Info
19cf0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
19d00 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20  e record format 
19d10 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20  */.  int nKey,  
19d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19d30 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72  ize of the binar
19d40 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  y record */.  co
19d50 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
19d60 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61       /* The bina
19d70 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55  ry record */.  U
19d80 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
19d90 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
19da0 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
19db0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
19dc0 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  g. */.){.  const
19dd0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19de0 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
19df0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
19e00 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20  ey;.  int d; .  
19e10 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20  u32 idx;        
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65  /* Offset in aKe
19e40 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  y[] to read from
19e50 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20   */.  u16 u;    
19e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e70 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
19e80 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
19e90 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
19ea0 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e   Mem *pMem = p->
19eb0 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61  aMem;..  p->defa
19ec0 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73  ult_rc = 0;.  as
19ed0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
19ee0 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
19ef0 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
19f00 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
19f10 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
19f20 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
19f30 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
19f40 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  & d<=nKey ){.   
19f50 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
19f60 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
19f70 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
19f80 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
19f90 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
19fa0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
19fb0 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
19fc0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
19fd0 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61      /* pMem->fla
19fe0 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74  gs = 0; // sqlit
19ff0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1a000 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20  ) will set this 
1a010 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d  for us */.    pM
1a020 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em->szMalloc = 0
1a030 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
1a040 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1a050 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
1a060 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
1a070 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66    pMem++;.    if
1a080 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65  ( (++u)>=p->nFie
1a090 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ld ) break;.  }.
1a0a0 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65    assert( u<=pKe
1a0b0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
1a0c0 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  1 );.  p->nField
1a0d0 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c   = u;.}..#if SQL
1a0e0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1a0f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
1a100 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78  mpares two index
1a110 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64   or table record
1a120 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d   keys in the sam
1a130 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20  e way.** as the 
1a140 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1a150 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69  dCompare() routi
1a160 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52  ne. Unlike VdbeR
1a170 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a  ecordCompare(),.
1a180 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1a190 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e   deserializes an
1a1a0 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65  d compares value
1a1b0 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73  s using the.** s
1a1c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1a1d0 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Get() and sqlite
1a1e0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75  3MemCompare() fu
1a1f0 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75  nctions. It is u
1a200 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  sed.** in assert
1a210 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
1a220 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
1a230 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20   optimized code 
1a240 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  in.** sqlite3Vdb
1a250 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1a260 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73   returns results
1a270 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20   with these two 
1a280 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a  primitives..**.*
1a290 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1a2a0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
1a2b0 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75  omparison is equ
1a2c0 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72  ivalent to desir
1a2d0 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74  edResult..** Ret
1a2e0 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65  urn false if the
1a2f0 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65  re is a disagree
1a300 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
1a310 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
1a320 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e  mpareDebug(.  in
1a330 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1a340 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1a350 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  eft key */.  con
1a360 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  st UnpackedRecor
1a370 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69  d *pPKey2, /* Ri
1a380 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1a390 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20   desiredResult  
1a3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1a3b0 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a  rrect answer */.
1a3c0 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1a3d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1a3e0 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1a3f0 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1a400 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
1a410 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
1a420 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1a430 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
1a440 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
1a450 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
1a460 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1a470 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
1a480 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
1a490 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
1a4a0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1a4b0 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1a4c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1a4d0 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
1a4e0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
1a4f0 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
1a500 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
1a510 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  KeyInfo;.  if( p
1a520 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29  KeyInfo->db==0 )
1a530 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
1a540 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
1a550 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
1a560 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1a570 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73  .  /* mem1.flags
1a580 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62   = 0;  // Will b
1a590 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
1a5a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1a5b0 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41  alGet() */.  VVA
1a5c0 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
1a5d0 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1a5e0 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1a5f0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1a600 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69  s */..  /* Compi
1a610 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69  lers may complai
1a620 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20  n that mem1.u.i 
1a630 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75  is potentially u
1a640 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
1a650 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74  ** We could init
1a660 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68  ialize it, as sh
1a670 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c  own here, to sil
1a680 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c  ence those compl
1a690 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20  aints..  ** But 
1a6a0 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e  in fact, mem1.u.
1a6b0 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74  i will never act
1a6c0 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e  ually be used un
1a6d0 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64  initialized, and
1a6e0 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65   doing .  ** the
1a6f0 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69   unnecessary ini
1a700 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20  tialization has 
1a710 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67  a measurable neg
1a720 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  ative performanc
1a730 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73  e.  ** impact, s
1a740 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
1a750 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68  e is a very high
1a760 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f   runner.  And so
1a770 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a  , we choose.  **
1a780 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   to ignore the c
1a790 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
1a7a0 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20   and leave this 
1a7b0 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69  variable uniniti
1a7c0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f  alized..  */.  /
1a7d0 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  *  mem1.u.i = 0;
1a7e0 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c    // not needed,
1a7f0 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
1a800 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
1a810 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d  g */.  .  idx1 =
1a820 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1a830 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69  y1, szHdr1);.  i
1a840 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20  f( szHdr1>98307 
1a850 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1a860 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20  CORRUPT;.  d1 = 
1a870 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74  szHdr1;.  assert
1a880 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ( pKeyInfo->nFie
1a890 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  ld+pKeyInfo->nXF
1a8a0 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46  ield>=pPKey2->nF
1a8b0 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ield || CORRUPT_
1a8c0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1a8d0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1a8e0 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rder!=0 );.  ass
1a8f0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1a900 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73  Field>0 );.  ass
1a910 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72  ert( idx1<=szHdr
1a920 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  1 || CORRUPT_DB 
1a930 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32  );.  do{.    u32
1a940 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a   serial_type1;..
1a950 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1a960 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72  serial types for
1a970 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
1a980 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a  t in each key. *
1a990 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65  /.    idx1 += ge
1a9a0 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31  tVarint32( aKey1
1a9b0 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79  +idx1, serial_ty
1a9c0 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  pe1 );..    /* V
1a9d0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65  erify that there
1a9e0 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73   is enough key s
1a9f0 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74  pace remaining t
1aa00 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61  o avoid.    ** a
1aa10 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
1aa20 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61  .  The "d1+seria
1aa30 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78  l_type1+2" subex
1aa40 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20  pression will.  
1aa50 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67    ** always be g
1aa60 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1aa70 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75  qual to the amou
1aa80 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b  nt of required k
1aa90 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ey space..    **
1aaa0 20 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78   Use that approx
1aab0 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64  imation to avoid
1aac0 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73   the more expens
1aad0 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  ive call to.    
1aae0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
1aaf0 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e  rialTypeLen() in
1ab00 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1ab10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1ab20 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31   d1+serial_type1
1ab30 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20  +2>(u32)nKey1.  
1ab40 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33     && d1+sqlite3
1ab50 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1ab60 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e  n(serial_type1)>
1ab70 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20  (u32)nKey1 .    
1ab80 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
1ab90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78      }..    /* Ex
1aba0 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73  tract the values
1abb0 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e   to be compared.
1abc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b  .    */.    d1 +
1abd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1abe0 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1abf0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c  ], serial_type1,
1ac00 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a   &mem1);..    /*
1ac10 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
1ac20 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  on.    */.    rc
1ac30 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
1ac40 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b  pare(&mem1, &pPK
1ac50 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b  ey2->aMem[i], pK
1ac60 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1ac70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
1ac80 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1ac90 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1aca0 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
1acb0 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
1acc0 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
1acd0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
1ace0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1acf0 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74   -rc;  /* Invert
1ad00 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20   the result for 
1ad10 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e  DESC sort order.
1ad20 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1ad30 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70    goto debugComp
1ad40 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  areEnd;.    }.  
1ad50 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28    i++;.  }while(
1ad60 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
1ad70 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
1ad80 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d   );..  /* No mem
1ad90 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
1ada0 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
1adb0 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
1adc0 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
1add0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1ade0 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
1adf0 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
1ae00 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
1ae10 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
1ae20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
1ae30 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1ae40 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a  ease(&mem1)..  *
1ae50 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
1ae60 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
1ae70 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
1ae80 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
1ae90 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
1aea0 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
1aeb0 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
1aec0 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
1aed0 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
1aee0 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
1aef0 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
1af00 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  lue.  */.  rc = 
1af10 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1af20 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72  rc;..debugCompar
1af30 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69  eEnd:.  if( desi
1af40 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20  redResult==0 && 
1af50 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  rc==0 ) return 1
1af60 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  ;.  if( desiredR
1af70 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20  esult<0 && rc<0 
1af80 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1af90 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e  ( desiredResult>
1afa0 30 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75  0 && rc>0 ) retu
1afb0 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52  rn 1;.  if( CORR
1afc0 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20  UPT_DB ) return 
1afd0 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  1;.  if( pKeyInf
1afe0 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
1aff0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
1b000 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1b010 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1b020 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75  _DEBUG./*.** Cou
1b030 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
1b040 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20   fields (a.k.a. 
1b050 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20  columns) in the 
1b060 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a  record given by.
1b070 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54  ** pKey,nKey.  T
1b080 68 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74  he verify that t
1b090 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73  his count is les
1b0a0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
1b0b0 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20  to the.** limit 
1b0c0 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66  given by pKeyInf
1b0d0 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79  o->nField + pKey
1b0e0 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a  Info->nXField..*
1b0f0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e  *.** If this con
1b100 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73  straint is not s
1b110 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61  atisfied, it mea
1b120 6e 73 20 74 68 61 74 20 74 68 65 20 68 69 67 68  ns that the high
1b130 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65  -speed.** vdbeRe
1b140 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
1b150 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43   and vdbeRecordC
1b160 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 72  ompareString() r
1b170 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20  outines will.** 
1b180 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
1b190 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61 73 73  ly.  If this ass
1b1a0 65 72 74 28 29 20 65 76 65 72 20 66 69 72 65 73  ert() ever fires
1b1b0 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65  , it probably me
1b1c0 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ans.** that the 
1b1d0 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f  KeyInfo.nField o
1b1e0 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c  r KeyInfo.nXFiel
1b1f0 64 20 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f  d values were co
1b200 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72  mputed.** incorr
1b210 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
1b220 20 76 6f 69 64 20 76 64 62 65 41 73 73 65 72 74   void vdbeAssert
1b230 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1b240 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b  Limits(.  int nK
1b250 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ey, const void *
1b260 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72  pKey,   /* The r
1b270 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20  ecord to verify 
1b280 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49  */ .  const KeyI
1b290 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20  nfo *pKeyInfo   
1b2a0 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73      /* Compare s
1b2b0 69 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b 65  ize with this Ke
1b2c0 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e  yInfo */.){.  in
1b2d0 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20  t nField = 0;.  
1b2e0 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32  u32 szHdr;.  u32
1b2f0 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55   idx;.  u32 notU
1b300 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  sed;.  const uns
1b310 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1b320 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1b330 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a  ed char*)pKey;..
1b340 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1b350 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78   ) return;.  idx
1b360 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1b370 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61  Key, szHdr);.  a
1b380 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29  ssert( nKey>=0 )
1b390 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48 64  ;.  assert( szHd
1b3a0 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a  r<=(u32)nKey );.
1b3b0 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
1b3c0 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d  dr ){.    idx +=
1b3d0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1b3e0 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b  y+idx, notUsed);
1b3f0 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20  .    nField++;. 
1b400 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69   }.  assert( nFi
1b410 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d  eld <= pKeyInfo-
1b420 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f  >nField+pKeyInfo
1b430 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23  ->nXField );.}.#
1b440 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64  else.# define vd
1b450 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1b460 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41  ntWithinLimits(A
1b470 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,B,C).#endif../*
1b480 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20  .** Both *pMem1 
1b490 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61  and *pMem2 conta
1b4a0 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73  in string values
1b4b0 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77  . Compare the tw
1b4c0 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e  o values.** usin
1b4d0 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  g the collation 
1b4e0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
1b4f0 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e  As usual, return
1b500 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65   a negative , ze
1b510 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
1b520 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d  e value if *pMem
1b530 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1b540 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61  equal to or grea
1b550 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d  ter than .** *pM
1b560 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c  em2, respectivel
1b570 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70  y. Similar in sp
1b580 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a  irit to "rc = (*
1b590 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32  pMem1) - (*pMem2
1b5a0 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  );"..*/.static i
1b5b0 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65  nt vdbeCompareMe
1b5c0 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74  mString(.  const
1b5d0 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63   Mem *pMem1,.  c
1b5e0 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c  onst Mem *pMem2,
1b5f0 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  .  const CollSeq
1b600 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70   *pColl,.  u8 *p
1b610 72 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20  rcErr           
1b620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1b630 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20   an OOM occurs, 
1b640 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
1b650 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  MEM */.){.  if( 
1b660 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  pMem1->enc==pCol
1b670 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a  l->enc ){.    /*
1b680 20 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65   The strings are
1b690 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1b6a0 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67  correct encoding
1b6b0 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20  .  Call the.    
1b6c0 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   ** comparison f
1b6d0 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79  unction directly
1b6e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
1b6f0 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
1b700 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e  ->pUser,pMem1->n
1b710 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d  ,pMem1->z,pMem2-
1b720 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20  >n,pMem2->z);.  
1b730 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
1b740 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  c;.    const voi
1b750 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20  d *v1, *v2;.    
1b760 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20  int n1, n2;.    
1b770 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20  Mem c1;.    Mem 
1b780 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  c2;.    sqlite3V
1b790 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20  dbeMemInit(&c1, 
1b7a0 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e  pMem1->db, MEM_N
1b7b0 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1b7c0 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32  3VdbeMemInit(&c2
1b7d0 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d  , pMem1->db, MEM
1b7e0 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
1b7f0 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1b800 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31  wCopy(&c1, pMem1
1b810 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1b820 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1b830 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c  ShallowCopy(&c2,
1b840 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65   pMem2, MEM_Ephe
1b850 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c  m);.    v1 = sql
1b860 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73  ite3ValueText((s
1b870 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63  qlite3_value*)&c
1b880 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  1, pColl->enc);.
1b890 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f      n1 = v1==0 ?
1b8a0 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76   0 : c1.n;.    v
1b8b0 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  2 = sqlite3Value
1b8c0 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
1b8d0 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d  lue*)&c2, pColl-
1b8e0 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20  >enc);.    n2 = 
1b8f0 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e  v2==0 ? 0 : c2.n
1b900 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c  ;.    rc = pColl
1b910 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1b920 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c  ser, n1, v1, n2,
1b930 20 76 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   v2);.    sqlite
1b940 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1b950 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &c1);.    sqlite
1b960 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1b970 26 63 32 29 3b 0a 20 20 20 20 69 66 28 20 28 76  &c2);.    if( (v
1b980 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26  1==0 || v2==0) &
1b990 26 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45  & prcErr ) *prcE
1b9a0 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rr = SQLITE_NOME
1b9b0 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  M;.    return rc
1b9c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1b9d0 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73  ompare two blobs
1b9e0 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1b9f0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1ba00 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1ba10 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  st.** is less th
1ba20 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1ba30 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1ba40 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63  e second, respec
1ba50 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e  tively..** If on
1ba60 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66  e blob is a pref
1ba70 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c  ix of the other,
1ba80 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65   then the shorte
1ba90 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e  r is the lessor.
1baa0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
1bab0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73  E_NOINLINE int s
1bac0 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
1bad0 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31  e(const Mem *pB1
1bae0 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32  , const Mem *pB2
1baf0 29 7b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d  ){.  int c = mem
1bb00 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d  cmp(pB1->z, pB2-
1bb10 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e  >z, pB1->n>pB2->
1bb20 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a 20 70 42 31  n ? pB2->n : pB1
1bb30 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 63 20 29 20  ->n);.  if( c ) 
1bb40 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75  return c;.  retu
1bb50 72 6e 20 70 42 31 2d 3e 6e 20 2d 20 70 42 32 2d  rn pB1->n - pB2-
1bb60 3e 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  >n;.}.../*.** Co
1bb70 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73  mpare the values
1bb80 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68   contained by th
1bb90 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c  e two memory cel
1bba0 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  ls, returning.**
1bbb0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20   negative, zero 
1bbc0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
1bbd0 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1bbe0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
1bbf0 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20  greater.** than 
1bc00 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f  pMem2. Sorting o
1bc10 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66  rder is NULL's f
1bc20 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  irst, followed b
1bc30 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67  y numbers (integ
1bc40 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73  ers.** and reals
1bc50 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63  ) sorted numeric
1bc60 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  ally, followed b
1bc70 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62  y text ordered b
1bc80 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a  y the collating.
1bc90 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ** sequence pCol
1bca0 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c  l and finally bl
1bcb0 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20  ob's ordered by 
1bcc0 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  memcmp()..**.** 
1bcd0 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  Two NULL values 
1bce0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1bcf0 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e  qual by this fun
1bd00 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1bd10 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1bd20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1bd30 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  , const Mem *pMe
1bd40 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  m2, const CollSe
1bd50 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74  q *pColl){.  int
1bd60 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63   f1, f2;.  int c
1bd70 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a  ombined_flags;..
1bd80 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c    f1 = pMem1->fl
1bd90 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d  ags;.  f2 = pMem
1bda0 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62  2->flags;.  comb
1bdb0 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c  ined_flags = f1|
1bdc0 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63  f2;.  assert( (c
1bdd0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20  ombined_flags & 
1bde0 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
1bdf0 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  ;. .  /* If one 
1be00 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69  value is NULL, i
1be10 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  t is less than t
1be20 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74  he other. If bot
1be30 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72  h values.  ** ar
1be40 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30  e NULL, return 0
1be50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1be60 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1be70 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
1be80 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29  rn (f2&MEM_Null)
1be90 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29   - (f1&MEM_Null)
1bea0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f  ;.  }..  /* If o
1beb0 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75  ne value is a nu
1bec0 6d 62 65 72 20 61 6e 64 20 74 68 65 20 6f 74 68  mber and the oth
1bed0 65 72 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 6e  er is not, the n
1bee0 75 6d 62 65 72 20 69 73 20 6c 65 73 73 2e 0a 20  umber is less.. 
1bef0 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20   ** If both are 
1bf00 6e 75 6d 62 65 72 73 2c 20 63 6f 6d 70 61 72 65  numbers, compare
1bf10 20 61 73 20 72 65 61 6c 73 20 69 66 20 6f 6e 65   as reals if one
1bf20 20 69 73 20 61 20 72 65 61 6c 2c 20 6f 72 20 61   is a real, or a
1bf30 73 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20  s integers.  ** 
1bf40 69 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61  if both values a
1bf50 72 65 20 69 6e 74 65 67 65 72 73 2e 0a 20 20 2a  re integers..  *
1bf60 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1bf70 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c  _flags&(MEM_Int|
1bf80 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20  MEM_Real) ){.   
1bf90 20 64 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a   double r1, r2;.
1bfa0 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32      if( (f1 & f2
1bfb0 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29   & MEM_Int)!=0 )
1bfc0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  {.      if( pMem
1bfd0 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.i < pMem2->
1bfe0 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.i ) return -1;
1bff0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1c000 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75  ->u.i > pMem2->u
1c010 2e 69 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  .i ) return 1;. 
1c020 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1c030 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1c040 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
1c050 0a 20 20 20 20 20 20 72 31 20 3d 20 70 4d 65 6d  .      r1 = pMem
1c060 31 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73  1->u.r;.    }els
1c070 65 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e  e if( (f1&MEM_In
1c080 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  t)!=0 ){.      r
1c090 31 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d  1 = (double)pMem
1c0a0 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73  1->u.i;.    }els
1c0b0 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1c0c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1c0d0 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f2&MEM_Real)!=
1c0e0 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20  0 ){.      r2 = 
1c0f0 70 4d 65 6d 32 2d 3e 75 2e 72 3b 0a 20 20 20 20  pMem2->u.r;.    
1c100 7d 65 6c 73 65 20 69 66 28 20 28 66 32 26 4d 45  }else if( (f2&ME
1c110 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1c120 20 20 20 72 32 20 3d 20 28 64 6f 75 62 6c 65 29     r2 = (double)
1c130 70 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20  pMem2->u.i;.    
1c140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1c150 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
1c160 20 20 69 66 28 20 72 31 3c 72 32 20 29 20 72 65    if( r1<r2 ) re
1c170 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1c180 20 72 31 3e 72 32 20 29 20 72 65 74 75 72 6e 20   r1>r2 ) return 
1c190 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
1c1a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  .  }..  /* If on
1c1b0 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72  e value is a str
1c1c0 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ing and the othe
1c1d0 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65  r is a blob, the
1c1e0 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e   string is less.
1c1f0 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72  .  ** If both ar
1c200 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61  e strings, compa
1c210 72 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  re using the col
1c220 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lating functions
1c230 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1c240 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1c250 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28  Str ){.    if( (
1c260 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f1 & MEM_Str)==0
1c270 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c280 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1c290 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29  ( (f2 & MEM_Str)
1c2a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1c2b0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  urn -1;.    }.. 
1c2c0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1c2d0 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e  ->enc==pMem2->en
1c2e0 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c );.    assert(
1c2f0 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1c300 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20  ITE_UTF8 || .   
1c310 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e           pMem1->
1c320 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
1c330 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e  6LE || pMem1->en
1c340 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c==SQLITE_UTF16B
1c350 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  E );..    /* The
1c360 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1c370 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69  nce must be defi
1c380 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ned at this poin
1c390 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a  t, even if.    *
1c3a0 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74  * the user delet
1c3b0 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
1c3c0 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20   sequence after 
1c3d0 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
1c3e0 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69   is.    ** compi
1c3f0 6c 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f  led (this was no
1c400 74 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  t always the cas
1c410 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  e)..    */.    a
1c420 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c  ssert( !pColl ||
1c430 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a   pColl->xCmp );.
1c440 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
1c450 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
1c460 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1c470 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32  ing(pMem1, pMem2
1c480 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20  , pColl, 0);.   
1c490 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e   }.    /* If a N
1c4a0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20  ULL pointer was 
1c4b0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f  passed as the co
1c4c0 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  llate function, 
1c4d0 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20  fall through.   
1c4e0 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20   ** to the blob 
1c4f0 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d  case and use mem
1c500 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20  cmp().  */.  }. 
1c510 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65  .  /* Both value
1c520 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e  s must be blobs.
1c530 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20    Compare using 
1c540 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20  memcmp().  */.  
1c550 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c  return sqlite3Bl
1c560 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c  obCompare(pMem1,
1c570 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   pMem2);.}.../*.
1c580 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
1c590 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
1c5a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1c5b0 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74   a serial-type t
1c5c0 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  hat.** correspon
1c5d0 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ds to an integer
1c5e0 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65   - all values be
1c5f0 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e  tween 1 and 9 in
1c600 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65  clusive .** exce
1c610 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64  pt 7. The second
1c620 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
1c630 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
1c640 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a  n integer value.
1c650 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63  ** serialized ac
1c660 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61  cording to seria
1c670 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e  l_type. This fun
1c680 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a  ction deserializ
1c690 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e  es.** and return
1c6a0 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a  s the value..*/.
1c6b0 73 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52  static i64 vdbeR
1c6c0 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75  ecordDecodeInt(u
1c6d0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
1c6e0 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b  const u8 *aKey){
1c6f0 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65  .  u32 y;.  asse
1c700 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
1c710 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  | (serial_type>=
1c720 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  1 && serial_type
1c730 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=9 && serial_ty
1c740 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74  pe!=7) );.  swit
1c750 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
1c760 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20  ){.    case 0:. 
1c770 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20     case 1:.     
1c780 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1c790 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1c7a0 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45   return ONE_BYTE
1c7b0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1c7c0 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65  case 2:.      te
1c7d0 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1c7e0 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1c7f0 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e  turn TWO_BYTE_IN
1c800 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1c810 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 3:.      testc
1c820 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1c830 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1c840 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  n THREE_BYTE_INT
1c850 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1c860 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74   4: {.      test
1c870 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1c880 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20  80 );.      y = 
1c890 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1c8a0 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Key);.      retu
1c8b0 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26  rn (i64)*(int*)&
1c8c0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  y;.    }.    cas
1c8d0 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  e 5: {.      tes
1c8e0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1c8f0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1c900 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  urn FOUR_BYTE_UI
1c910 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28  NT(aKey+2) + (((
1c920 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
1c930 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1c940 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
1c950 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20  : {.      u64 x 
1c960 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1c970 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1c980 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1c990 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20  0x80 );.      x 
1c9a0 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52  = (x<<32) | FOUR
1c9b0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1c9c0 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  4);.      return
1c9d0 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b   (i64)*(i64*)&x;
1c9e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1c9f0 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
1ca00 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e - 8);.}../*.**
1ca10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
1ca20 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
1ca30 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
1ca40 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73  dex records.** s
1ca50 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65  pecified by {nKe
1ca60 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70  y1, pKey1} and p
1ca70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72  PKey2.  It retur
1ca80 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ns a negative, z
1ca90 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
1caa0 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65  ve integer if ke
1cab0 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  y1 is less than,
1cac0 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
1cad0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65   greater than ke
1cae0 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c  y2.  The {nKey1,
1caf0 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74   pKey1} key must
1cb00 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72   be a blob.** cr
1cb10 65 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  eated by the OP_
1cb20 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1cb30 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
1cb40 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
1cb50 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
1cb60 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
1cb70 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
1cb80 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
1cb90 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  Record..**.** If
1cba0 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20   argument bSkip 
1cbb0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20  is non-zero, it 
1cbc0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1cbd0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1cbe0 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d  lready.** determ
1cbf0 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1cc00 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
1cc10 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
1cc20 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64  ..**.** Key1 and
1cc30 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76   Key2 do not hav
1cc40 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
1cc50 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
1cc60 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a  fields. If all .
1cc70 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ** fields that a
1cc80 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65  ppear in both ke
1cc90 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68  ys are equal, th
1cca0 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  en pPKey2->defau
1ccb0 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74  lt_rc is .** ret
1ccc0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
1ccd0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1cce0 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65  ion is discovere
1ccf0 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65  d, set pPKey2->e
1cd00 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51  rrCode to .** SQ
1cd10 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64  LITE_CORRUPT and
1cd20 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e   return 0. If an
1cd30 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
1cd40 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70  countered, .** p
1cd50 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69  PKey2->errCode i
1cd60 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
1cd70 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74  NOMEM and, if it
1cd80 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
1cd90 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c  e.** malloc-fail
1cda0 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64  ed flag set on d
1cdb0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
1cdc0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1cdd0 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ->db)..*/.int sq
1cde0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1cdf0 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a  ompareWithSkip(.
1ce00 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1ce10 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1ce20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
1ce30 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1ce40 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20  d *pPKey2,      
1ce50 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
1ce60 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20  */.  int bSkip  
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce80 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
1ce90 20 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20   skip the first 
1cea0 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33  field */.){.  u3
1ceb0 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  2 d1;           
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ced0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1cee0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
1cef0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
1cf00 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cf20 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66   Index of next f
1cf30 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  ield to compare 
1cf40 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf60 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1cf70 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e  record header in
1cf80 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
1cf90 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20  idx1;           
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1cfb0 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74  ffset of first t
1cfc0 79 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  ype in header */
1cfd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cff0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1d000 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68  ue */.  Mem *pRh
1d010 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  s = pPKey2->aMem
1d020 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  ;       /* Next 
1d030 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1d040 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
1d050 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1d060 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
1d070 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Info;.  const un
1d080 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
1d090 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
1d0a0 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1d0b0 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  1;.  Mem mem1;..
1d0c0 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73    /* If bSkip is
1d0d0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
1d0e0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1d0f0 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  dy determined th
1d100 61 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  at the first.  *
1d110 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
1d120 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  n the keys are e
1d130 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61  qual. Fix the va
1d140 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69  rious stack vari
1d150 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68  ables so.  ** th
1d160 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  at this routine 
1d170 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67  begins comparing
1d180 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66   at the second f
1d190 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62  ield. */.  if( b
1d1a0 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20  Skip ){.    u32 
1d1b0 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31  s1;.    idx1 = 1
1d1c0 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26   + getVarint32(&
1d1d0 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20  aKey1[1], s1);. 
1d1e0 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79     szHdr1 = aKey
1d1f0 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73  1[0];.    d1 = s
1d200 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56  zHdr1 + sqlite3V
1d210 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1d220 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b  (s1);.    i = 1;
1d230 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d  .    pRhs++;.  }
1d240 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d  else{.    idx1 =
1d250 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1d260 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20  y1, szHdr1);.   
1d270 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
1d280 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e    if( d1>(unsign
1d290 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20  ed)nKey1 ){ .   
1d2a0 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1d2b0 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1d2c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1d2d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1d2e0 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1d2f0 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b      }.    i = 0;
1d300 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59  .  }..  VVA_ONLY
1d310 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20  ( mem1.szMalloc 
1d320 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
1d330 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
1d340 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
1d350 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1d360 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
1d370 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  ld+pPKey2->pKeyI
1d380 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50  nfo->nXField>=pP
1d390 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20  Key2->nField .  
1d3a0 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
1d3b0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1d3c0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1d3d0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1d3e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
1d3f0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1d400 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73  Field>0 );.  ass
1d410 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72  ert( idx1<=szHdr
1d420 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  1 || CORRUPT_DB 
1d430 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32  );.  do{.    u32
1d440 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
1d450 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20     /* RHS is an 
1d460 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69  integer */.    i
1d470 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1d480 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
1d490 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1d4a0 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1d4b0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
1d4c0 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
1d4d0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1d4e0 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20  _type>=10 ){.   
1d4f0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1d500 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1d510 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
1d520 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1d530 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d540 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
1d550 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c  ){.        doubl
1d560 65 20 72 68 73 20 3d 20 28 64 6f 75 62 6c 65 29  e rhs = (double)
1d570 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
1d580 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1d590 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1d5a0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
1d5b0 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
1d5c0 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 72 68   if( mem1.u.r<rh
1d5d0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1d5e0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1d5f0 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75  }else if( mem1.u
1d600 2e 72 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  .r>rhs ){.      
1d610 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1d620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1d630 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  se{.        i64 
1d640 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64  lhs = vdbeRecord
1d650 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c  DecodeInt(serial
1d660 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31  _type, &aKey1[d1
1d670 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ]);.        i64 
1d680 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b  rhs = pRhs->u.i;
1d690 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73  .        if( lhs
1d6a0 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  <rhs ){.        
1d6b0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1d6c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73     }else if( lhs
1d6d0 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  >rhs ){.        
1d6e0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1d6f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d700 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1d710 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c  s real */.    el
1d720 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1d730 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
1d740 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1d750 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1d760 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1d770 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20  al_type>=10 ){. 
1d780 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
1d790 20 74 79 70 65 73 20 31 32 20 6f 72 20 67 72 65   types 12 or gre
1d7a0 61 74 65 72 20 61 72 65 20 73 74 72 69 6e 67 73  ater are strings
1d7b0 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61   and blobs (grea
1d7c0 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20  ter than.       
1d7d0 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79   ** numbers). Ty
1d7e0 70 65 73 20 31 30 20 61 6e 64 20 31 31 20 61 72  pes 10 and 11 ar
1d7f0 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73  e currently "res
1d800 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
1d810 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65   .        ** use
1d820 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  ", so it doesn't
1d830 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77   really matter w
1d840 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
1d850 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20  of comparing.   
1d860 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20       ** them to 
1d870 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20  numberic values 
1d880 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  are.  */.       
1d890 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1d8a0 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1d8b0 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
1d8c0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1d8d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d8e0 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 70    double rhs = p
1d8f0 52 68 73 2d 3e 75 2e 72 3b 0a 20 20 20 20 20 20  Rhs->u.r;.      
1d900 20 20 64 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20    double lhs;.  
1d910 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1d920 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1d930 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1d940 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
1d950 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1d960 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1d970 20 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 75      lhs = mem1.u
1d980 2e 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  .r;.        }els
1d990 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73  e{.          lhs
1d9a0 20 3d 20 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e   = (double)mem1.
1d9b0 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  u.i;.        }. 
1d9c0 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72         if( lhs<r
1d9d0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1d9e0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1d9f0 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72   }else if( lhs>r
1da00 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1da10 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1da20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1da30 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1da40 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  a string */.    
1da50 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1da60 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
1da70 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
1da80 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1da90 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1daa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dab0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1dac0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1dad0 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
1dae0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1daf0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1db00 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
1db10 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
1db20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1db30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
1db40 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em1.n = (serial_
1db50 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1db60 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1db70 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28  ( (d1+mem1.n)==(
1db80 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1db90 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1dba0 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31  se( (d1+mem1.n+1
1dbb0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1dbc0 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
1dbd0 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20  ( (d1+mem1.n) > 
1dbe0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1dbf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
1dc00 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1dc10 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1dc20 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1dc30 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1dc40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1dc50 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1dc60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b      }else if( pK
1dc70 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1dc80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1dc90 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
1dca0 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  o->enc;.        
1dcb0 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
1dcc0 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20  Info->db;.      
1dcd0 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d      mem1.flags =
1dce0 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20   MEM_Str;.      
1dcf0 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68      mem1.z = (ch
1dd00 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a  ar*)&aKey1[d1];.
1dd10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
1dd20 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1dd30 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20 20  ing(.           
1dd40 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20     &mem1, pRhs, 
1dd50 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1dd60 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72  i], &pPKey2->err
1dd70 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 29  Code.          )
1dd80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1dd90 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1dda0 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e  Cmp = MIN(mem1.n
1ddb0 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
1ddc0 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
1ddd0 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
1dde0 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
1ddf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1de00 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20  0 ) rc = mem1.n 
1de10 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20  - pRhs->n; .    
1de20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1de30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1de40 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20  is a blob */.   
1de50 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
1de60 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
1de70 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72   ){.      getVar
1de80 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
1de90 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
1dea0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1deb0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1dec0 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1ded0 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c  erial_type<12 ||
1dee0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20   (serial_type & 
1def0 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
1df00 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1df10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1df20 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61  nt nStr = (seria
1df30 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
1df40 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1df50 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28  se( (d1+nStr)==(
1df60 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1df70 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1df80 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d  se( (d1+nStr+1)=
1df90 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1dfa0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1dfb0 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73  (d1+nStr) > (uns
1dfc0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
1dfd0 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
1dfe0 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1dff0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e000 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
1e010 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1e020 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
1e030 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1e040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e050 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
1e060 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  nStr, pRhs->n);.
1e070 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1e080 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1e090 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1e0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e0b0 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74  rc==0 ) rc = nSt
1e0c0 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20  r - pRhs->n;.   
1e0d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e0e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1e0f0 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   is null */.    
1e100 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69  else{.      seri
1e110 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1e120 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  idx1];.      rc 
1e130 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  = (serial_type!=
1e140 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
1e150 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1e160 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1e170 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
1e180 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
1e190 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1e1a0 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
1e1b0 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1e1c0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1e1d0 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20  Key2, rc) );.   
1e1e0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
1e1f0 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  szMalloc==0 );  
1e200 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
1e210 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  elow */.      re
1e220 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1e230 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68      i++;.    pRh
1e240 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73  s++;.    d1 += s
1e250 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1e260 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1e270 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b  ype);.    idx1 +
1e280 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  = sqlite3VarintL
1e290 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
1e2a0 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1e2b0 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31  (unsigned)szHdr1
1e2c0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
1e2d0 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73  ield && d1<=(uns
1e2e0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a  igned)nKey1 );..
1e2f0 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1e300 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1e310 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1e320 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1e330 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
1e340 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
1e350 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1e360 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1e370 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1e380 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1e390 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1e3a0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1e3b0 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73  &mem1).  */.  as
1e3c0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1e3d0 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1e3e0 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1e3f0 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74   that one or bot
1e400 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  h of the keys ra
1e410 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1e420 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1e430 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1e440 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1e450 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1e460 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
1e470 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73  value.  */.  ass
1e480 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
1e490 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52  .       || vdbeR
1e4a0 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1e4b0 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1e4c0 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e  pPKey2, pPKey2->
1e4d0 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20  default_rc) .   
1e4e0 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d      || pKeyInfo-
1e4f0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1e500 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  d.  );.  return 
1e510 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1e520 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
1e530 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1e540 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  re(.  int nKey1,
1e550 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1e560 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1e570 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1e580 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
1e590 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1e5a0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  key */.){.  retu
1e5b0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1e5c0 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1e5d0 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
1e5e0 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a  , pPKey2, 0);.}.
1e5f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1e600 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1e610 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1e620 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1e630 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1e640 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1e650 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
1e660 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  y2 is an integer
1e670 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a  , and (b) the .*
1e680 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  * size-of-header
1e690 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73   varint at the s
1e6a0 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
1e6b0 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
1e6c0 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28  single.** byte (
1e6d0 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61  i.e. is less tha
1e6e0 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f  n 128)..**.** To
1e6f0 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20   avoid concerns 
1e700 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65  about buffer ove
1e710 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75  rreads, this rou
1e720 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
1e730 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20  d.** on schemas 
1e740 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75  where the maximu
1e750 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73  m valid header s
1e760 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20  ize is 63 bytes 
1e770 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  or less..*/.stat
1e780 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1e790 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69  dCompareInt(.  i
1e7a0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1e7b0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1e7c0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1e7d0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1e7e0 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
1e7f0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
1e800 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20   const u8 *aKey 
1e810 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70  = &((const u8*)p
1e820 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38  Key1)[*(const u8
1e830 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b  *)pKey1 & 0x3F];
1e840 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
1e850 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a  pe = ((const u8*
1e860 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e  )pKey1)[1];.  in
1e870 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a  t res;.  u32 y;.
1e880 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76    u64 x;.  i64 v
1e890 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   = pPKey2->aMem[
1e8a0 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68  0].u.i;.  i64 lh
1e8b0 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74  s;..  vdbeAssert
1e8c0 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1e8d0 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b  Limits(nKey1, pK
1e8e0 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ey1, pPKey2->pKe
1e8f0 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  yInfo);.  assert
1e900 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c  ( (*(u8*)pKey1)<
1e910 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54  =0x3F || CORRUPT
1e920 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28  _DB );.  switch(
1e930 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1e940 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a      case 1: { /*
1e950 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   1-byte signed i
1e960 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1e970 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49  lhs = ONE_BYTE_I
1e980 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1e990 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1e9a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e9b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
1e9c0 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
1e9d0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1e9e0 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f        lhs = TWO_
1e9f0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1ea00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ea10 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1ea20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ea30 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
1ea40 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1ea50 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1ea60 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  = THREE_BYTE_INT
1ea70 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1ea80 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1ea90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1eaa0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
1eab0 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
1eac0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1ead0 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
1eae0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1eaf0 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a      lhs = (i64)*
1eb00 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20  (int*)&y;.      
1eb10 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1eb20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1eb30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1eb40 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
1eb50 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1eb60 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52        lhs = FOUR
1eb70 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1eb80 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1eb90 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1eba0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1ebb0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1ebc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ebd0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20    }.    case 6: 
1ebe0 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e  { /* 8-byte sign
1ebf0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1ec00 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54      x = FOUR_BYT
1ec10 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1ec20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
1ec30 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  | FOUR_BYTE_UINT
1ec40 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20  (aKey+4);.      
1ec50 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  lhs = *(i64*)&x;
1ec60 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ec70 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1ec80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ec90 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20   case 8: .      
1eca0 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  lhs = 0;.      b
1ecb0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39  reak;.    case 9
1ecc0 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b  :.      lhs = 1;
1ecd0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
1ece0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
1ecf0 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64  could be removed
1ed00 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
1ed10 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  g the results of
1ed20 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20   running.    ** 
1ed30 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75  this code. Inclu
1ed40 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67  ding it causes g
1ed50 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  cc to generate a
1ed60 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a   faster switch .
1ed70 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
1ed80 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67   (since the rang
1ed90 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67  e of switch targ
1eda0 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61  ets now starts a
1edb0 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a  t zero and.    *
1edc0 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29  * is contiguous)
1edd0 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61   but does not ca
1ede0 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74  use any duplicat
1edf0 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e  e code to be gen
1ee00 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61  erated.    ** (a
1ee10 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20  s gcc is clever 
1ee20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e  enough to combin
1ee30 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63  e the two like c
1ee40 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20  ases). Other .  
1ee50 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d    ** compilers m
1ee60 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e  ight be similar.
1ee70 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30    */ .    case 0
1ee80 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20  : case 7:.      
1ee90 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1eea0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1eeb0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1eec0 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61  Key2);..    defa
1eed0 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
1eee0 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1eef0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31  ordCompare(nKey1
1ef00 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1ef10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c  ;.  }..  if( v>l
1ef20 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
1ef30 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65  pPKey2->r1;.  }e
1ef40 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b  lse if( v<lhs ){
1ef50 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1ef60 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69  2->r2;.  }else i
1ef70 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  f( pPKey2->nFiel
1ef80 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  d>1 ){.    /* Th
1ef90 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1efa0 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61  f the two keys a
1efb0 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72  re equal. Compar
1efc0 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a  e the trailing .
1efd0 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20      ** fields.  
1efe0 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  */.    res = sql
1eff0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1f000 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1f010 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1f020 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  y2, 1);.  }else{
1f030 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
1f040 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1f050 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
1f060 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  al and there are
1f070 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20   no trailing.   
1f080 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75   ** fields. Retu
1f090 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
1f0a0 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61  lt_rc in this ca
1f0b0 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  se. */.    res =
1f0c0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1f0d0 5f 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _rc;.  }..  asse
1f0e0 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
1f0f0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1f100 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1f110 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72   res) );.  retur
1f120 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
1f130 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f140 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
1f150 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
1f160 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1f170 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
1f180 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1f190 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20   of pPKey2 is a 
1f1a0 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29  string, that (b)
1f1b0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1f1c0 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c  .** uses the col
1f1d0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1f1e0 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74  BINARY and (c) t
1f1f0 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
1f200 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a  header varint .*
1f210 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  * at the start o
1f220 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
1f230 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
1f240 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   byte..*/.static
1f250 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
1f260 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20  ompareString(.  
1f270 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1f280 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
1f290 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1f2a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1f2b0 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
1f2c0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
1f2d0 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79    const u8 *aKey
1f2e0 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70  1 = (const u8*)p
1f2f0 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69  Key1;.  int seri
1f300 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72  al_type;.  int r
1f310 65 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72  es;..  vdbeAsser
1f320 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
1f330 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70  nLimits(nKey1, p
1f340 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b  Key1, pPKey2->pK
1f350 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61  eyInfo);.  getVa
1f360 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d  rint32(&aKey1[1]
1f370 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1f380 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1f390 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20  e<12 ){.    res 
1f3a0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20  = pPKey2->r1;   
1f3b0 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
1f3c0 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20  y1) is a number 
1f3d0 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d  or a null */.  }
1f3e0 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61  else if( !(seria
1f3f0 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
1f400 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  { .    res = pPK
1f410 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a  ey2->r2;      /*
1f420 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69   (pKey1/nKey1) i
1f430 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65  s a blob */.  }e
1f440 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d  lse{.    int nCm
1f450 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b  p;.    int nStr;
1f460 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d  .    int szHdr =
1f470 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20   aKey1[0];..    
1f480 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74  nStr = (serial_t
1f490 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20  ype-12) / 2;.   
1f4a0 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53   if( (szHdr + nS
1f4b0 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20  tr) > nKey1 ){. 
1f4c0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1f4d0 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1f4e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1f4f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1f500 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
1f510 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43   */.    }.    nC
1f520 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32  mp = MIN( pPKey2
1f530 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74  ->aMem[0].n, nSt
1f540 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d  r );.    res = m
1f550 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48  emcmp(&aKey1[szH
1f560 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65  dr], pPKey2->aMe
1f570 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a  m[0].z, nCmp);..
1f580 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
1f590 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53  {.      res = nS
1f5a0 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65  tr - pPKey2->aMe
1f5b0 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66  m[0].n;.      if
1f5c0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
1f5d0 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e      if( pPKey2->
1f5e0 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20  nField>1 ){.    
1f5f0 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69        res = sqli
1f600 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1f610 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
1f620 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1f630 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  2, 1);.        }
1f640 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f650 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
1f660 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20  fault_rc;.      
1f670 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
1f680 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
1f690 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1f6a0 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c  2->r2;.      }el
1f6b0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
1f6c0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1f6d0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1f6e0 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
1f6f0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1f700 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >r2;.    }else{.
1f710 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1f720 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20  y2->r1;.    }.  
1f730 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
1f740 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1f750 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1f760 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20  , pPKey2, res). 
1f770 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
1f780 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  _DB.       || pP
1f790 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1f7a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f7b0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
1f7c0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  es;.}../*.** Ret
1f7d0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1f7e0 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52   an sqlite3VdbeR
1f7f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
1f800 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69  ompatible functi
1f810 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  on.** suitable f
1f820 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72  or comparing ser
1f830 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20  ialized records 
1f840 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20  to the unpacked 
1f850 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a  record passed.**
1f860 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
1f870 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64  ument..*/.Record
1f880 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56  Compare sqlite3V
1f890 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55  dbeFindCompare(U
1f8a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1f8b0 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65  ){.  /* varintRe
1f8c0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
1f8d0 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72   and varintRecor
1f8e0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
1f8f0 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a   both assume.  *
1f900 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  * that the size-
1f910 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
1f920 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
1f930 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
1f940 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69  h record.  ** fi
1f950 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
1f960 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37  yte (i.e. is 127
1f970 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e   or less). varin
1f980 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
1f990 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73  t().  ** also as
1f9a0 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
1f9b0 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61   safe to overrea
1f9c0 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74  d a buffer by at
1f9d0 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a   least the .  **
1f9e0 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c   maximum possibl
1f9f0 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73  e legal header s
1fa00 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73  ize plus 8 bytes
1fa10 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20  . Because there 
1fa20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65  is.  ** guarante
1fa30 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73  ed to be at leas
1fa40 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33  t 74 (but not 13
1fa50 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  6) bytes of padd
1fa60 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ing following ea
1fa70 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70  ch.  ** buffer p
1fa80 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52  assed to varintR
1fa90 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1faa0 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20  ) this makes it 
1fab0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20  convenient to.  
1fac0 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a  ** limit the siz
1fad0 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
1fae0 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63  to 64 bytes in c
1faf0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66  ases where the f
1fb00 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20  irst field.  ** 
1fb10 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20  is an integer.. 
1fb20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73   **.  ** The eas
1fb30 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f  iest way to enfo
1fb40 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69  rce this limit i
1fb50 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e  s to consider on
1fb60 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a  ly records with.
1fb70 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f    ** 13 fields o
1fb80 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66  r less. If the f
1fb90 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e  irst field is an
1fba0 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61   integer, the ma
1fbb0 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a  ximum legal.  **
1fbc0 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
1fbd0 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62  (12*5 + 1 + 1) b
1fbe0 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ytes.  */.  if( 
1fbf0 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  (p->pKeyInfo->nF
1fc00 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e  ield + p->pKeyIn
1fc10 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33  fo->nXField)<=13
1fc20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   ){.    int flag
1fc30 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  s = p->aMem[0].f
1fc40 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d  lags;.    if( p-
1fc50 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
1fc60 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  Order[0] ){.    
1fc70 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20    p->r1 = 1;.   
1fc80 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20     p->r2 = -1;. 
1fc90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fca0 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r1 = -1;.    
1fcb0 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20    p->r2 = 1;.   
1fcc0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
1fcd0 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a  s & MEM_Int) ){.
1fce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
1fcf0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1fd00 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  t;.    }.    tes
1fd10 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
1fd20 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74  EM_Real );.    t
1fd30 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
1fd40 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20   MEM_Null );.   
1fd50 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
1fd60 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
1fd70 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
1fd80 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75  (MEM_Real|MEM_Nu
1fd90 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  ll|MEM_Blob))==0
1fda0 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d   && p->pKeyInfo-
1fdb0 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a  >aColl[0]==0 ){.
1fdc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
1fdd0 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
1fde0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1fdf0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
1fe00 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  tring;.    }.  }
1fe10 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
1fe20 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1fe30 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43  are;.}../*.** pC
1fe40 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
1fe50 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
1fe60 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
1fe70 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
1fe80 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
1fe90 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
1fea0 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
1feb0 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
1fec0 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
1fed0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1fee0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
1fef0 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
1ff00 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
1ff10 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67  ..**.** pCur mig
1ff20 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  ht be pointing t
1ff30 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
1ff40 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64  from a corrupt d
1ff50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1ff60 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   So the content 
1ff70 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
1ff80 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61  d.  Do appropria
1ff90 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65  te checks on the
1ffa0 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   content..*/.int
1ffb0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
1ffc0 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
1ffd0 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  , BtCursor *pCur
1ffe0 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20  , i64 *rowid){. 
1fff0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
20000 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
20010 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
20020 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
20030 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
20040 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
20050 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
20060 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
20070 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
20080 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
20090 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
200a0 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  , v;..  /* Get t
200b0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
200c0 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
200d0 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
200e0 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
200f0 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
20100 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
20110 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
20120 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
20130 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
20140 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
20150 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
20160 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
20170 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
20180 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
20190 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
201a0 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
201b0 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
201c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
201d0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
201e0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
201f0 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
20200 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
20210 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
20220 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
20230 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
20240 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
20250 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
20260 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
20270 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
20280 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
20290 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
202a0 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
202b0 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
202c0 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
202d0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
202e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
202f0 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c  eMemInit(&m, db,
20300 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
20310 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
20320 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33  ree(pCur, 0, (u3
20330 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  2)nCellKey, 1, &
20340 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
20350 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20360 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
20370 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
20380 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
20390 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
203a0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
203b0 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
203c0 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
203d0 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
203e0 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
203f0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
20400 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
20410 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
20420 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
20430 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
20440 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
20450 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
20460 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
20470 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
20480 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
20490 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
204a0 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
204b0 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
204c0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
204d0 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
204e0 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
204f0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
20500 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
20510 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
20520 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
20530 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
20540 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
20550 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
20560 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
20570 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
20580 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
20590 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
205a0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
205b0 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
205c0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
205d0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
205e0 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
205f0 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
20600 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
20610 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
20620 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
20630 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
20640 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
20650 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64  eSizes[typeRowid
20660 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  ];.  testcase( (
20670 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
20680 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
20690 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
206a0 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
206b0 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
206c0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
206d0 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
206e0 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
206f0 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
20700 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
20710 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
20720 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
20730 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
20740 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
20750 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
20760 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
20770 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
20780 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
20790 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
207a0 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
207b0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
207c0 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
207d0 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
207e0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
207f0 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
20800 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
20810 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
20820 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
20830 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
20840 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  szMalloc!=0 );. 
20850 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
20860 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
20870 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
20880 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
20890 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
208a0 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
208b0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
208c0 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
208d0 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
208e0 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
208f0 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
20900 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
20910 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
20920 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
20930 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
20940 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
20950 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
20960 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
20970 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
20980 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
20990 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
209a0 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
209b0 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
209c0 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
209d0 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
209e0 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
209f0 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
20a00 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
20a10 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
20a20 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
20a30 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
20a40 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
20a50 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
20a60 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
20a70 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
20a80 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
20a90 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
20aa0 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
20ab0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20ac0 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
20ad0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
20ae0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20af0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
20b00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
20b10 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
20b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20b30 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
20b40 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
20b50 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
20b60 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
20b70 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70  ed,       /* Unp
20b80 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
20b90 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72   key */.  int *r
20ba0 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
20bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
20bc0 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
20bd0 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
20be0 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
20bf0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
20c00 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
20c10 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
20c20 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
20c30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
20c40 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
20c50 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f  (pCur) );.  VVA_
20c60 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
20c70 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
20c80 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
20c90 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
20ca0 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f  QLITE_OK );    /
20cb0 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73  * pCur is always
20cc0 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a   valid so KeySiz
20cd0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  e cannot fail */
20ce0 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77  .  /* nCellKey w
20cf0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65  ill always be be
20d00 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66  tween 0 and 0xff
20d10 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f  ffffff because o
20d20 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74  f the way.  ** t
20d30 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65  hat btreeParseCe
20d40 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69  llPtr() and sqli
20d50 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
20d60 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
20d70 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b   */.  if( nCellK
20d80 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
20d90 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  y>0x7fffffff ){.
20da0 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
20db0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20dc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20dd0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  }.  sqlite3VdbeM
20de0 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
20df0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
20e00 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
20e10 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
20e20 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
20e30 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
20e40 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
20e50 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
20e60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20e70 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
20e80 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
20e90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
20ea0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
20eb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20ec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
20ed0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
20ee0 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
20ef0 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
20f00 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
20f10 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
20f20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20f30 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
20f40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
20f50 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
20f60 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
20f70 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
20f80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20f90 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
20fa0 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
20fb0 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
20fc0 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
20fd0 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
20fe0 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
20ff0 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
21000 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
21010 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
21020 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
21030 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
21040 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
21050 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
21060 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
21070 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
21080 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
21090 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
210a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
210b0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
210c0 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
210d0 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
210e0 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
210f0 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
21100 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
21110 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
21120 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
21130 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
21140 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
21150 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
21160 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
21170 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
21180 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
21190 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
211a0 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
211b0 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
211c0 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
211d0 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
211e0 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
211f0 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
21200 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
21210 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
21220 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
21230 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
21240 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
21250 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
21260 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
21270 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
21280 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
21290 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
212a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
212b0 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
212c0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
212d0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
212e0 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
212f0 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
21300 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
21310 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
21320 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
21330 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
21340 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
21350 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
21360 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
21370 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
21380 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
21390 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
213a0 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
213b0 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
213c0 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
213d0 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
213e0 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
213f0 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
21400 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
21410 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
21420 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
21430 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
21440 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
21450 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
21460 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
21470 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
21480 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
21490 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
214a0 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
214b0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
214c0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
214d0 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
214e0 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
214f0 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
21500 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
21510 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
21520 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
21530 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
21540 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
21550 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
21560 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21570 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
21580 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
21590 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
215a0 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
215b0 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
215c0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
215d0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
215e0 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
215f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21600 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
21610 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
21620 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
21630 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
21640 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
21650 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
21660 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
21670 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
21680 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
21690 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
216a0 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
216b0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
216c0 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
216d0 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
216e0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
216f0 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
21700 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
21710 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
21720 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
21730 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
21740 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
21750 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
21760 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
21770 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
21780 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
21790 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
217a0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
217b0 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
217c0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
217d0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
217e0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
217f0 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
21800 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
21810 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
21820 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
21830 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
21840 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
21850 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
21860 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
21870 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
21880 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
21890 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
218a0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
218b0 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
218c0 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
218d0 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
218e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
218f0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
21900 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
21910 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
21920 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
21930 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
21940 41 42 4c 45 20 2a 2f 0a                          ABLE */.