/ Hex Artifact Content
Login

Artifact 23390670e64f011f3fed8f38a2f25aaccacb74d2:


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 52 65 6d 65 6d 62 65  }../*.** Remembe
0420: 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  r the SQL string
0430: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 20   for a prepared 
0440: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
0450: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
0460: 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f  tSql(Vdbe *p, co
0470: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
0480: 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70 61 72   n, int isPrepar
0490: 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74 28 20  eV2){.  assert( 
04a0: 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31 20 7c  isPrepareV2==1 |
04b0: 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 30  | isPrepareV2==0
04c0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
04d0: 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64 65 66   return;.#if def
04e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
04f0: 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
0500: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
0510: 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66 28 20  E_SQLLOG).  if( 
0520: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0530: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0540: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0550: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0560: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0570: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0580: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0590: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
05a0: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
05b0: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
05c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
05f0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
0600: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
0610: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0620: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0630: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0640: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0650: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0660: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0670: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0680: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0690: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06a0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06b0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06c0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
06d0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
06e0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
06f0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
0700: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
0710: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0720: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0730: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0740: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0750: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0760: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0770: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0780: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0790: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
07a0: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
07b0: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
07c0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
07d0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
07e0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f  sPrepareV2;.}../
07f0: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0800: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0810: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
0820: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e  least nOp elemen
0830: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68  ts larger .** th
0840: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  an its current s
0850: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72  ize. nOp is guar
0860: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73  anteed to be les
0870: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
0880: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f  ** to 1024/sizeo
0890: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f(Op)..**.** If 
08a0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
08b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
08c0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
08d0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a   array, return.*
08e0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  * SQLITE_NOMEM. 
08f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62  In this case Vdb
0900: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e  e.aOp and Parse.
0910: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0920: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0930: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0940: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0950: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0960: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0970: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0980: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0990: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
09a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
09b0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
09c0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
09d0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
09e0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
09f0: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0a00: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0a10: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0a20: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0a30: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0a40: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0a50: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0a60: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0a70: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0a80: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0a90: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0aa0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
0ab0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0ac0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
0ad0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
0ae0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
0af0: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
0b00: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
0b10: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
0b20: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
0b30: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
0b40: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
0b50: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
0b60: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
0b70: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
0b80: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0b90: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
0ba0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
0bb0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
0bc0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
0bd0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
0be0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
0bf0: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
0c00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
0c10: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
0c20: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e   int nNew = (p->
0c30: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
0c40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0c50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0c60: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
0c70: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0c80: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? p->nOpAlloc*
0c90: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
0ca0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
0cb0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0cc0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
0cd0: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30  assert( nOp<=(10
0ce0: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29  24/sizeof(Op)) )
0cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
0d00: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e  >=(p->nOpAlloc+n
0d10: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op) );.  pNew = 
0d20: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0d30: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20  (p->db, v->aOp, 
0d40: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0d50: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0d60: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
0d70: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0d80: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65  cSize(p->db, pNe
0d90: 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20  w)/sizeof(Op);. 
0da0: 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77     v->aOp = pNew
0db0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
0dc0: 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  pNew ? SQLITE_OK
0dd0: 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   : SQLITE_NOMEM)
0de0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
0df0: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
0e00: 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74   routine is just
0e10: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
0e20: 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
0e30: 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c  akpoint that wil
0e40: 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20  l.** fire after 
0e50: 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69  each opcode is i
0e60: 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70  nserted and disp
0e70: 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22  layed using.** "
0e80: 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f  PRAGMA vdbe_addo
0e90: 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73  ptrace=on"..*/.s
0ea0: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
0eb0: 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74  addop_breakpoint
0ec0: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
0ed0: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b   int n = 0;.  n+
0ee0: 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  +;.}.#endif../*.
0ef0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73  ** Add a new ins
0f00: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
0f10: 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74  list of instruct
0f20: 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20  ions current in 
0f30: 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65  the.** VDBE.  Re
0f40: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
0f50: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
0f60: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50  ruction..**.** P
0f70: 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a  arameters:.**.**
0f80: 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20      p           
0f90: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74      Pointer to t
0fa0: 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20  he VDBE.**.**   
0fb0: 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20   op             
0fc0: 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   The opcode for 
0fd0: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
0fe0: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32  .**.**    p1, p2
0ff0: 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e  , p3      Operan
1000: 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  ds.**.** Use the
1010: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1020: 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74  lveLabel() funct
1030: 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64  ion to fix an ad
1040: 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65  dress and.** the
1050: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1060: 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20  geP4() function 
1070: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  to change the va
1080: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a  lue of the P4.**
1090: 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74   operand..*/.int
10a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10b0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
10c0: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
10d0: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69  p2, int p3){.  i
10e0: 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a  nt i;.  VdbeOp *
10f0: 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e  pOp;..  i = p->n
1100: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  Op;.  assert( p-
1110: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
1120: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
1130: 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c  ert( op>0 && op<
1140: 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d  0xff );.  if( p-
1150: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
1160: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20  c<=i ){.    if( 
1170: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31  growOpArray(p, 1
1180: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1190: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
11a0: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70   p->nOp++;.  pOp
11b0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
11c0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28   pOp->opcode = (
11d0: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35  u8)op;.  pOp->p5
11e0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
11f0: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
1200: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
1210: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
1220: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
1230: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
1240: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
1250: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
1260: 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e  COMMENTS.  pOp->
1270: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
1280: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1290: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
12a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
12b0: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
12c0: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ace ){.    int j
12d0: 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65  j, kk;.    Parse
12e0: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
12f0: 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a  arse;.    for(jj
1300: 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45  =kk=0; jj<SQLITE
1310: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b  _N_COLCACHE; jj+
1320: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1330: 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20   yColCache *x = 
1340: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1350: 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66  e + jj;.      if
1360: 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72  ( x->iLevel>pPar
1370: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
1380: 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20  || x->iReg==0 ) 
1390: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13a0: 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b  printf(" r[%d]={
13b0: 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67  %d:%d}", x->iReg
13c0: 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e  , x->iTable, x->
13d0: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
13e0: 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kk++;.    }.    
13f0: 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28  if( kk ) printf(
1400: 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  "\n");.    sqlit
1410: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1420: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
1430: 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f  .    test_addop_
1440: 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20  breakpoint();.  
1450: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1460: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70  VDBE_PROFILE.  p
1470: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  Op->cycles = 0;.
1480: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a    pOp->cnt = 0;.
1490: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
14a0: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
14b0: 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69  GE.  pOp->iSrcLi
14c0: 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ne = 0;.#endif. 
14d0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74   return i;.}.int
14e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f0: 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p0(Vdbe *p, int 
1500: 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  op){.  return sq
1510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1520: 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b  p, op, 0, 0, 0);
1530: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1540: 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70  beAddOp1(Vdbe *p
1550: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
1560: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1570: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1580: 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a   op, p1, 0, 0);.
1590: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
15a0: 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c  eAddOp2(Vdbe *p,
15b0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
15c0: 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75   int p2){.  retu
15d0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
15e0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
15f0: 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  p2, 0);.}.../*.*
1600: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1610: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1620: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1630: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1650: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
1660: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1670: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1680: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1690: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
16a0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
16b0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16d0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
16e0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
16f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1700: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1710: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1720: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1730: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1740: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
1750: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
1760: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1770: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
1780: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
1790: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
17a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
17b0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
17c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
17d0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
17e0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
17f0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1800: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
1810: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
1820: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
1830: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
1840: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
1850: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
1860: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
1870: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
1880: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
1890: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
18a0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
18b0: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
18c0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
18d0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
18e0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
18f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1900: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
1910: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
1920: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
1930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1940: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
1950: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
1960: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
1970: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
1980: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1990: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
19a0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
19b0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
19c0: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
19d0: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
19e0: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
19f0: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
1a00: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
1a10: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
1a20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
1a30: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
1a40: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
1a50: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
1a60: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1a70: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1a80: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1a90: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1aa0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1ab0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1ae0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1b00: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1b10: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1b20: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1b30: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b50: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1b60: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
1b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b80: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
1b90: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1ba0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1bc0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1bd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1be0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1bf0: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
1c00: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
1c10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1c20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1c30: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
1c40: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
1c50: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
1c60: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
1c70: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
1c80: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
1c90: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1ca0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1cb0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1cc0: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
1cd0: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
1ce0: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
1cf0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
1d00: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
1d10: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
1d20: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1d30: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1d40: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1d50: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1d60: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1d70: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1d80: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
1d90: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
1da0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
1db0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
1dc0: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
1dd0: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
1de0: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
1df0: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
1e00: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
1e10: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
1e20: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1e30: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1e40: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1e50: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1e60: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1e70: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1e80: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
1e90: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
1ea0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
1eb0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
1ec0: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
1ed0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
1ee0: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
1ef0: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
1f00: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1f10: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
1f20: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
1f30: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1f40: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1f50: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1f60: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
1fa0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
1fb0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
1fc0: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1fd0: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
1fe0: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
1ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
2000: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
2010: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
2020: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2030: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
2040: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
2050: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
2060: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
2070: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
2080: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
2090: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20a0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
20b0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
20c0: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
20d0: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
20e0: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
20f0: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
2100: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
2110: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2120: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
2130: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69  p->nLabel );.  i
2140: 66 28 20 41 4c 57 41 59 53 28 6a 3e 3d 30 29 20  f( ALWAYS(j>=0) 
2150: 26 26 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  && p->aLabel ){.
2160: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
2170: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20   = v->nOp;.  }. 
2180: 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76   p->iFixedOp = v
2190: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a  ->nOp - 1;.}../*
21a0: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
21b0: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
21c0: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
21d0: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
21e0: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
21f0: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
2200: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
2210: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 1;.}..#ifdef
2220: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
2230: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2240: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
2250: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
2260: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
2270: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
2280: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2290: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
22a0: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
22b0: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
22c0: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
22d0: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
22e0: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
22f0: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
2300: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
2310: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
2320: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2330: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
2340: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
2350: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
2360: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
2370: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
2380: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
23b0: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
23c0: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
23d0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
23e0: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
23f0: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
2400: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
2410: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
2420: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
2430: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
2440: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2450: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
2460: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
2470: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
2480: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
2490: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
24a0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
24b0: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
24c0: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
24d0: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
24e0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
24f0: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
2500: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
2510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2520: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2530: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
2540: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
2550: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2560: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
2570: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
2580: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
25b0: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
25c0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
25d0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
25e0: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
25f0: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
2600: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
2610: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
2620: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
2630: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
2640: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
2650: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
2660: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
2670: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
2680: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
2690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26a0: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
26b0: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
26c0: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
26d0: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
26e0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
26f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
2700: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
2710: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
2720: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
2730: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
2740: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
2750: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
2760: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
2770: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
2780: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
2790: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
27a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
27b0: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
27c0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
27d0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
27e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
27f0: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
2800: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
2810: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
2820: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
2830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2840: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
2850: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
2860: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
2870: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
2880: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
2890: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
28a0: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
28b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
28c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
28d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
28e0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
28f0: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
2900: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
2910: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2920: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
2930: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
2940: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
2950: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
2960: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
2970: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
2980: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
2990: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
29a0: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
29b0: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
29c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
29d0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
29e0: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
29f0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
2a00: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
2a10: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
2a20: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
2a30: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
2a40: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
2a50: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
2a60: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2a70: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
2a80: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
2a90: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
2aa0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2ab0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
2ac0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
2ad0: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
2ae0: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
2af0: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
2b00: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
2b10: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
2b20: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2b30: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
2b40: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b  **.** Then check
2b50: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
2b60: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72  of Parse.mayAbor
2b70: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a  t is true if an.
2b80: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20  ** ABORT may be 
2b90: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65  thrown, or false
2ba0: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75   otherwise. Retu
2bb0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  rn true if it do
2bc0: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20  es.** match, or 
2bd0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2be0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2bf0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
2c00: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74   used as.** part
2c10: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74   of an assert st
2c20: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63  atement in the c
2c30: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72  ompiler. Similar
2c40: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73   to:.**.**   ass
2c50: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
2c60: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70  AssertMayAbort(p
2c70: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
2c80: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20  arse->mayAbort) 
2c90: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
2ca0: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
2cb0: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ort(Vdbe *v, int
2cc0: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e   mayAbort){.  in
2cd0: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a  t hasAbort = 0;.
2ce0: 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74    int hasFkCount
2cf0: 65 72 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  er = 0;.  Op *pO
2d00: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
2d10: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
2d20: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
2d30: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
2d40: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
2d50: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
2d60: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
2d70: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
2d80: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
2d90: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
2da0: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
2db0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2dc0: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
2dd0: 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20  P_VRename .     
2de0: 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f  || ((opcode==OP_
2df0: 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  Halt || opcode==
2e00: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a  OP_HaltIfNull) .
2e10: 20 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e        && ((pOp->
2e20: 70 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  p1&0xff)==SQLITE
2e30: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
2e40: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p2==OE_Abort
2e50: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
2e60: 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20  hasAbort = 1;.  
2e70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2e80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e90: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2ea0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
2eb0: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26  =OP_FkCounter &&
2ec0: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70   pOp->p1==0 && p
2ed0: 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20  Op->p2==1 ){.   
2ee0: 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20     hasFkCounter 
2ef0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
2f00: 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  f.  }.  sqlite3D
2f10: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
2f20: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a  er.apSub);..  /*
2f30: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2f40: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
2f50: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c  rt. Or if a mall
2f60: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
2f70: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
2f80: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
2f90: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
2fa0: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
2fb0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
2fc0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
2fd0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
2fe0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
2ff0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
3000: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
3010: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
3020: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
3030: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
3040: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
3050: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
3060: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
3070: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
3080: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
3090: 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e  ort || hasFkCoun
30a0: 74 65 72 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ter );.}.#endif 
30b0: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
30c0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
30d0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
30e0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
30f0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
3100: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
3110: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
3120: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
3130: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
3140: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
3150: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
3160: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
3170: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
3180: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
3190: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
31a0: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
31b0: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
31c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
31d0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
31e0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
31f0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
3200: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
3210: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
3220: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
3230: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
3240: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
3250: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
3260: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
3270: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
3280: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
3290: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
32a0: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
32b0: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
32c0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  rg[] array..**.*
32d0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73  * The Op.opflags
32e0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e   field is set on
32f0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f   all opcodes..*/
3300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
3310: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
3320: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
3330: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
3340: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
3350: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
3360: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
3370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
3380: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  p->pParse;.  int
3390: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73   *aLabel = pPars
33a0: 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  e->aLabel;.  p->
33b0: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
33c0: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30  p->bIsReader = 0
33d0: 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61  ;.  for(pOp=p->a
33e0: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
33f0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
3400: 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65  ){.    u8 opcode
3410: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
3420: 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65  .    /* NOTE: Be
3430: 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65 20   sure to update 
3440: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 77 68  mkopcodeh.awk wh
3450: 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d  en adding or rem
3460: 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73  oving.    ** cas
3470: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69  es from this swi
3480: 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77 69 74  tch! */.    swit
3490: 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20  ch( opcode ){.  
34a0: 20 20 20 20 63 61 73 65 20 4f 50 5f 46 75 6e 63      case OP_Func
34b0: 74 69 6f 6e 3a 0a 20 20 20 20 20 20 63 61 73 65  tion:.      case
34c0: 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20   OP_AggStep: {. 
34d0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
34e0: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p5>nMaxArgs ) nM
34f0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35  axArgs = pOp->p5
3500: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3520: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
3530: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  on: {.        if
3540: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
3550: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
3560: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
3570: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  thru */.      }.
3580: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75        case OP_Au
3590: 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20  toCommit:.      
35a0: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
35b0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  t: {.        p->
35c0: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
35d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
35e0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
35f0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
3600: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
3610: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
3620: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
3630: 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  uum:.      case 
3640: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20  OP_JournalMode: 
3650: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61  {.        p->rea
3660: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
3670: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
3680: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3690: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
36a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36b0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
36c0: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61     case OP_VUpda
36d0: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  te: {.        if
36e0: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
36f0: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
3700: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
3710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3720: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46        case OP_VF
3730: 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20  ilter: {.       
3740: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
3750: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
3760: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
3770: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
3780: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
3790: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
37a0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
37b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  .        if( n>n
37c0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
37d0: 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  gs = n;.        
37e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
37f0: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
3800: 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20   OP_Next:.      
3810: 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70  case OP_NextIfOp
3820: 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  en:.      case O
3830: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
3840: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
3850: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3860: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
3870: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3880: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
3890: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
38a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
38b0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
38c0: 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70  case OP_PrevIfOp
38d0: 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  en: {.        pO
38e0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
38f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
3900: 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70  vious;.        p
3910: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3920: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
3930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3940: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e      }..    pOp->
3950: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  opflags = sqlite
3960: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
3970: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28  opcode];.    if(
3980: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
3990: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
39a0: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
39b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31        assert( -1
39c0: 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73 65 2d  -pOp->p2<pParse-
39d0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
39e0: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
39f0: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
3a00: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
3a10: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
3a20: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b  pParse->aLabel);
3a30: 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  .  pParse->aLabe
3a40: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  l = 0;.  pParse-
3a50: 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >nLabel = 0;.  *
3a60: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
3a70: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
3a80: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
3a90: 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a  =0 || DbMaskAllZ
3aa0: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
3ab0: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ) );.}../*.** Re
3ac0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
3ad0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3ae0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
3af0: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
3b00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3b10: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
3b20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3b30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3b40: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
3b50: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
3b60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3b70: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
3b80: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
3b90: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69  f opcodes associ
3ba0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
3bb0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
3bc0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
3bd0: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  nt. It is the ca
3be0: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
3bf0: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e  lity.** to arran
3c00: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ge for the retur
3c10: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20  ned array to be 
3c20: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
3c30: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76   using the .** v
3c40: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29  dbeFreeOpArray()
3c50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
3c60: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
3c70: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20  g, *pnOp is set 
3c80: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
3c90: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
3ca0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61  returned.** arra
3cb0: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41  y. Also, *pnMaxA
3cc0: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  rg is set to the
3cd0: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63   larger of its c
3ce0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
3cf0: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20   .** the number 
3d00: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
3d10: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
3d20: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f  rray required to
3d30: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a   execute the .**
3d40: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61   returned progra
3d50: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  m..*/.VdbeOp *sq
3d60: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41  lite3VdbeTakeOpA
3d70: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
3d80: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e  t *pnOp, int *pn
3d90: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f  MaxArg){.  VdbeO
3da0: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
3db0: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26  .  assert( aOp &
3dc0: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  & !p->db->malloc
3dd0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20  Failed );..  /* 
3de0: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74  Check that sqlit
3df0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
3e00: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
3e10: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   on this VM */. 
3e20: 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41   assert( DbMaskA
3e30: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
3e40: 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ask) );..  resol
3e50: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e  veP2Values(p, pn
3e60: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70  MaxArg);.  *pnOp
3e70: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
3e80: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  aOp = 0;.  retur
3e90: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aOp;.}../*.** 
3ea0: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
3eb0: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
3ec0: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
3ed0: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74  stack.  Return t
3ee0: 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  he.** address of
3ef0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
3f00: 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69  tion added..*/.i
3f10: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
3f20: 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c  dOpList(Vdbe *p,
3f30: 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70   int nOp, VdbeOp
3f40: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c  List const *aOp,
3f50: 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20   int iLineno){. 
3f60: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
3f70: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
3f80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
3f90: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
3fa0: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65   nOp > p->pParse
3fb0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
3fc0: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70  owOpArray(p, nOp
3fd0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3fe0: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
3ff0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c  p->nOp;.  if( AL
4000: 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20  WAYS(nOp>0) ){. 
4010: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
4020: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
4030: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
4040: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
4050: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
4060: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
4070: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
4080: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
4090: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
40a0: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
40b0: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
40c0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
40d0: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p1;.      if( 
40e0: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p2<0 ){.        
40f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
4100: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
4110: 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  ut->opcode] & OP
4120: 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20  FLG_JUMP );.    
4130: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
4140: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a  ddr + ADDR(p2);.
4150: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4160: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
4170: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
4180: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
4190: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
41a0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
41b0: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75  TUSED;.      pOu
41c0: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
41d0: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
41e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
41f0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
4200: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70 4f 75  MMENTS.      pOu
4210: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
4220: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4230: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
4240: 41 47 45 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  AGE.      pOut->
4250: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
4260: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20  no+i;.#else.    
4270: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
4280: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4290: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
42a0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
42b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
42c0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
42d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
42e0: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64  ePrintOp(0, i+ad
42f0: 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  dr, &p->aOp[i+ad
4300: 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  dr]);.      }.#e
4310: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
4320: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
4330: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
4340: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
4350: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
4360: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f  MT_SCANSTATUS)./
4370: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72  *.** Add an entr
4380: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  y to the array o
4390: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67  f counters manag
43a0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74  ed by sqlite3_st
43b0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e  mt_scanstatus().
43c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
43d0: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a  VdbeScanStatus(.
43e0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73    /* VM to add s
4410: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a  canstatus() to *
4420: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c  /.  int addrExpl
4430: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
4440: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4450: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72  f OP_Explain (or
4460: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64   0) */.  int add
4470: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  rLoop,          
4480: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
4490: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e  ess of loop coun
44a0: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64  ter */ .  int ad
44b0: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20  drVisit,        
44c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
44d0: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73  ress of rows vis
44e0: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ited counter */.
44f0: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20    LogEst nEst,  
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
4520: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
4530: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rows */.  const 
4540: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
4550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
4560: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e  e of table or in
4570: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  dex being scanne
4580: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  d */.){.  int nB
4590: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b  yte = (p->nScan+
45a0: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e  1) * sizeof(Scan
45b0: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53  Status);.  ScanS
45c0: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61  tatus *aNew;.  a
45d0: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75  New = (ScanStatu
45e0: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c  s*)sqlite3DbReal
45f0: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53  loc(p->db, p->aS
4600: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  can, nByte);.  i
4610: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53  f( aNew ){.    S
4620: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20  canStatus *pNew 
4630: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e  = &aNew[p->nScan
4640: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ++];.    pNew->a
4650: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64  ddrExplain = add
4660: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e  rExplain;.    pN
4670: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61  ew->addrLoop = a
4680: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65  ddrLoop;.    pNe
4690: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61  w->addrVisit = a
46a0: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e  ddrVisit;.    pN
46b0: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b  ew->nEst = nEst;
46c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  .    pNew->zName
46d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
46e0: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  up(p->db, zName)
46f0: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d  ;.    p->aScan =
4700: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   aNew;.  }.}.#en
4710: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
4720: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
4730: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
4740: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
4750: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
4760: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4770: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
4780: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
4790: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
47a0: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
47b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
47c0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
47d0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
47e0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
47f0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
4800: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4810: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
4820: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
4830: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
4840: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
4850: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
4860: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4870: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
4880: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4890: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
48a0: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
48b0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
48c0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
48d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
48e0: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
48f0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
4900: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
4910: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4920: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
4930: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
4940: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4950: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4960: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4970: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4980: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
4990: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
49a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
49b0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
49c0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
49d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
49e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
49f0: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
4a00: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
4a10: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4a20: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
4a30: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
4a40: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
4a50: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
4a60: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4a70: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
4a80: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
4a90: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
4aa0: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
4ab0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4ac0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
4ad0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
4ae0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
4af0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
4b00: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4b10: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
4b20: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
4b30: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
4b40: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4b50: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4b60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
4b70: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
4b80: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
4b90: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
4ba0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
4bb0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
4bc0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
4bd0: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
4be0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
4bf0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4c00: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
4c10: 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69  ;.  p->pParse->i
4c20: 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70  FixedOp = p->nOp
4c30: 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   - 1;.}.../*.** 
4c40: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
4c50: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
4c60: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
4c70: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
4c80: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
4c90: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
4ca0: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
4cb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4cc0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
4cd0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
4ce0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
4cf0: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
4d00: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66  Def) && (pDef->f
4d10: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
4d20: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
4d30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
4d40: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
4d50: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
4d60: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
4d70: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
4d80: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
4d90: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
4da0: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
4db0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4dc0: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
4dd0: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
4de0: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
4df0: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65  ( p4 ){.    asse
4e00: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77  rt( db );.    sw
4e10: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
4e20: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45        case P4_RE
4e30: 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  AL:.      case P
4e40: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63  4_INT64:.      c
4e50: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
4e60: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
4e70: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
4e80: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4e90: 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20  db, p4);.       
4ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4eb0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
4ec0: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 20  YINFO: {.       
4ed0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4ee0: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4ef0: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28  e3KeyInfoUnref((
4f00: 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20  KeyInfo*)p4);.  
4f10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4f20: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4f30: 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20  P4_MPRINTF: {.  
4f40: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4f50: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4f60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29  sqlite3_free(p4)
4f70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4f80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4f90: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
4fa0: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  {.        freeEp
4fb0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4fc0: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34  db, (FuncDef*)p4
4fd0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4fe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4ff0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
5000: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
5010: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
5020: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
5030: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
5040: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
5050: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5060: 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a  .          Mem *
5070: 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20  p = (Mem*)p4;.  
5080: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73          if( p->s
5090: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
50a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
50b0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
50c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
50d0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
50e0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
50f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5100: 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b  case P4_VTAB : {
5110: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
5120: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
5130: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e   ) sqlite3VtabUn
5140: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70  lock((VTable *)p
5150: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5160: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5170: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
5180: 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  ee the space all
5190: 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61  ocated for aOp a
51a0: 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73  nd any p4 values
51b0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
51c0: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f  he.** opcodes co
51d0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20  ntained within. 
51e0: 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55  If aOp is not NU
51f0: 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  LL it is assumed
5200: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20   to contain .** 
5210: 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f  nOp entries. .*/
5220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
5230: 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c  eFreeOpArray(sql
5240: 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f  ite3 *db, Op *aO
5250: 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69  p, int nOp){.  i
5260: 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70  f( aOp ){.    Op
5270: 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70   *pOp;.    for(p
5280: 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70  Op=aOp; pOp<&aOp
5290: 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20  [nOp]; pOp++){. 
52a0: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
52b0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
52c0: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
52d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
52e0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
52f0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5300: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ee(db, pOp->zCom
5310: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
5320: 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73    .    }.  }.  s
5330: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5340: 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   aOp);.}../*.** 
5350: 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67  Link the SubProg
5360: 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ram object passe
5370: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
5380: 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68  argument into th
5390: 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74  e linked.** list
53a0: 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f   at Vdbe.pSubPro
53b0: 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20  gram. This list 
53c0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74  is used to delet
53d0: 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61  e all sub-progra
53e0: 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65  m.** objects whe
53f0: 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c  n the VM is no l
5400: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
5410: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5420: 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61  dbeLinkSubProgra
5430: 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  m(Vdbe *pVdbe, S
5440: 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20  ubProgram *p){. 
5450: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62   p->pNext = pVdb
5460: 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70  e->pProgram;.  p
5470: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d  Vdbe->pProgram =
5480: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   p;.}../*.** Cha
5490: 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61  nge the opcode a
54a0: 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e  t addr into OP_N
54b0: 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  oop.*/.void sqli
54c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
54d0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
54e0: 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 61 64   addr){.  if( ad
54f0: 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  dr<p->nOp ){.   
5500: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
5510: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
5520: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5530: 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65 65 50  p->db;.    freeP
5540: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
5550: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
5560: 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30     memset(pOp, 0
5570: 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29  , sizeof(pOp[0])
5580: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f  );.    pOp->opco
5590: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
55a0: 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d 3e 6e    if( addr==p->n
55b0: 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b  Op-1 ) p->nOp--;
55c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
55d0: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65   the last opcode
55e0: 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20   is "op" and it 
55f0: 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65  is not a jump de
5600: 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68  stination,.** th
5610: 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52  en remove it.  R
5620: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
5630: 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63  d only if an opc
5640: 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e  ode was removed.
5650: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
5660: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
5670: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38  code(Vdbe *p, u8
5680: 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e   op){.  if( (p->
5690: 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73  nOp-1)>(p->pPars
56a0: 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20  e->iFixedOp) && 
56b0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
56c0: 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20  .opcode==op ){. 
56d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
56e0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d  angeToNoop(p, p-
56f0: 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65 74  >nOp-1);.    ret
5700: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
5710: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5720: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
5730: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
5740: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f  he P4 operand fo
5750: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
5760: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
5770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5780: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
5790: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
57a0: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
57b0: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
57c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
57d0: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
57e0: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
57f0: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
5800: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
5810: 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68  **.** If n>=0 th
5820: 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  en the P4 operan
5830: 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65  d is dynamic, me
5840: 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70  aning that a cop
5850: 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69  y of.** the stri
5860: 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20  ng is made into 
5870: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
5880: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
5890: 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75  loc()..** A valu
58a0: 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20  e of n==0 means 
58b0: 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50  copy bytes of zP
58c0: 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c  4 up to and incl
58d0: 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72  uding the.** fir
58e0: 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49  st null byte.  I
58f0: 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20  f n>0 then copy 
5900: 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34  n+1 bytes of zP4
5910: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
5920: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
5930: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
5940: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
5950: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
5960: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
5970: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
5980: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
5990: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
59a0: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
59b0: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
59c0: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
59d0: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
59e0: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
59f0: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
5a00: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
5a10: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
5a20: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
5a30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5a40: 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62  VdbeChangeP4(Vdb
5a50: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
5a60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
5a70: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
5a80: 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Op;.  sqlite3 *d
5a90: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  b;.  assert( p!=
5aa0: 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  0 );.  db = p->d
5ab0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
5ac0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5ad0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
5ae0: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d  p->aOp==0 || db-
5af0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
5b00: 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56  .    if( n!=P4_V
5b10: 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72 65  TAB ){.      fre
5b20: 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64  eP4(db, n, (void
5b30: 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29  *)*(char**)&zP4)
5b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
5b50: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
5b60: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
5b70: 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e  assert( addr<p->
5b80: 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64  nOp );.  if( add
5b90: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
5ba0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
5bb0: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
5bc0: 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65 72  p[addr];.  asser
5bd0: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
5be0: 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20 20  P4_NOTUSED.     
5bf0: 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65    || pOp->p4type
5c00: 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20 20  ==P4_INT32.     
5c10: 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65    || pOp->p4type
5c20: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a  ==P4_KEYINFO );.
5c30: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
5c40: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
5c50: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  4.p);.  pOp->p4.
5c60: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d  p = 0;.  if( n==
5c70: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
5c80: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
5c90: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
5ca0: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
5cb0: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
5cc0: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
5cd0: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
5ce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
5cf0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
5d00: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
5d10: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
5d20: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
5d30: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
5d40: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
5d50: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
5d60: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5d70: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P4_NOTUSED;.  }
5d80: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
5d90: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4f  EYINFO ){.    pO
5da0: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
5db0: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5dc0: 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e  4type = P4_KEYIN
5dd0: 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FO;.  }else if( 
5de0: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20  n==P4_VTAB ){.  
5df0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5e00: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5e10: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56  p->p4type = P4_V
5e20: 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  TAB;.    sqlite3
5e30: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
5e40: 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73   *)zP4);.    ass
5e50: 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29  ert( ((VTable *)
5e60: 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20  zP4)->db==p->db 
5e70: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
5e80: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 ){.    pOp->p
5e90: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
5ea0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5eb0: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
5ec0: 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )n;.  }else{.   
5ed0: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20   if( n==0 ) n = 
5ee0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5ef0: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
5f00: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
5f10: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
5f20: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
5f30: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
5f40: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  MIC;.  }.}../*.*
5f50: 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20  * Set the P4 on 
5f60: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
5f70: 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74  y added opcode t
5f80: 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f  o the KeyInfo fo
5f90: 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67  r the.** index g
5fa0: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
5fb0: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
5fc0: 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
5fd0: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
5fe0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5ff0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6000: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
6010: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
6020: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
6030: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
6040: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
6050: 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
6060: 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20  Parse, pIdx),.  
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
6090: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
60a0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
60b0: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
60c0: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
60d0: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
60e0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
60f0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
6100: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
6110: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
6120: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
6130: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
6140: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
6150: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
6160: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
6170: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
6180: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
6190: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
61a0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
61b0: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
61c0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
61d0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
61e0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
61f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
6200: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
6210: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
6220: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
6230: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
6240: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
6250: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6260: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
6270: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
6280: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
6290: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
62a0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
62b0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
62c0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
62d0: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
62e0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
62f0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
6300: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
6310: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
6320: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
6330: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
6340: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6350: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
6360: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
6370: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
6380: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
6390: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
63a0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
63b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
63c0: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
63d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
63e0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
63f0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
6400: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
6410: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
6420: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
6430: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
6440: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
6450: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
6460: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
6470: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
6480: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
6490: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
64a0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
64b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
64c0: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
64d0: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
64e0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
64f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
6500: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6510: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
6520: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
6530: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
6540: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
6550: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
6560: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6570: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
6580: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
6590: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
65a0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
65b0: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
65c0: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
65d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
65e0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
65f0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
6600: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
6610: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
6620: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
6630: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
6640: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
6650: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
6660: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
6670: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
6680: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
6690: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
66a0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
66b0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
66c0: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
66d0: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
66e0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
66f0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
6700: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
6710: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
6720: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
6730: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
6740: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
6750: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
6760: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
6770: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6780: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
6790: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
67a0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
67b0: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
67c0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
67d0: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
67e0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
67f0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
6800: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
6810: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
6820: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
6830: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
6840: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
6850: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
6860: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
6870: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
6880: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
6890: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
68a0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
68b0: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
68c0: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
68d0: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
68e0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
68f0: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
6900: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
6910: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
6920: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
6930: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
6940: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
6950: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
6960: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
6970: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
6980: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
6990: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
69a0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
69b0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
69c0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
69d0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
69e0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
69f0: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
6a00: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
6a10: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
6a20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6a30: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
6a40: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
6a50: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
6a60: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
6a70: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
6a80: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
6a90: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
6aa0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
6ab0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
6ac0: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
6ad0: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
6ae0: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
6af0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
6b00: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
6b10: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
6b20: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
6b30: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
6b40: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
6b50: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
6b60: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
6b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
6b80: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
6b90: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
6ba0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
6bb0: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
6bc0: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
6bd0: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
6be0: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
6bf0: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
6c00: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
6c10: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
6c20: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
6c30: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
6c40: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
6c50: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
6c60: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
6c70: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
6c80: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
6c90: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
6ca0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
6cb0: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
6cc0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
6cd0: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
6ce0: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
6cf0: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
6d00: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
6d10: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
6d20: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
6d30: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
6d40: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
6d50: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
6d60: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
6d70: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
6d80: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
6d90: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
6da0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
6db0: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
6dc0: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
6dd0: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
6de0: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
6df0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
6e00: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
6e10: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
6e20: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
6e30: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
6e40: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
6e50: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
6e60: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
6e70: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
6e80: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
6e90: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
6ea0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6eb0: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
6ec0: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
6ed0: 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d  ii, jj;.  zOpNam
6ee0: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  e = sqlite3Opcod
6ef0: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
6f00: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20  e);.  nOpName = 
6f10: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6f20: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zOpName);.  if( 
6f30: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b  zOpName[nOpName+
6f40: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  1] ){.    int se
6f50: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63  enCom = 0;.    c
6f60: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f  har c;.    zSyno
6f70: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b  psis = zOpName +
6f80: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20  = nOpName + 1;. 
6f90: 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20     for(ii=jj=0; 
6fa0: 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63  jj<nTemp-1 && (c
6fb0: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d   = zSynopsis[ii]
6fc0: 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  )!=0; ii++){.   
6fd0: 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b     if( c=='P' ){
6fe0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79  .        c = zSy
6ff0: 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20  nopsis[++ii];.  
7000: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27        if( c=='4'
7010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7020: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7030: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
7040: 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20  j, "%s", zP4);. 
7050: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7060: 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20   c=='X' ){.     
7070: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7080: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7090: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
70a0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
70b0: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f            seenCo
70c0: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  m = 1;.        }
70d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
70e0: 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61  int v1 = transla
70f0: 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20  teP(c, pOp);.   
7100: 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20         int v2;. 
7110: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7120: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
7130: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
7140: 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20  d", v1);.       
7150: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
7160: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
7170: 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20  @P", 2)==0 ){.  
7180: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
7190: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  3;.            j
71a0: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
71b0: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d              v2 =
71d0: 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e   translateP(zSyn
71e0: 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b  opsis[ii], pOp);
71f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7200: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
7210: 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d  is+ii+1,"+1",2)=
7220: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7230: 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20      ii += 2;.   
7240: 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b             v2++;
7250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7260: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
7270: 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  2>1 ){.         
7280: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7290: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
72a0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22  zTemp+jj, "..%d"
72b0: 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20  , v1+v2-1);.    
72c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
72d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
72e0: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
72f0: 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29  ii+1, "..P3", 4)
7300: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ==0 && pOp->p3==
7310: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7320: 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20   ii += 4;.      
7330: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7340: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
7350: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7360: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d  emp+jj);.      }
7370: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54  else{.        zT
7380: 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20  emp[jj++] = c;. 
7390: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
73a0: 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26   if( !seenCom &&
73b0: 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70   jj<nTemp-5 && p
73c0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
73d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
73e0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
73f0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73   zTemp+jj, "; %s
7400: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
7410: 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  );.      jj += s
7420: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7430: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a  Temp+jj);.    }.
7440: 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70      if( jj<nTemp
7450: 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30   ) zTemp[jj] = 0
7460: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f  ;.  }else if( pO
7470: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
7480: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7490: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
74a0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
74b0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d  mment);.    jj =
74c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
74d0: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65  (zTemp);.  }else
74e0: 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d  {.    zTemp[0] =
74f0: 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a   0;.    jj = 0;.
7500: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b    }.  return jj;
7510: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7520: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23  ITE_DEBUG */...#
7530: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7540: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29  TE_OMIT_EXPLAIN)
7550: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45   || !defined(NDE
7560: 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64  BUG) \.     || d
7570: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
7580: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
7590: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
75a0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
75b0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
75c0: 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d  bes the P4 param
75d0: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f  eter for an opco
75e0: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70  de..** Use zTemp
75f0: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65   for any require
7600: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  d temporary buff
7610: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  er space..*/.sta
7620: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61  tic char *displa
7630: 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61  yP4(Op *pOp, cha
7640: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54  r *zTemp, int nT
7650: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  emp){.  char *zP
7660: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73  4 = zTemp;.  ass
7670: 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29  ert( nTemp>=20 )
7680: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d  ;.  switch( pOp-
7690: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63  >p4type ){.    c
76a0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
76b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
76c0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
76d0: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d  *pKeyInfo = pOp-
76e0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
76f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
7700: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
7710: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
7720: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7730: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25  emp, zTemp, "k(%
7740: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
7750: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
7760: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7770: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  (zTemp);.      f
7780: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
7790: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29  fo->nField; j++)
77a0: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
77b0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
77c0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
77d0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
77e0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  r *zColl = pColl
77f0: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
7800: 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20  : "nil";.       
7810: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
7820: 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b  Strlen30(zColl);
7830: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  .        if( n==
7840: 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c  6 && memcmp(zCol
7850: 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30  l,"BINARY",6)==0
7860: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43   ){.          zC
7870: 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20  oll = "B";.     
7880: 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
7890: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
78a0: 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b  ( i+n>nTemp-6 ){
78b0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
78c0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e  y(&zTemp[i],",..
78d0: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  .",4);.         
78e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
78f0: 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  }.        zTemp[
7900: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  i++] = ',';.    
7910: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
7920: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
7930: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65  ){.          zTe
7940: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20  mp[i++] = '-';. 
7950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7960: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
7970: 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a  ], zColl, n+1);.
7980: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a          i += n;.
7990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
79a0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
79b0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
79c0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
79d0: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
79e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
79f0: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
7a00: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
7a10: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
7a20: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
7a30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7a40: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7a50: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
7a60: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
7a70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7a80: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
7a90: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
7aa0: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
7ab0: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
7ac0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7ad0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7ae0: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
7af0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
7b00: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
7b10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7b20: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
7b30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7b40: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7b50: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
7b60: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
7b70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7b80: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
7b90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7ba0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7bb0: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
7bc0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
7bd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7be0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
7bf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7c00: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7c10: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  mp, "%.16g", *pO
7c20: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
7c30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7c40: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
7c50: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
7c60: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
7c70: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
7c80: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7c90: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
7ca0: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
7cb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
7cc0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7cd0: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
7ce0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7cf0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
7d00: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
7d10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7d20: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
7d30: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
7d40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d50: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7d60: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  p, "%.16g", pMem
7d70: 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
7d80: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
7d90: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
7da0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7db0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7dc0: 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29  , zTemp, "NULL")
7dd0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7de0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7df0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
7e00: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
7e10: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
7e20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7e30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
7e40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7e50: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
7e60: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
7e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
7e80: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
7e90: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
7ea0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
7eb0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7ec0: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
7ed0: 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74  :%p", pVtab, pVt
7ee0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20  ab->pModule);.  
7ef0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7f00: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
7f10: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
7f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7f30: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7f40: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29  emp, "intarray")
7f50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7f60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7f70: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
7f80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7f90: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7fa0: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  mp, "program");.
7fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7fc0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41   }.    case P4_A
7fd0: 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20  DVANCE: {.      
7fe0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
7ff0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8000: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
8010: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
8020: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
8030: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
8040: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
8050: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
8060: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
8070: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
8080: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
8090: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
80a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  if../*.** Declar
80b0: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
80c0: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
80d0: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
80e0: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  ] is used..**.**
80f0: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
8100: 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f  atements need to
8110: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65   know in advance
8120: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   the complete se
8130: 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  t of.** attached
8140: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
8150: 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20  will be use.  A 
8160: 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61  mask of these da
8170: 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61  tabases.** is ma
8180: 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62  intained in p->b
8190: 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70  treeMask.  The p
81a0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65  ->lockMask value
81b0: 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f   is the subset o
81c0: 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73  f.** p->btreeMas
81d0: 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74  k of databases t
81e0: 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65  hat will require
81f0: 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64   a lock..*/.void
8200: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
8210: 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69  Btree(Vdbe *p, i
8220: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
8230: 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62   i>=0 && i<p->db
8240: 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29  ->nDb && i<(int)
8250: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a  sizeof(yDbMask)*
8260: 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  8 );.  assert( i
8270: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e  <(int)sizeof(p->
8280: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a  btreeMask)*8 );.
8290: 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62    DbMaskSet(p->b
82a0: 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  treeMask, i);.  
82b0: 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69  if( i!=1 && sqli
82c0: 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65  te3BtreeSharable
82d0: 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  (p->db->aDb[i].p
82e0: 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73  Bt) ){.    DbMas
82f0: 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  kSet(p->lockMask
8300: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
8310: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8320: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
8330: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
8340: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
8350: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f   If SQLite is co
8360: 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72  mpiled to suppor
8370: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
8380: 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68  ode and to be th
8390: 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69  readsafe,.** thi
83a0: 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e  s routine obtain
83b0: 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  s the mutex asso
83c0: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
83d0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
83e0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20  ure.** that may 
83f0: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
8400: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
8410: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20  an argument. In 
8420: 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f  doing so it also
8430: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53  .** sets the BtS
8440: 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20  hared.db member 
8450: 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42  of each of the B
8460: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
8470: 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20  es, ensuring.** 
8480: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
8490: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
84a0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
84b0: 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  d if required..*
84c0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
84d0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
84e0: 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72   but does suppor
84f0: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
8500: 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c  ode, then.** sql
8510: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
8520: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73   is invoked to s
8530: 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  et the BtShared.
8540: 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  db variables.** 
8550: 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72  of all of BtShar
8560: 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63  ed structures ac
8570: 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65  cessible via the
8580: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
8590: 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20   .** associated 
85a0: 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a  with the VM..**.
85b0: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
85c0: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61  not threadsafe a
85d0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  nd does not supp
85e0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
85f0: 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66   mode, this.** f
8600: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
8610: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d  op..**.** The p-
8620: 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64  >btreeMask field
8630: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
8640: 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74   all btrees that
8650: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a   the prepared .*
8660: 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69  * statement p wi
8670: 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65  ll ever use.  Le
8680: 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65  t N be the numbe
8690: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e  r of bits in p->
86a0: 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72  btreeMask.** cor
86b0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74  responding to bt
86c0: 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68  rees that use sh
86d0: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
86e0: 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66  n the runtime of
86f0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
8700: 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73   is N*N.  But as
8710: 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72   N is rarely mor
8720: 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73  e than 1, this s
8730: 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20  hould not.** be 
8740: 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
8750: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  id sqlite3VdbeEn
8760: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ter(Vdbe *p){.  
8770: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
8780: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
8790: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66  .  int nDb;.  if
87a0: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
87b0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
87c0: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
87d0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
87e0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
87f0: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
8800: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
8810: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
8820: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
8830: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
8840: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
8850: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
8860: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
8870: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
8880: 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ter(aDb[i].pBt);
8890: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
88a0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
88b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
88c0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
88d0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
88e0: 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  >0./*.** Unlock 
88f0: 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65  all of the btree
8900: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  s previously loc
8910: 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  ked by a call to
8920: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
8930: 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r()..*/.void sql
8940: 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64  ite3VdbeLeave(Vd
8950: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
8960: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8970: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
8980: 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61   nDb;.  if( DbMa
8990: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63  skAllZero(p->loc
89a0: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b  kMask) ) return;
89b0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
89c0: 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70  case */.  db = p
89d0: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
89e0: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
89f0: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
8a00: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
8a10: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
8a20: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
8a30: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
8a40: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
8a50: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
8a60: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44  te3BtreeLeave(aD
8a70: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
8a80: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
8a90: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
8aa0: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
8ab0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
8ac0: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
8ad0: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
8ae0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8af0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
8b00: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
8b10: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
8b20: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
8b30: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
8b40: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
8b50: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
8b60: 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d    char zCom[100]
8b70: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
8b80: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
8b90: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
8ba0: 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25   %4d %4d %-13s %
8bb0: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
8bc0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
8bd0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
8be0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
8bf0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
8c00: 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tr));.#ifdef SQL
8c10: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
8c20: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69  IN_COMMENTS.  di
8c30: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
8c40: 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a  , zP4, zCom, siz
8c50: 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73  eof(zCom));.#els
8c60: 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b  e.  zCom[0] = 0;
8c70: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a  .#endif.  /* NB:
8c80: 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63    The sqlite3Opc
8c90: 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69  odeName() functi
8ca0: 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
8cb0: 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65  d by code create
8cc0: 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b  d.  ** by the mk
8cd0: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20  opcodeh.awk and 
8ce0: 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63  mkopcodec.awk sc
8cf0: 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72  ripts which extr
8d00: 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66  act the.  ** inf
8d10: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
8d20: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
8d30: 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74  text */.  fprint
8d40: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
8d50: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
8d60: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
8d70: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
8d80: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
8d90: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
8da0: 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d  ->p5,.      zCom
8db0: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
8dc0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
8dd0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
8de0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
8df0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
8e00: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
8e10: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
8e20: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
8e30: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
8e40: 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20  *pEnd = &p[N];. 
8e50: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
8e60: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d   p->db;.    u8 m
8e70: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64  alloc_failed = d
8e80: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
8e90: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
8ea0: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
8eb0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
8ec0: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
8ed0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8ee0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
8ef0: 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b        }while( (+
8f00: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
8f10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8f20: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73      do{.      as
8f30: 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70  sert( (&p[1])==p
8f40: 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  End || p[0].db==
8f50: 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20  p[1].db );.     
8f60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8f70: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
8f80: 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20  riants(p) );..  
8f90: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
8fa0: 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69  k is really an i
8fb0: 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f  nlined version o
8fc0: 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  f sqlite3VdbeMem
8fd0: 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20  Release().      
8fe0: 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64  ** that takes ad
8ff0: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66  vantage of the f
9000: 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d  act that the mem
9010: 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69  ory cell value i
9020: 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  s .      ** bein
9030: 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66  g set to NULL af
9040: 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e  ter releasing an
9050: 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72  y dynamic resour
9060: 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ces..      **.  
9070: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69      ** The justi
9080: 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  fication for dup
9090: 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73  licating code is
90a0: 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20   that according 
90b0: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  to .      ** cal
90c0: 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75  lgrind, this cau
90d0: 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65  ses a certain te
90e0: 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74  st case to hit t
90f0: 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20  he CPU 4.7 .    
9100: 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73    ** percent les
9110: 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63  s (x86 linux, gc
9120: 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c  c version 4.1.2,
9130: 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20   -O6) than if . 
9140: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d       ** sqlite3M
9150: 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65  emRelease() were
9160: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72   called from her
9170: 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69  e. With -O2, thi
9180: 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a  s jumps.      **
9190: 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e   to 6.6 percent.
91a0: 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69   The test case i
91b0: 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30  s inserting 1000
91c0: 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62   rows into a tab
91d0: 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  le .      ** wit
91e0: 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69  h no indexes usi
91f0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70  ng a single prep
9200: 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74  ared INSERT stat
9210: 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20  ement, bind() . 
9220: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
9230: 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65  t(). Inserts are
9240: 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20   grouped into a 
9250: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
9260: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74     */.      test
9270: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
9280: 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20   MEM_Agg );.    
9290: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
92a0: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
92b0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
92c0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
92d0: 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  _Frame );.      
92e0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
92f0: 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20  gs & MEM_RowSet 
9300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
9310: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
9320: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65  EM_Dyn|MEM_Frame
9330: 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a  |MEM_RowSet) ){.
9340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9350: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
9360: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9370: 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b  ( p->szMalloc ){
9380: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9390: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
93a0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
93b0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  p->szMalloc = 0;
93c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
93d0: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  p->flags = MEM_U
93e0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77  ndefined;.    }w
93f0: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
9400: 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   );.    db->mall
9410: 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
9420: 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a  c_failed;.  }.}.
9430: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
9440: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
9450: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
9460: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
9470: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
9480: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
9490: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
94a0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
94b0: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
94c0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
94d0: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
94e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
94f0: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
9500: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
9510: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
9520: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
9530: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
9540: 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Mem];.  for(i=0;
9550: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
9560: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
9570: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
9580: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
9590: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
95a0: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
95b0: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
95c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
95d0: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
95e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
95f0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
9600: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
9610: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
9620: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
9630: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
9640: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
9650: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
9660: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
9670: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
9680: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
9690: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
96a0: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
96b0: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
96c0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
96d0: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
96e0: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
96f0: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
9700: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
9710: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
9720: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
9730: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
9740: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
9750: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
9760: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
9770: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
9780: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
9790: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
97a0: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
97b0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
97c0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
97d0: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
97e0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
97f0: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
9800: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
9810: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
9820: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
9830: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
9840: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
9850: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
9860: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9880: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
9890: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
98c0: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
98d0: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
98e0: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
98f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9900: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9910: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
9920: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
9930: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
9940: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
9950: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
9960: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
9970: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
99a0: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
99b0: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
99c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
99d0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
99e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
99f0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9a00: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9a30: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
9a40: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9a50: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
9a60: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
9a70: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
9a80: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  em = &p->aMem[1]
9a90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9aa0: 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65   First Mem of re
9ab0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61  sult set */..  a
9ac0: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
9ad0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
9ae0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
9af0: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
9b00: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
9b10: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
9b20: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
9b30: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
9b40: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
9b50: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
9b60: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
9b70: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
9b80: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
9b90: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
9ba0: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
9bb0: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
9bc0: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
9bd0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9be0: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
9bf0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
9c00: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
9c10: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
9c20: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
9c30: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
9c40: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
9c50: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
9c60: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
9c70: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
9c80: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
9c90: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
9ca0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
9cb0: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
9cc0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
9cd0: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
9ce0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9cf0: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
9d00: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
9d10: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
9d20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
9d30: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
9d40: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
9d50: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
9d60: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
9d70: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
9d80: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
9d90: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
9da0: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
9db0: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
9dc0: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
9dd0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
9de0: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
9df0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
9e00: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
9e10: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
9e20: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
9e30: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
9e40: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
9e50: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
9e60: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
9e70: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
9e80: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
9e90: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
9ea0: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
9eb0: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
9ec0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
9ed0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
9ee0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
9ef0: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
9f00: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
9f10: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
9f20: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
9f30: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
9f40: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
9f50: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
9f60: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
9f70: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
9f80: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
9f90: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
9fa0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
9fb0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
9fc0: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
9fd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9fe0: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
9ff0: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
a000: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
a010: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
a020: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
a030: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
a040: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
a050: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
a060: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
a070: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
a080: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
a090: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
a0a0: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
a0b0: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
a0c0: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
a0d0: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
a0e0: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
a0f0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
a100: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
a110: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
a120: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
a130: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
a140: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
a150: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
a160: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
a170: 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70  i<nRow && p->exp
a180: 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f  lain==2 && p->aO
a190: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
a1a0: 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  Explain );.  if(
a1b0: 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20   i>=nRow ){.    
a1c0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
a1d0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
a1e0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
a1f0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
a200: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
a210: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
a220: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
a230: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
a240: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
a250: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
a260: 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71  sg, db, "%s", sq
a270: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
a280: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
a290: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20    char *zP4;.   
a2a0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66   Op *pOp;.    if
a2b0: 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ( i<p->nOp ){.  
a2c0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
a2d0: 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  t line number is
a2e0: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68   small enough th
a2f0: 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  at we are still 
a300: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
a310: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f  main program. */
a320: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d  .      pOp = &p-
a330: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  >aOp[i];.    }el
a340: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  se{.      /* We 
a350: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69  are currently li
a360: 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d  sting subprogram
a370: 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  s.  Figure out w
a380: 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20  hich one and.   
a390: 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68     ** pick up th
a3a0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70  e appropriate op
a3b0: 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  code. */.      i
a3c0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d  nt j;.      i -=
a3d0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66   p->nOp;.      f
a3e0: 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62  or(j=0; i>=apSub
a3f0: 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a  [j]->nOp; j++){.
a400: 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53          i -= apS
a410: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[j]->nOp;.    
a420: 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20    }.      pOp = 
a430: 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69  &apSub[j]->aOp[i
a440: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
a450: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
a460: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
a470: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
a480: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
a490: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
a4c0: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  unter */.      p
a4d0: 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20  Mem++;.  .      
a4e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a4f0: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
a500: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
a510: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
a520: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
a530: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
a540: 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20  ; /* Opcode */. 
a550: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
a560: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
a570: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
a580: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
a590: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
a5a0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
a5b0: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
a5c0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
a5d0: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
a5e0: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
a5f0: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
a600: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
a610: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
a620: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
a630: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
a640: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
a650: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
a660: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
a670: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
a680: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
a690: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
a6a0: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
a6b0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
a6c0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
a6d0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a6e0: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
a6f0: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
a700: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
a710: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
a720: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
a730: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
a740: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
a750: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
a760: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
a770: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
a780: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
a790: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a7a0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
a7b0: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
a7c0: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
a7d0: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
a7e0: 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20   nSub!=0) ){.   
a7f0: 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28         apSub = (
a800: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
a810: 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20  ub->z;.         
a820: 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d   apSub[nSub++] =
a830: 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61   pOp->p4.pProgra
a840: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  m;.          pSu
a850: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  b->flags |= MEM_
a860: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20  Blob;.          
a870: 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73  pSub->n = nSub*s
a880: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
a890: 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  *);.        }.  
a8a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a8b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a8c0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
a8d0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
a900: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
a910: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a920: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
a930: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
a940: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a960: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P2 */.    pMem++
a970: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
a980: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
a990: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
a9a0: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P3 */.    pMe
a9d0: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  m++;..    if( sq
a9e0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
a9f0: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
aa00: 20 33 32 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f   32) ){ /* P4 */
aa10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
aa20: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
aa30: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
aa40: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
aa50: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
aa60: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
aa70: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
aa80: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
aa90: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29  Op, pMem->z, 32)
aaa0: 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70  ;.    if( zP4!=p
aab0: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
aac0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
aad0: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
aae0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
aaf0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
ab00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
ab10: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
ab20: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
ab30: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
ab40: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
ab50: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
ab60: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
ab70: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
ab80: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
ab90: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
aba0: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
abb0: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29  dResize(pMem, 4)
abc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
abd0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
abe0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
abf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ac00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
ac10: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
ac20: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
ac30: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
ac40: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
ac50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ac60: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
ac70: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
ac80: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
ac90: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
aca0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
acb0: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
acc0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
acd0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
ace0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
acf0: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
ad00: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29  esize(pMem, 500)
ad10: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
ad20: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
ad30: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
ad40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ad50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
ad60: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
ad70: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
ad80: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
ad90: 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d  ->n = displayCom
ada0: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70  ment(pOp, zP4, p
adb0: 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20  Mem->z, 500);.  
adc0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
add0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c  SQLITE_UTF8;.#el
ade0: 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  se.      pMem->f
adf0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae10: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e         /* Commen
ae20: 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  t */.#endif.    
ae30: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
ae40: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
ae50: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
ae60: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
ae70: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20   &p->aMem[1];.  
ae80: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
ae90: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
aea0: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
aeb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
aec0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
aed0: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
aee0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
aef0: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
af00: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
af10: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
af20: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
af30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
af40: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
af50: 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63  e *p){.  const c
af60: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
af70: 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
af80: 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20   z = p->zSql;.  
af90: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70  }else if( p->nOp
afa0: 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=1 ){.    const
afb0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
afc0: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69  p->aOp[0];.    i
afd0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
afe0: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
aff0: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  p4.z!=0 ){.     
b000: 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a   z = pOp->p4.z;.
b010: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
b020: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
b030: 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) z++;.    }.  }
b040: 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74  .  if( z ) print
b050: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
b060: 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   z);.}.#endif..#
b070: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b080: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
b090: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
b0a0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
b0b0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
b0c0: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
b0d0: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
b0e0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
b0f0: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
b100: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
b110: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
b120: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
b130: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
b140: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
b150: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
b160: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
b170: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
b180: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
b190: 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70  P_Init && pOp->p
b1a0: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  4.z!=0 ){.    in
b1b0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
b1c0: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
b1d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
b1e0: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
b1f0: 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  ", pOp->p4.z);. 
b200: 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69     for(i=0; sqli
b210: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
b220: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72  ; i++){}.    for
b230: 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (j=0; z[i]; i++)
b240: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
b250: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
b260: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
b270: 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20  z[i-1]!=' ' ){. 
b280: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
b290: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
b2a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b2b0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
b2c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
b2d0: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b   }.    z[j] = 0;
b2e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72  .    sqlite3IoTr
b2f0: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
b300: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
b310: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
b320: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
b330: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
b340: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  */../*.** Alloca
b350: 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20  te space from a 
b360: 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65  fixed size buffe
b370: 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  r and return a p
b380: 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61  ointer to.** tha
b390: 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73  t space.  If ins
b3a0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
b3b0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
b3c0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
b3d0: 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65   The pBuf parame
b3e0: 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69  ter is the initi
b3f0: 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f  al value of a po
b400: 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c  inter which will
b410: 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20  .** receive the 
b420: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75  new memory.  pBu
b430: 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55  f is normally NU
b440: 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20  LL.  If pBuf is 
b450: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20  not.** NULL, it 
b460: 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72  means that memor
b470: 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65  y space has alre
b480: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
b490: 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74  ed and that.** t
b4a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
b4b0: 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  ld not allocate 
b4c0: 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20  any new memory. 
b4d0: 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f   When pBuf is no
b4e0: 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79  t.** NULL simply
b4f0: 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f   return pBuf.  O
b500: 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77  nly allocate new
b510: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68   memory space wh
b520: 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55  en pBuf.** is NU
b530: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20  LL..**.** nByte 
b540: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b550: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
b560: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70  needed..**.** *p
b570: 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20  pFrom points to 
b580: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20  available space 
b590: 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20  and pEnd points 
b5a0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
b5b0: 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73  e.** available s
b5c0: 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63  pace.  When spac
b5d0: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20  e is allocated, 
b5e0: 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e  *ppFrom is advan
b5f0: 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ced past.** the 
b600: 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  end of the alloc
b610: 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a  ated space..**.*
b620: 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63  * *pnByte is a c
b630: 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75  ounter of the nu
b640: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
b650: 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65   space that have
b660: 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c   failed.** to al
b670: 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72  locate.  If ther
b680: 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e  e is insufficien
b690: 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72  t space in *ppFr
b6a0: 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  om to satisfy th
b6b0: 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68  e.** request, th
b6c0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  en increment *pn
b6d0: 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75  Byte by the amou
b6e0: 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  nt of the reques
b6f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
b700: 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20  d *allocSpace(. 
b710: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
b720: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72        /* Where r
b730: 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69  eturn pointer wi
b740: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a  ll be stored */.
b750: 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
b760: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b770: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c   of bytes to all
b780: 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a  ocate */.  u8 **
b790: 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20  ppFrom,         
b7a0: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63  /* IN/OUT: Alloc
b7b0: 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d  ate from *ppFrom
b7c0: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20   */.  u8 *pEnd, 
b7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
b7e0: 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20  inter to 1 byte 
b7f0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
b800: 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a  *ppFrom buffer *
b810: 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20  /.  int *pnByte 
b820: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
b830: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  llocation cannot
b840: 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d   be made, increm
b850: 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29  ent *pnByte */.)
b860: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
b870: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
b880: 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69  (*ppFrom) );.  i
b890: 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e  f( pBuf ) return
b8a0: 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d   pBuf;.  nByte =
b8b0: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
b8c0: 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29    if( &(*ppFrom)
b8d0: 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20  [nByte] <= pEnd 
b8e0: 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76  ){.    pBuf = (v
b8f0: 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20  oid*)*ppFrom;.  
b900: 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79    *ppFrom += nBy
b910: 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  te;.  }else{.   
b920: 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74   *pnByte += nByt
b930: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
b940: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
b950: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
b960: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
b970: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
b980: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
b990: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
b9a0: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
b9b0: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
b9c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
b9d0: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
b9e0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
b9f0: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
ba00: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
ba10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
ba20: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
ba30: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
ba40: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
ba50: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
ba60: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
ba70: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
ba80: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
ba90: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
baa0: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
bab0: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
bac0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
bad0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69  E_MAGIC_RUN;..#i
bae0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
baf0: 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  G.  for(i=1; i<p
bb00: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
bb10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
bb20: 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29  m[i].db==p->db )
bb30: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
bb40: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
bb50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bb60: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
bb70: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
bb80: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
bb90: 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e  AGIC_RUN;.  p->n
bba0: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d  Change = 0;.  p-
bbb0: 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20  >cacheCtr = 1;. 
bbc0: 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
bbd0: 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20  Format = 255;.  
bbe0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
bbf0: 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  0;.  p->nFkConst
bc00: 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65  raint = 0;.#ifde
bc10: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
bc20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
bc30: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d  Op; i++){.    p-
bc40: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
bc50: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
bc60: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23  ycles = 0;.  }.#
bc70: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
bc80: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
bc90: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
bca0: 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66  cution for the f
bcb0: 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a  irst time after.
bcc0: 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  ** creating the 
bcd0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
bce0: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
bcf0: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
bd00: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67  s allocating reg
bd10: 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69  isters and initi
bd20: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
bd30: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
bd40: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
bd50: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
bd60: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
bd70: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
bd80: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
bd90: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
bda0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e   .**.** This fun
bdb0: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
bdc0: 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  led exactly once
bdd0: 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c   on each virtual
bde0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74   machine..** Aft
bdf0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
be00: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d  is called the VM
be10: 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61   has been "packa
be20: 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64  ged" and is read
be30: 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66  y.** to run.  Af
be40: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
be50: 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74   is called, furt
be60: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  her calls to .**
be70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
be80: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  p() functions ar
be90: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54  e prohibited.  T
bea0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63  his routine disc
beb0: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56  onnects.** the V
bec0: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72  dbe from the Par
bed0: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  se object that h
bee0: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69  elped generate i
bef0: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  t so that the.**
bf00: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65   the Vdbe become
bf10: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74  s an independent
bf20: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20   entity and the 
bf30: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e  Parse object can
bf40: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64   be.** destroyed
bf50: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
bf60: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
bf70: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  d() procedure to
bf80: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75   restore a virtu
bf90: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a  al machine back.
bfa0: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61  ** to its initia
bfb0: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74  l state after it
bfc0: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a   has been run..*
bfd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
bfe0: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
bff0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c010: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50   The VDBE */.  P
c020: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20  arse *pParse    
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c040: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
c050: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
c060: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
c070: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
c080: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c090: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  on */.  int nVar
c0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c0b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c0c0: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a   of parameters *
c0d0: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c100: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  VM memory regist
c110: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ers */.  int nCu
c120: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
c130: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c140: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71  r of cursors req
c150: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
c160: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
c170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c180: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
c190: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20   in subprograms 
c1a0: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20  */.  int nOnce; 
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c1d0: 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63   OP_Once instruc
c1e0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tions */.  int n
c1f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c210: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
c220: 38 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20  8 *zCsr;        
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c240: 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   Memory availabl
c250: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
c260: 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20   */.  u8 *zEnd; 
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
c290: 74 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65  te past allocate
c2a0: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
c2b0: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c2d0: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d  How much extra m
c2e0: 65 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20  emory is needed 
c2f0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  */..  assert( p!
c300: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c310: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
c320: 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
c330: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
c340: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
c350: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
c360: 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70  rt( pParse==p->p
c370: 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20  Parse );.  db = 
c380: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
c390: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c3a0: 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d  d==0 );.  nVar =
c3b0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20   pParse->nVar;. 
c3c0: 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   nMem = pParse->
c3d0: 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20  nMem;.  nCursor 
c3e0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
c3f0: 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d    nArg = pParse-
c400: 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63  >nMaxArg;.  nOnc
c410: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63  e = pParse->nOnc
c420: 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d  e;.  if( nOnce==
c430: 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f  0 ) nOnce = 1; /
c440: 2a 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73  * Ensure at leas
c450: 74 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d  t one byte in p-
c460: 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a  >aOnceFlag[] */.
c470: 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68    .  /* For each
c480: 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64   cursor required
c490: 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20  , also allocate 
c4a0: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d  a memory cell. M
c4b0: 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73  emory.  ** cells
c4c0: 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72   (nMem+1-nCursor
c4d0: 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69  )..nMem, inclusi
c4e0: 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ve, will never b
c4f0: 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74  e used by.  ** t
c500: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e  he vdbe program.
c510: 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72   Instead they ar
c520: 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  e used to alloca
c530: 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a  te space for.  *
c540: 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43  * VdbeCursor/BtC
c550: 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73  ursor structures
c560: 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  . The blob of me
c570: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
c580: 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f  with .  ** curso
c590: 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e  r 0 is stored in
c5a0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65   memory cell nMe
c5b0: 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28  m. Memory cell (
c5c0: 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f  nMem-1).  ** sto
c5d0: 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  res the blob of 
c5e0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
c5f0: 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c  d with cursor 1,
c600: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
c610: 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61  See also: alloca
c620: 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f  teCursor()..  */
c630: 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73  .  nMem += nCurs
c640: 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  or;..  /* Alloca
c650: 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
c660: 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53  ory registers, S
c670: 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44  QL variables, VD
c680: 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a  BE cursors and .
c690: 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f    ** an array to
c6a0: 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e   marshal SQL fun
c6b0: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
c6c0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20  in..  */.  zCsr 
c6d0: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
c6e0: 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 20 20  ->nOp];         
c6f0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
c700: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  liable for alloc
c710: 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20  ation */.  zEnd 
c720: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
c730: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d  Parse->nOpAlloc]
c740: 3b 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65  ;  /* First byte
c750: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73   past end of zCs
c760: 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76  r[] */..  resolv
c770: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
c780: 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74  rg);.  p->usesSt
c790: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  mtJournal = (u8)
c7a0: 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  (pParse->isMulti
c7b0: 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d  Write && pParse-
c7c0: 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66  >mayAbort);.  if
c7d0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
c7e0: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
c7f0: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
c800: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72   }.  memset(zCsr
c810: 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b  , 0, zEnd-zCsr);
c820: 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72  .  zCsr += (zCsr
c830: 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20   - (u8*)0)&7;.  
c840: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
c850: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73  TE_ALIGNMENT(zCs
c860: 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72  r) );.  p->expir
c870: 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65  ed = 0;..  /* Me
c880: 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65  mory for registe
c890: 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20  rs, parameters, 
c8a0: 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20  cursor, etc, is 
c8b0: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f  allocated in two
c8c0: 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f  .  ** passes.  O
c8d0: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73  n the first pass
c8e0: 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73  , we try to reus
c8f0: 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61  e unused space a
c900: 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20  t the .  ** end 
c910: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
c920: 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20  ray.  If we are 
c930: 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  unable to satisf
c940: 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a  y all memory.  *
c950: 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62  * requirements b
c960: 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70  y reusing the op
c970: 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c  code array tail,
c980: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
c990: 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20  .  ** pass will 
c9a0: 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74  fill in the rest
c9b0: 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61   using a fresh a
c9c0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a  llocation.  .  *
c9d0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d  *.  ** This two-
c9e0: 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68  pass approach th
c9f0: 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63  at reuses as muc
ca00: 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
ca10: 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  ible from.  ** t
ca20: 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63  he leftover spac
ca30: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
ca40: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
ca50: 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74   can significant
ca60: 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74  ly.  ** reduce t
ca70: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
ca80: 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72  ory held by a pr
ca90: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
caa0: 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20  ..  */.  do {.  
cab0: 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20    nByte = 0;.   
cac0: 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
cad0: 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e  Space(p->aMem, n
cae0: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Mem*sizeof(Mem),
caf0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
cb00: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56  Byte);.    p->aV
cb10: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
cb20: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69  p->aVar, nVar*si
cb30: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
cb40: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
cb50: 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20  .    p->apArg = 
cb60: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
cb70: 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
cb80: 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  (Mem*), &zCsr, z
cb90: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
cba0: 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c    p->azVar = all
cbb0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72  ocSpace(p->azVar
cbc0: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68  , nVar*sizeof(ch
cbd0: 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  ar*), &zCsr, zEn
cbe0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
cbf0: 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63  p->apCsr = alloc
cc00: 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20  Space(p->apCsr, 
cc10: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
cc20: 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20  dbeCursor*),.   
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45         &zCsr, zE
cc50: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
cc60: 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20   p->aOnceFlag = 
cc70: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f  allocSpace(p->aO
cc80: 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20  nceFlag, nOnce, 
cc90: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
cca0: 79 74 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  yte);.#ifdef SQL
ccb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
ccc0: 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70  SCANSTATUS.    p
ccd0: 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63  ->anExec = alloc
cce0: 53 70 61 63 65 28 70 2d 3e 61 6e 45 78 65 63 2c  Space(p->anExec,
ccf0: 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69   p->nOp*sizeof(i
cd00: 36 34 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  64), &zCsr, zEnd
cd10: 2c 20 26 6e 42 79 74 65 29 3b 0a 23 65 6e 64 69  , &nByte);.#endi
cd20: 66 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  f.    if( nByte 
cd30: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65  ){.      p->pFre
cd40: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
cd50: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
cd60: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  e);.    }.    zC
cd70: 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20  sr = p->pFree;. 
cd80: 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b     zEnd = &zCsr[
cd90: 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65  nByte];.  }while
cda0: 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e  ( nByte && !db->
cdb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
cdc0: 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  p->nCursor = 
cdd0: 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f  nCursor;.  p->nO
cde0: 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b  nceFlag = nOnce;
cdf0: 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29  .  if( p->aVar )
ce00: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20  {.    p->nVar = 
ce10: 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20  (ynVar)nVar;.   
ce20: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
ce30: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
ce40: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
ce50: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
ce60: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
ce70: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
ce80: 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 26 26   if( p->azVar &&
ce90: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3e 30   pParse->nzVar>0
cea0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72   ){.    p->nzVar
ceb0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   = pParse->nzVar
cec0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
ced0: 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61  azVar, pParse->a
cee0: 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73  zVar, p->nzVar*s
cef0: 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30  izeof(p->azVar[0
cf00: 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ]));.    memset(
cf10: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30  pParse->azVar, 0
cf20: 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a  , pParse->nzVar*
cf30: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
cf40: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  zVar[0]));.  }. 
cf50: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
cf60: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
cf90: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
cfa0: 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  */.    p->nMem =
cfb0: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
cfc0: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
cfd0: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
cfe0: 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d  -1 */.    for(n=
cff0: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29  1; n<=nMem; n++)
d000: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  {.      p->aMem[
d010: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  n].flags = MEM_U
d020: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20  ndefined;.      
d030: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
d040: 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  db;.    }.  }.  
d050: 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
d060: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
d070: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
d080: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  d(p);.}../*.** C
d090: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73  lose a VDBE curs
d0a0: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  or and release a
d0b0: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
d0c0: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a   that cursor .**
d0d0: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64   happens to hold
d0e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d0f0: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
d100: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
d110: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
d120: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
d130: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
d140: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c  ite3VdbeSorterCl
d150: 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b  ose(p->db, pCx);
d160: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20  .  if( pCx->pBt 
d170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
d180: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
d190: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  t);.    /* The p
d1a0: 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
d1b0: 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
d1c0: 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
d1d0: 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a  xists, by.    **
d1e0: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
d1f0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
d200: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
d210: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
d220: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
d230: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  >pCursor);.  }.#
d240: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d250: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
d260: 20 20 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e    else if( pCx->
d270: 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20  pVtabCursor ){. 
d280: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f     sqlite3_vtab_
d290: 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
d2a0: 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62  sor = pCx->pVtab
d2b0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73  Cursor;.    cons
d2c0: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
d2d0: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61   *pModule = pVta
d2e0: 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e  bCursor->pVtab->
d2f0: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e  pModule;.    p->
d300: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31  inVtabMethod = 1
d310: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
d320: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
d330: 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  r);.    p->inVta
d340: 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d  bMethod = 0;.  }
d350: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
d360: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
d370: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
d380: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
d390: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
d3a0: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
d3b0: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
d3c0: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
d3d0: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
d3e0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
d3f0: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
d400: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
d410: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
d420: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
d430: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
d440: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
d450: 61 6d 65 2d 3e 76 3b 0a 23 69 66 64 65 66 20 53  ame->v;.#ifdef S
d460: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
d470: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76  T_SCANSTATUS.  v
d480: 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d  ->anExec = pFram
d490: 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69  e->anExec;.#endi
d4a0: 66 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67  f.  v->aOnceFlag
d4b0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65   = pFrame->aOnce
d4c0: 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65  Flag;.  v->nOnce
d4d0: 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  Flag = pFrame->n
d4e0: 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61  OnceFlag;.  v->a
d4f0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70  Op = pFrame->aOp
d500: 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72  ;.  v->nOp = pFr
d510: 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61  ame->nOp;.  v->a
d520: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d  Mem = pFrame->aM
d530: 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20  em;.  v->nMem = 
d540: 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pFrame->nMem;.  
d550: 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d  v->apCsr = pFram
d560: 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e  e->apCsr;.  v->n
d570: 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d  Cursor = pFrame-
d580: 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64  >nCursor;.  v->d
d590: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  b->lastRowid = p
d5a0: 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
d5b0: 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  v->nChange =
d5c0: 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
d5d0: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e  ;.  v->db->nChan
d5e0: 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62  ge = pFrame->nDb
d5f0: 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e  Change;.  return
d600: 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a   pFrame->pc;.}..
d610: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
d620: 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41  cursors..**.** A
d630: 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20  lso release any 
d640: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68  dynamic memory h
d650: 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e  eld by the VM in
d660: 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d   the Vdbe.aMem m
d670: 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61  emory .** cell a
d680: 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65  rray. This is ne
d690: 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d  cessary as the m
d6a0: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79  emory cell array
d6b0: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   may contain.** 
d6c0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65  pointers to Vdbe
d6d0: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77  Frame objects, w
d6e0: 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e  hich may in turn
d6f0: 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
d700: 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72  s to.** open cur
d710: 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sors..*/.static 
d720: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
d730: 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
d740: 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
d750: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
d760: 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72  *pFrame;.    for
d770: 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d  (pFrame=p->pFram
d780: 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  e; pFrame->pPare
d790: 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d  nt; pFrame=pFram
d7a0: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
d7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
d7c0: 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29  eRestore(pFrame)
d7d0: 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20  ;.    p->pFrame 
d7e0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61  = 0;.    p->nFra
d7f0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  me = 0;.  }.  as
d800: 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d  sert( p->nFrame=
d810: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  =0 );..  if( p->
d820: 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74  apCsr ){.    int
d830: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
d840: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
d850: 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43  ++){.      VdbeC
d860: 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61  ursor *pC = p->a
d870: 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69  pCsr[i];.      i
d880: 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20  f( pC ){.       
d890: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
d8a0: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
d8b0: 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b         p->apCsr[
d8c0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
d8d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
d8e0: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
d8f0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26  eleaseMemArray(&
d900: 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e  p->aMem[1], p->n
d910: 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  Mem);.  }.  whil
d920: 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20  e( p->pDelFrame 
d930: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
d940: 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c   *pDel = p->pDel
d950: 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44  Frame;.    p->pD
d960: 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e  elFrame = pDel->
d970: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
d980: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
d990: 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a  ete(pDel);.  }..
d9a0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
d9b0: 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69  auxdata allocati
d9c0: 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ons made by the 
d9d0: 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  VM */.  if( p->p
d9e0: 41 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65  AuxData ) sqlite
d9f0: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
da00: 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  ta(p, -1, 0);.  
da10: 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44  assert( p->pAuxD
da20: 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ata==0 );.}../*.
da30: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
da40: 56 4d 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c  VM after a singl
da50: 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  e run..*/.static
da60: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
da70: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
da80: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
da90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
daa0: 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  BUG.  /* Execute
dab0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
dac0: 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
dad0: 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43  hat the Vdbe.apC
dae0: 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56  sr[] and .  ** V
daf0: 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79  dbe.aMem[] array
db00: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
db10: 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20  een cleaned up. 
db20: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
db30: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f  f( p->apCsr ) fo
db40: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
db50: 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  sor; i++) assert
db60: 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  ( p->apCsr[i]==0
db70: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65   );.  if( p->aMe
db80: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  m ){.    for(i=1
db90: 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  ; i<=p->nMem; i+
dba0: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d  +) assert( p->aM
dbb0: 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d  em[i].flags==MEM
dbc0: 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20  _Undefined );.  
dbd0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
dbe0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
dbf0: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
dc00: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
dc10: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
dc20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
dc30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
dc40: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ult columns that
dc50: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
dc60: 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a  d by this SQL.**
dc70: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
dc80: 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63   is now set at c
dc90: 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74  ompile time, rat
dca0: 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a  her than during.
dcb0: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
dcc0: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
dcd0: 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
dce0: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20  _column_count() 
dcf0: 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64  can.** be called
dd00: 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65   on an SQL state
dd10: 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69  ment before sqli
dd20: 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76  te3_step()..*/.v
dd30: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
dd40: 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a  etNumCols(Vdbe *
dd50: 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d  p, int nResColum
dd60: 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  n){.  Mem *pColN
dd70: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ame;.  int n;.  
dd80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
dd90: 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d  >db;..  releaseM
dda0: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
ddb0: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
ddc0: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
ddd0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
dde0: 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
ddf0: 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
de00: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70  n*COLNAME_N;.  p
de10: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28  ->nResColumn = (
de20: 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a  u16)nResColumn;.
de30: 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20    p->aColName = 
de40: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a  pColName = (Mem*
de50: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
de60: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
de70: 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20  Mem)*n );.  if( 
de80: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  p->aColName==0 )
de90: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
dea0: 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
deb0: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73   pColName->flags
dec0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
ded0: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20   pColName->db = 
dee0: 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e  p->db;.    pColN
def0: 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ame++;.  }.}../*
df00: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
df10: 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63   of the idx'th c
df20: 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75  olumn to be retu
df30: 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  rned by the SQL 
df40: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e  statement..** zN
df50: 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ame must be a po
df60: 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74  inter to a nul t
df70: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
df80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
df90: 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61  l must be made a
dfa0: 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
dfb0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
dfc0: 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cols()..**.** Th
dfd0: 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
dfe0: 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65  r, xDel, must be
dff0: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44   one of SQLITE_D
e000: 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53  YNAMIC, SQLITE_S
e010: 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49  TATIC.** or SQLI
e020: 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66  TE_TRANSIENT. If
e030: 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59   it is SQLITE_DY
e040: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20  NAMIC, then the 
e050: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a  buffer pointed.*
e060: 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69  * to by zName wi
e070: 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73  ll be freed by s
e080: 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77  qlite3DbFree() w
e090: 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
e0a0: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e  destroyed..*/.in
e0b0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  t sqlite3VdbeSet
e0c0: 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20  ColName(.  Vdbe 
e0d0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
e0f0: 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67  dbe being config
e100: 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ured */.  int id
e110: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
e120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
e130: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e  dex of column zN
e140: 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a  ame applies to *
e150: 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20  /.  int var,    
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
e180: 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e  he COLNAME_* con
e190: 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  stants */.  cons
e1a0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e1c0: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
e1d0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d  r containing nam
e1e0: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
e1f0: 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20  el)(void*)      
e200: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
e210: 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72  y management str
e220: 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20  ategy for zName 
e230: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
e240: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
e250: 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
e260: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
e270: 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
e280: 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
e290: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
e2a0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  iled ){.    asse
e2b0: 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44  rt( !zName || xD
e2c0: 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d  el!=SQLITE_DYNAM
e2d0: 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  IC );.    return
e2e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e2f0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
e300: 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  aColName!=0 );. 
e310: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d   pColName = &(p-
e320: 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61  >aColName[idx+va
e330: 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d  r*p->nResColumn]
e340: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
e350: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
e360: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
e370: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
e380: 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74   xDel);.  assert
e390: 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d  ( rc!=0 || !zNam
e3a0: 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e  e || (pColName->
e3b0: 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21  flags&MEM_Term)!
e3c0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
e3d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65  c;.}../*.** A re
e3e0: 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
e3f0: 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d  saction may or m
e400: 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65  ay not be active
e410: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
e420: 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20  dle.** db. If a 
e430: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
e440: 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74  ctive, commit it
e450: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a  . If there is a.
e460: 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
e470: 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f  tion spanning mo
e480: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
e490: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
e4a0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73  routine.** takes
e4b0: 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73   care of the mas
e4c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63  ter journal tric
e4d0: 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  kery..*/.static 
e4e0: 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73  int vdbeCommit(s
e4f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
e500: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
e510: 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b   int nTrans = 0;
e520: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
e530: 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e  atabases with an
e540: 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72   active write-tr
e550: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ansaction */.  i
e560: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e570: 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
e580: 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65  mmit = 0;..#ifde
e590: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e5a0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
e5b0: 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e  With this option
e5c0: 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  , sqlite3VtabSyn
e5d0: 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  c() is defined t
e5e0: 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a  o be simply .  *
e5f0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70  * SQLITE_OK so p
e600: 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20   is not used. . 
e610: 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
e620: 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69  AMETER(p);.#endi
e630: 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  f..  /* Before d
e640: 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
e650: 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
e660: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
e670: 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
e680: 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
e690: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
e6a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
e6b0: 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
e6c0: 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
e6d0: 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
e6e0: 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
e6f0: 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
e700: 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
e710: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
e720: 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
e730: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
e740: 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
e750: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
e760: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
e770: 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f  ync(db, p);..  /
e780: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65  * This loop dete
e790: 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68  rmines (a) if th
e7a0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68  e commit hook sh
e7b0: 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
e7c0: 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77  and.  ** (b) how
e7d0: 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66   many database f
e7e0: 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77  iles have open w
e7f0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
e800: 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63  s, not .  ** inc
e810: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20  luding the temp 
e820: 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73  database. (b) is
e830: 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75   important becau
e840: 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20  se if more than 
e850: 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61  .  ** one databa
e860: 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f  se file has an o
e870: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
e880: 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20  ction, a master 
e890: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
e8a0: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
e8b0: 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d  r an atomic comm
e8c0: 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  it..  */ .  for(
e8d0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e8e0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
e8f0: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
e900: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e910: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
e920: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
e930: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
e940: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
e950: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
e960: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
e970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
e980: 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20  reeEnter(pBt);. 
e990: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e9a0: 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
e9b0: 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65  ock(sqlite3Btree
e9c0: 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20  Pager(pBt));.   
e9d0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
e9e0: 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  eave(pBt);.    }
e9f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
ea00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ea10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
ea20: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
ea30: 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
ea40: 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
ea50: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
ea60: 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
ea70: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
ea80: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
ea90: 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
eaa0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
eab0: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
eac0: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
ead0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
eae0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
eaf0: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20  T_COMMITHOOK;.  
eb00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
eb10: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
eb20: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
eb30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
eb40: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
eb50: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
eb60: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
eb70: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
eb80: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
eb90: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
eba0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
ebb0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
ebc0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
ebd0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
ebe0: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
ebf0: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
ec00: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
ec10: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
ec20: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
ec30: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
ec40: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
ec50: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
ec60: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
ec70: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
ec80: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
ec90: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
eca0: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
ecb0: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
ecc0: 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
ecd0: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
ece0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
ecf0: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
ed00: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
ed10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
ed20: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
ed30: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
ed40: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
ed50: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
ed60: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
ed70: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
ed80: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
ed90: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
eda0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
edb0: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
edc0: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
edd0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
ede0: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
edf0: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
ee00: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
ee10: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
ee20: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
ee30: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
ee40: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
ee50: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
ee60: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
ee70: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
ee80: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
ee90: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
eea0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
eeb0: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
eec0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
eed0: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
eee0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
eef0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
ef00: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
ef10: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
ef20: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
ef30: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
ef40: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
ef50: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
ef60: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
ef70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ef80: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ef90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
efa0: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
efb0: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
efc0: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
efd0: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
efe0: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
eff0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
f000: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
f010: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
f020: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f030: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
f040: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
f050: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
f060: 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23  omically..  */.#
f070: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f080: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
f090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
f0a0: 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
f0b0: 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  fs;.    int need
f0c0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68  Sync = 0;.    ch
f0d0: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
f0e0: 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
f0f0: 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
f100: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
f110: 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
f120: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
f130: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
f140: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
f150: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
f160: 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
f170: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
f180: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ;.    int res;. 
f190: 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e     int retryCoun
f1a0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
f1b0: 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  MainFile;..    /
f1c0: 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
f1d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
f1e0: 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e  ame */.    nMain
f1f0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74  File = sqlite3St
f200: 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65  rlen30(zMainFile
f210: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
f220: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
f230: 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58  db, "%s-mjXXXXXX
f240: 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  9XXz", zMainFile
f250: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74  );.    if( zMast
f260: 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  er==0 ) return S
f270: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
f280: 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20   do {.      u32 
f290: 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69  iRandom;.      i
f2a0: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b  f( retryCount ){
f2b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
f2c0: 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20  ryCount>100 ){. 
f2d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f2e0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
f2f0: 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73  , "MJ delete: %s
f300: 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
f310: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
f320: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
f330: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
f340: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f350: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74     }else if( ret
f360: 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20  ryCount==1 ){.  
f370: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f380: 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
f390: 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73   "MJ collide: %s
f3a0: 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
f3b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f3c0: 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b       retryCount+
f3d0: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
f3e0: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
f3f0: 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52  of(iRandom), &iR
f400: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71  andom);.      sq
f410: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
f420: 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69  3, &zMaster[nMai
f430: 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58  nFile], "-mj%06X
f440: 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20  9%02X",.        
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e         (iRandom>
f470: 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52  >8)&0xffffff, iR
f480: 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20  andom&0xff);.   
f490: 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65     /* The antipe
f4a0: 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63  nultimate charac
f4b0: 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65  ter of the maste
f4c0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
f4d0: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
f4e0: 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d  "9" to avoid nam
f4f0: 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65  e collisions whe
f500: 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65  n using 8+3 file
f510: 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  names. */.      
f520: 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b  assert( zMaster[
f530: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
f540: 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27  zMaster)-3]=='9'
f550: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
f560: 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61  3FileSuffix3(zMa
f570: 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29  inFile, zMaster)
f580: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
f590: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
f5a0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
f5b0: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
f5c0: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68  , &res);.    }wh
f5d0: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
f5e0: 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20  OK && res );.   
f5f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f600: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  OK ){.      /* O
f610: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
f620: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
f630: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
f640: 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
f650: 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
f660: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51  r, .          SQ
f670: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
f680: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
f690: 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
f6a0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
f6b0: 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
f6c0: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
f6d0: 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  AL, 0.      );. 
f6e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
f6f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f700: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f710: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
f720: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f730: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
f740: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
f750: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
f760: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
f770: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
f780: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
f790: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f7a0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
f7b0: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
f7c0: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
f7d0: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
f7e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f7f0: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
f800: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
f810: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
f820: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
f830: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f840: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
f850: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
f860: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
f870: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
f880: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
f890: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
f8a0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
f8b0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
f8c0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
f8d0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
f8e0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
f8f0: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
f900: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
f910: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
f920: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
f930: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
f940: 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29    if( zFile==0 )
f950: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
f960: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
f970: 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72   TEMP and :memor
f980: 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
f990: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f9a0: 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b    assert( zFile[
f9b0: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  0]!=0 );.       
f9c0: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
f9d0: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
f9e0: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
f9f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
fa00: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
fa10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
fa20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
fa30: 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
fa40: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
fa50: 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
fa60: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
fa70: 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
fa80: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
fa90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
faa0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
fac0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
fad0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
fae0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
faf0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
fb00: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
fb10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
fb20: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
fb30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
fb40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
fb50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
fb60: 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
fb70: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
fb80: 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
fb90: 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
fba0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
fbb0: 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
fbc0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
fbd0: 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  ( needSync .    
fbe0: 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f   && 0==(sqlite3O
fbf0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
fc00: 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26  istics(pMaster)&
fc10: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
fc20: 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26  UENTIAL).     &&
fc30: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
fc40: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
fc50: 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  pMaster, SQLITE_
fc60: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20  SYNC_NORMAL)).  
fc70: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
fc80: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
fc90: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
fca0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
fcb0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
fcc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
fcd0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
fce0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
fcf0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
fd00: 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
fd10: 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
fd20: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
fd30: 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
fd40: 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
fd50: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
fd60: 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
fd70: 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
fd80: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
fd90: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
fda0: 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
fdb0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
fdc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
fdd0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
fde0: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
fdf0: 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
fe00: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
fe10: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
fe20: 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
fe30: 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
fe40: 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
fe50: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
fe60: 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
fe70: 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
fe80: 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
fe90: 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
fea0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
feb0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
fec0: 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
fed0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
fee0: 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
fef0: 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
ff00: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
ff10: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
ff20: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
ff30: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
ff40: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
ff50: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
ff60: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
ff70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ff80: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
ff90: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
ffa0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
ffb0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ffc0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
ffd0: 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
ffe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
fff0: 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Y );.    if( rc!
10000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10010 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
10020 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
10030 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10040 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
10050 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
10060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
10070 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
10080 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
10090 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
100a0 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
100b0 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
100c0 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
100d0 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
100e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
100f0 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
10100 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
10110 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
10120 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 65  Vfs, zMaster, ne
10130 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 73 71 6c  edSync);.    sql
10140 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
10150 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
10160 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
10170 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
10180 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
10190 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
101a0 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73   and directories
101b0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
101c0 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68  en synced, so th
101d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
101e0 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
101f0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
10200 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c  aseTwo() are onl
10210 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20  y closing files 
10220 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  and.    ** delet
10230 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
10240 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73  g journals. If s
10250 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
10260 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a  ong while.    **
10270 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
10280 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c  ng we don't real
10290 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74  ly care. The int
102a0 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20  egrity of the.  
102b0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
102c0 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72   is already guar
102d0 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65  anteed, but some
102e0 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f   stray 'cold' jo
102f0 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61  urnals.    ** ma
10300 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e  y be lying aroun
10310 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  d. Returning an 
10320 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74  error code won't
10330 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20   help matters.. 
10340 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c     */.    disabl
10350 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
10360 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
10370 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
10380 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72  alloc();.    for
10390 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
103a0 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
103b0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
103c0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
103d0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
103e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
103f0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
10400 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 1);.      }.
10410 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10420 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
10430 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  ();.    enable_s
10440 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
10450 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  rs();..    sqlit
10460 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
10470 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
10480 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10490 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
104a0 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  e checks that th
104b0 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41  e sqlite3.nVdbeA
104c0 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69  ctive count vari
104d0 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
104e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
104f0 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
10500 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
10510 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
10520 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
10530 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
10540 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
10550 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
10560 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
10570 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
10580 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
10590 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
105a0 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
105b0 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
105c0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
105d0 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
105e0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
105f0 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
10600 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
10610 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
10620 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
10630 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  cnt = 0;.  int n
10640 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Write = 0;.  int
10650 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20   nRead = 0;.  p 
10660 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
10670 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
10680 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  f( sqlite3_stmt_
10690 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74  busy((sqlite3_st
106a0 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20  mt*)p) ){.      
106b0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
106c0 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
106d0 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
106e0 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64    if( p->bIsRead
106f0 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20  er ) nRead++;.  
10700 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
10710 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
10720 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64  rt( cnt==db->nVd
10730 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73  beActive );.  as
10740 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
10750 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
10760 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d    assert( nRead=
10770 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
10780 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
10790 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
107a0 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
107b0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62  /*.** If the Vdb
107c0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
107d0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f  first argument o
107e0 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e  pened a statemen
107f0 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  t-transaction,.*
10800 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20  * close it now. 
10810 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73  Argument eOp mus
10820 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45  t be either SAVE
10830 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
10840 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  r.** SAVEPOINT_R
10850 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73  ELEASE. If it is
10860 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
10870 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ACK, then the st
10880 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
10890 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
108a0 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73   back. If eOp is
108b0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
108c0 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  SE, then the .**
108d0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
108e0 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
108f0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
10900 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
10910 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
10920 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
10930 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
10940 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49  * Otherwise SQLI
10950 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
10960 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
10970 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
10980 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c   int eOp){.  sql
10990 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d  ite3 *const db =
109a0 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
109b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
109c0 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65   /* If p->iState
109d0 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  ment is greater 
109e0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
109f0 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64  this Vdbe opened
10a00 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65   a .  ** stateme
10a10 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  nt transaction t
10a20 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  hat should be cl
10a30 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f  osed here. The o
10a40 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  nly exception.  
10a50 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f  ** is that an IO
10a60 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20   error may have 
10a70 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e  occurred, causin
10a80 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
10a90 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
10aa0 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
10ab0 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
10ac0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
10ad0 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
10ae0 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
10af0 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
10b00 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
10b10 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
10b20 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
10b30 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
10b40 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
10b50 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
10b60 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
10b70 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
10b80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
10b90 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
10ba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
10bb0 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
10bc0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
10bd0 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
10be0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10bf0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
10c00 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
10c10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
10c20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
10c30 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
10c40 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
10c50 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
10c60 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10c70 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
10c80 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
10c90 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
10ca0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
10cb0 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
10cc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10cd0 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
10ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10cf0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
10d00 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
10d10 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
10d20 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
10d30 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
10d40 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
10d50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10d60 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
10d70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10d80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
10d90 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
10da0 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
10db0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  = 0;..    if( rc
10dc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10dd0 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
10de0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10df0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10e00 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
10e10 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
10e20 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
10e30 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
10e40 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
10e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10e60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10e70 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
10e80 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
10e90 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
10ea0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
10eb0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
10ec0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10ed0 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
10ee0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73  rolled back, als
10ef0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20  o restore the . 
10f00 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68     ** database h
10f10 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
10f20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
10f30 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  er to the value 
10f40 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20  it had when .   
10f50 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
10f60 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
10f70 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
10f80 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
10f90 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
10fa0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
10fb0 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
10fc0 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
10fd0 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
10fe0 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  mmCons = p->nStm
10ff0 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20  tDefImmCons;.   
11000 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
11010 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
11020 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
11030 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
11040 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62  saction opened b
11050 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  y the database .
11060 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69  ** handle associ
11070 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
11080 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
11090 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20  gument is about 
110a0 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74  to be .** commit
110b0 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72  ted. If there ar
110c0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65  e outstanding de
110d0 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
110e0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ey constraint.**
110f0 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74   violations, ret
11100 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
11110 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
11120 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
11130 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
11140 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74  anding FK violat
11150 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75  ions and this fu
11160 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
11170 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ** SQLITE_ERROR,
11180 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
11190 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c  of the VM to SQL
111a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
111b0 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64  OREIGNKEY.** and
111c0 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20   write an error 
111d0 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
111e0 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
111f0 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
11200 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11210 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
11220 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
11230 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
11240 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
11250 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
11260 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
11270 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72  d && (db->nDefer
11280 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66  redCons+db->nDef
11290 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29  erredImmCons)>0)
112a0 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72   .   || (!deferr
112b0 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73  ed && p->nFkCons
112c0 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a  traint>0) .  ){.
112d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
112e0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
112f0 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d  REIGNKEY;.    p-
11300 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
11310 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c  E_Abort;.    sql
11320 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
11330 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
11340 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
11350 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
11360 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11370 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
11380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11390 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
113a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
113b0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
113c0 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
113d0 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
113e0 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
113f0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
11400 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
11410 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
11420 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
11430 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
11440 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
11450 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
11460 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
11470 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
11480 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
11490 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
114a0 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
114b0 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
114c0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
114d0 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
114e0 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
114f0 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
11500 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
11510 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
11520 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
11530 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
11540 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
11550 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
11560 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
11570 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
11580 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
11590 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
115a0 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
115b0 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
115c0 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
115d0 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
115e0 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
115f0 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
11600 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
11610 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11630 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
11640 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
11650 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
11660 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
11670 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
11680 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
11690 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
116a0 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
116b0 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
116c0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
116d0 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
116e0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
116f0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
11700 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
11710 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
11720 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
11730 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
11740 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
11750 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
11760 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
11770 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
11780 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
11790 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
117a0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
117b0 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
117c0 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
117d0 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
117e0 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
117f0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
11800 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
11810 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
11820 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
11830 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
11840 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
11850 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
11860 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
11870 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
11880 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
11890 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
118a0 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
118b0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
118c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
118d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
118e0 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65  OnceFlag ) memse
118f0 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  t(p->aOnceFlag, 
11900 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29  0, p->nOnceFlag)
11910 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  ;.  closeAllCurs
11920 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
11930 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
11940 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
11950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11960 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
11970 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
11980 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
11990 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
119a0 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
119b0 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72  never started or
119c0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c   if the.  ** SQL
119d0 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20   statement does 
119e0 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74  not read or writ
119f0 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
11a00 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  e.  */.  if( p->
11a10 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52  pc>=0 && p->bIsR
11a20 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  eader ){.    int
11a30 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
11a40 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
11a50 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
11a60 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
11a70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
11a80 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
11a90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
11aa0 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
11ab0 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
11ac0 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
11ad0 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
11ae0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
11af0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11b00 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f  Enter(p);..    /
11b10 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
11b20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
11b30 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
11b40 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
11b50 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
11b60 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
11b70 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
11b80 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ba0 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
11bb0 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
11bc0 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
11bd0 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
11be0 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
11bf0 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
11c00 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  was read-only an
11c10 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
11c20 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   is SQLITE_INTER
11c30 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20  RUPT, .      ** 
11c40 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e  no rollback is n
11c50 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77  ecessary. Otherw
11c60 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20  ise, at least a 
11c70 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
11c80 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
11c90 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
11ca0 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ack to restore t
11cb0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61  he database to a
11cc0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69   .      ** consi
11cd0 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
11ce0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
11cf0 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65  ven if the state
11d00 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ment is read-onl
11d10 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  y, it is importa
11d20 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20  nt to perform.  
11d30 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65      ** a stateme
11d40 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
11d50 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61  n rollback opera
11d60 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72  tion. If the err
11d70 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  or .      ** occ
11d80 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  urred while writ
11d90 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
11da0 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
11db0 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
11dc0 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
11dd0 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
11de0 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
11df0 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
11e00 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
11e10 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
11e20 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
11e30 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
11e40 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
11e50 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
11e60 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
11e70 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
11e80 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
11e90 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
11ea0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
11eb0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
11ec0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
11ed0 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
11ee0 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
11ef0 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
11f00 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
11f10 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
11f20 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
11f30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11f40 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
11f50 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
11f60 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
11f70 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
11f80 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
11f90 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
11fa0 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
11fb0 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
11fc0 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
11fd0 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
11fe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
11ff0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
12000 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
12010 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
12020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
12030 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
12040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
12050 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
12060 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
12070 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
12080 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12090 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
120a0 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
120b0 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
120c0 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
120d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
120e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
120f0 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
12100 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
12110 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
12120 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
12130 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
12140 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
12150 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
12160 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
12170 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
12180 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
12190 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
121a0 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
121b0 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
121c0 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
121d0 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
121e0 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
121f0 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
12200 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
12210 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
12220 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
12230 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
12240 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
12250 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56   .     && db->nV
12260 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65  dbeWrite==(p->re
12270 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
12280 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
12290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
122a0 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
122b0 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
122c0 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
122d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
122e0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
122f0 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
12300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12310 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
12320 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
12330 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
12340 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12350 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
12360 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12370 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
12380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12390 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
123a0 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
123b0 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EY;.        }els
123c0 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e{ .          /*
123d0 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
123e0 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
123f0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
12400 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a  was successful .
12410 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
12420 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
12430 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
12440 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
12450 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
12460 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63          ** key c
12470 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f  onstraints to ho
12480 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  ld up the transa
12490 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ction. This mean
124a0 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20  s a commit .    
124b0 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
124c0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ired. */.       
124d0 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
124e0 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
124f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
12500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
12510 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20   && p->readOnly 
12520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12530 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
12540 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
12550 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
12560 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12570 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
12590 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
125a0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
125b0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
125c0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _OK);.          
125d0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
125e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
125f0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
12600 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
12610 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
12620 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
12630 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
12640 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
12650 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20  TE_DeferFKs;.   
12660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
12670 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
12680 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
12690 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
126a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
126b0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
126c0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
126d0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
126e0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
126f0 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
12700 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
12710 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
12720 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
12730 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12740 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
12750 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
12760 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
12770 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
12780 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
12790 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
127a0 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
127b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
127c0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
127d0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
127e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
127f0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
12800 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
12810 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
12820 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
12830 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
12840 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
12850 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
12860 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
12870 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
12880 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
12890 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
128a0 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
128b0 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
128c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
128d0 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
128e0 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
128f0 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
12900 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
12910 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
12920 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
12930 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
12940 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
12950 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
12960 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
12970 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
12980 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
12990 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
129a0 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
129b0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
129c0 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
129d0 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
129e0 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
129f0 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
12a00 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
12a10 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
12a20 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
12a30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12a40 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
12a50 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
12a60 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
12a70 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
12a80 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
12a90 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
12aa0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12ab0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
12ac0 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
12ad0 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
12ae0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
12af0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
12b00 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
12b10 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
12b20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
12b30 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
12b40 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
12b50 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
12b60 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
12b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12b80 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
12b90 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
12ba0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
12bb0 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
12bc0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
12bd0 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
12be0 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
12bf0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
12c00 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
12c10 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
12c20 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
12c30 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
12c40 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
12c50 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
12c60 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
12c70 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
12c80 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
12c90 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
12ca0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
12cb0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
12cc0 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
12cd0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
12ce0 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
12cf0 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
12d00 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
12d10 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
12d20 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(p);.  }..  /* 
12d30 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
12d40 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
12d50 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
12d60 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
12d70 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
12d80 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >=0 ){.    db->n
12d90 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20  VdbeActive--;.  
12da0 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
12db0 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72  ly ) db->nVdbeWr
12dc0 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ite--;.    if( p
12dd0 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62  ->bIsReader ) db
12de0 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20  ->nVdbeRead--;. 
12df0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
12e00 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e  VdbeActive>=db->
12e10 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20  nVdbeRead );.   
12e20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
12e30 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62  beRead>=db->nVdb
12e40 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73  eWrite );.    as
12e50 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57  sert( db->nVdbeW
12e60 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  rite>=0 );.  }. 
12e70 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
12e80 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
12e90 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
12ea0 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e  t(db);.  if( p->
12eb0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12ec0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
12ed0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12ee0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
12ef0 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
12f00 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20  is set to true, 
12f10 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74  then any locks t
12f20 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20  hat were held.  
12f30 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ** by connection
12f40 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65   db have now bee
12f50 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c  n released. Call
12f60 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
12f70 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20  onUnlocked() .  
12f80 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79  ** to invoke any
12f90 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b   required unlock
12fa0 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
12fb0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
12fc0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
12fd0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
12fe0 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62  ctionUnlocked(db
12ff0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
13000 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
13010 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43  e>0 || db->autoC
13020 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ommit==0 || db->
13030 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b  nStatement==0 );
13040 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63  .  return (p->rc
13050 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20  ==SQLITE_BUSY ? 
13060 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51  SQLITE_BUSY : SQ
13070 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a  LITE_OK);.}.../*
13080 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f  .** Each VDBE ho
13090 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  lds the result o
130a0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
130b0 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  t sqlite3_step()
130c0 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72   call.** in p->r
130d0 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  c.  This routine
130e0 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c   sets that resul
130f0 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45  t back to SQLITE
13100 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  _OK..*/.void sql
13110 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65  ite3VdbeResetSte
13120 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29  pResult(Vdbe *p)
13130 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
13140 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13150 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63  Copy the error c
13160 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
13170 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  ssage belonging 
13180 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73  to the VDBE pass
13190 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
131a0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69  st argument to i
131b0 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ts database hand
131c0 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79  le (so that they
131d0 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74   will be .** ret
131e0 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74  urned by calls t
131f0 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  o sqlite3_errcod
13200 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  e() and sqlite3_
13210 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a  errmsg())..**.**
13220 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
13230 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68  oes not clear th
13240 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64  e VDBE error cod
13250 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75  e or message, ju
13260 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65  st.** copies the
13270 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  m to the databas
13280 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
13290 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e   sqlite3VdbeTran
132a0 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a  sferError(Vdbe *
132b0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
132c0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
132d0 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69   rc = p->rc;.  i
132e0 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  f( p->zErrMsg ){
132f0 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61  .    u8 mallocFa
13300 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
13310 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c  cFailed;.    sql
13320 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
13330 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
13340 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64   db->pErr==0 ) d
13350 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65  b->pErr = sqlite
13360 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
13370 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
13380 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
13390 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
133a0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
133b0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
133c0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
133d0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
133e0 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
133f0 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65  ed = mallocFaile
13400 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f  d;.    db->errCo
13410 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65  de = rc;.  }else
13420 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13430 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a  or(db, rc);.  }.
13440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13450 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
13460 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a  ABLE_SQLLOG./*.*
13470 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43  * If an SQLITE_C
13480 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f  ONFIG_SQLLOG hoo
13490 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  k is registered 
134a0 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  and the VM has b
134b0 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76  een run, .** inv
134c0 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  oke it..*/.stati
134d0 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b  c void vdbeInvok
134e0 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29  eSqllog(Vdbe *v)
134f0 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  {.  if( sqlite3G
13500 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
13510 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51  log && v->rc==SQ
13520 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53  LITE_OK && v->zS
13530 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29  ql && v->pc>=0 )
13540 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70  {.    char *zExp
13550 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56  anded = sqlite3V
13560 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20  dbeExpandSql(v, 
13570 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73  v->zSql);.    as
13580 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69  sert( v->db->ini
13590 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20  t.busy==0 );.   
135a0 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29   if( zExpanded )
135b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
135c0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
135d0 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73  log(.          s
135e0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
135f0 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76  ig.pSqllogArg, v
13600 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c  ->db, zExpanded,
13610 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   1.      );.    
13620 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13630 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
13640 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
13650 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64  else.# define vd
13660 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78  beInvokeSqllog(x
13670 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
13680 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
13690 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
136a0 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
136b0 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
136c0 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
136d0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
136e0 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
136f0 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
13700 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
13710 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
13720 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
13730 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
13740 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
13750 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
13760 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
13770 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
13780 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
13790 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
137a0 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
137b0 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
137c0 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
137d0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
137e0 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
137f0 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
13800 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
13810 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
13820 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
13830 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
13840 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
13850 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
13860 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
13870 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
13880 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
13890 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
138a0 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
138b0 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
138c0 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
138d0 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
138e0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
138f0 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e   VDBE has be run
13900 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
13910 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
13920 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
13930 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
13940 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
13950 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
13960 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
13970 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
13980 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
13990 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
139a0 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
139b0 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
139c0 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
139d0 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
139e0 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
139f0 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
13a00 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
13a10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
13a20 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62  pc>=0 ){.    vdb
13a30 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29  eInvokeSqllog(p)
13a40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13a50 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70  eTransferError(p
13a60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
13a70 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
13a80 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
13a90 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66  rMsg = 0;.    if
13aa0 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65  ( p->runOnlyOnce
13ab0 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20   ) p->expired = 
13ac0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
13ad0 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72  ->rc && p->expir
13ae0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ed ){.    /* The
13af0 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61   expired flag wa
13b00 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42  s set on the VDB
13b10 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  E before the fir
13b20 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  st call.    ** t
13b30 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
13b40 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63  . For consistenc
13b50 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33  y (since sqlite3
13b60 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20  _step() was.    
13b70 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20  ** called), set 
13b80 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72  the database err
13b90 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  or in this case 
13ba0 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a  as well..    */.
13bb0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13bc0 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72  WithMsg(db, p->r
13bd0 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20  c, p->zErrMsg ? 
13be0 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72  "%s" : 0, p->zEr
13bf0 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
13c00 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
13c10 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
13c20 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
13c30 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
13c40 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
13c50 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
13c60 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
13c70 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
13c80 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
13c90 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
13ca0 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
13cb0 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
13cc0 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
13cd0 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
13ce0 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
13cf0 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
13d00 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
13d10 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
13d20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
13d30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
13d40 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
13d50 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
13d60 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
13d70 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
13d80 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
13d90 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
13da0 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
13db0 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20          char c, 
13dc0 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  pc = 0;.        
13dd0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
13de0 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   ");.        for
13df0 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53  (i=0; (c = p->zS
13e00 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  ql[i])!=0; i++){
13e10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
13e20 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c=='\n' ) fprint
13e30 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20  f(out, "-- ");. 
13e40 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c           putc(c,
13e50 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20   out);.         
13e60 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20   pc = c;.       
13e70 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
13e80 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74  c!='\n' ) fprint
13e90 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
13ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
13eb0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
13ec0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
13ed0 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20  r zHdr[100];.   
13ee0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
13ef0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64  rintf(sizeof(zHd
13f00 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25  r), zHdr, "%6u %
13f10 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20  12llu %8llu ",. 
13f20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
13f30 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
13f40 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
13f50 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
13f60 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
13f70 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
13f80 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
13f90 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
13fa0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
13fb0 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72  (out, "%s", zHdr
13fc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13fd0 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
13fe0 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
13ff0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14000 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
14010 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
14020 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65   p->iCurrentTime
14030 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63   = 0;.  p->magic
14040 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
14050 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  IT;.  return p->
14060 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
14070 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
14080 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
14090 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
140a0 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
140b0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
140c0 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
140d0 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
140e0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
140f0 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
14100 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
14110 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
14120 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
14130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14140 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
14150 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
14160 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
14170 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
14180 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14190 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
141a0 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
141b0 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
141c0 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  =rc );.  }.  sql
141d0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
141e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
141f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61  }../*.** If para
14200 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73  meter iOp is les
14210 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
14220 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  n invoke the des
14230 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61  tructor for.** a
14240 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  ll auxiliary dat
14250 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65  a pointers curre
14260 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74  ntly cached by t
14270 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a  he VM passed as.
14280 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
14290 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ument..**.** Or,
142a0 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74   if iOp is great
142b0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
142c0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
142d0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
142e0 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64  .** only invoked
142f0 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c   for those auxil
14300 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
14310 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68  rs created by th
14320 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74  e user .** funct
14330 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74  ion invoked by t
14340 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f  he OP_Function o
14350 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63  pcode at instruc
14360 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20  tion iOp of .** 
14370 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e  VM pVdbe, and on
14380 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a  ly then if:.**.*
14390 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63  *    * the assoc
143a0 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70  iated function p
143b0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
143c0 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63  32nd or later (c
143d0 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ounting.**      
143e0 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
143f0 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20  ht), or.**.**   
14400 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e   * the correspon
14410 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75  ding bit in argu
14420 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65  ment mask is cle
14430 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69  ar (where the fi
14440 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63  rst.**      func
14450 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63  tion parameter c
14460 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69  orresponds to bi
14470 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f  t 0 etc.)..*/.vo
14480 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
14490 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
144a0 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70   *pVdbe, int iOp
144b0 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41  , int mask){.  A
144c0 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70  uxData **pp = &p
144d0 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a  Vdbe->pAuxData;.
144e0 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a    while( *pp ){.
144f0 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75      AuxData *pAu
14500 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28  x = *pp;.    if(
14510 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c   (iOp<0).     ||
14520 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70   (pAux->iOp==iOp
14530 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e   && (pAux->iArg>
14540 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d  31 || !(mask & M
14550 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69  ASKBIT32(pAux->i
14560 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20  Arg)))).    ){. 
14570 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
14580 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b  Aux->iArg==31 );
14590 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
145a0 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  >xDelete ){.    
145b0 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
145c0 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  e(pAux->pAux);. 
145d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70       }.      *pp
145e0 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a   = pAux->pNext;.
145f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
14600 72 65 65 28 70 56 64 62 65 2d 3e 64 62 2c 20 70  ree(pVdbe->db, p
14610 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Aux);.    }else{
14620 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75 78  .      pp= &pAux
14630 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
14640 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
14650 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
14660 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
14670 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
14680 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14690 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f  nt,.** except fo
146a0 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c  r object itself,
146b0 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72   which is preser
146c0 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ved..**.** The d
146d0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
146e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
146f0 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  and sqlite3VdbeD
14700 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a  elete() is that.
14710 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20  ** VdbeDelete() 
14720 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65  also unlinks the
14730 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c   Vdbe from the l
14740 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63  ist of VMs assoc
14750 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
14760 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
14770 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20  ction and frees 
14780 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  the object itsel
14790 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  f..*/.void sqlit
147a0 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63  e3VdbeClearObjec
147b0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
147c0 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72  dbe *p){.  SubPr
147d0 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e  ogram *pSub, *pN
147e0 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ext;.  int i;.  
147f0 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30  assert( p->db==0
14800 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b   || p->db==db );
14810 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
14820 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
14830 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  Var);.  releaseM
14840 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
14850 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
14860 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
14870 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72   for(pSub=p->pPr
14880 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75  ogram; pSub; pSu
14890 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  b=pNext){.    pN
148a0 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78  ext = pSub->pNex
148b0 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f  t;.    vdbeFreeO
148c0 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d  pArray(db, pSub-
148d0 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29  >aOp, pSub->nOp)
148e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
148f0 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20  ree(db, pSub);. 
14900 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a   }.  for(i=p->nz
14910 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Var-1; i>=0; i--
14920 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
14930 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29  db, p->azVar[i])
14940 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72  ;.  vdbeFreeOpAr
14950 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  ray(db, p->aOp, 
14960 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74  p->nOp);.  sqlit
14970 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14980 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
14990 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
149a0 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  ->zSql);.  sqlit
149b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
149c0 70 46 72 65 65 29 3b 0a 23 69 66 64 65 66 20 53  pFree);.#ifdef S
149d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
149e0 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 66  T_SCANSTATUS.  f
149f0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63  or(i=0; i<p->nSc
14a00 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  an; i++){.    sq
14a10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14a20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d  p->aScan[i].zNam
14a30 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
14a40 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
14a50 53 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  Scan);.#endif.}.
14a60 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
14a70 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
14a80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
14a90 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
14aa0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
14ab0 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ..  if( NEVER(p=
14ac0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
14ad0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
14ae0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14af0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
14b00 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
14b10 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
14b20 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d  db, p);.  if( p-
14b30 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
14b40 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
14b50 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
14b60 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
14b70 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
14b80 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
14b90 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
14ba0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
14bb0 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
14bc0 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
14bd0 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
14be0 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
14bf0 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20  .  p->db = 0;.  
14c00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14c10 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , p);.}../*.** T
14c20 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68 61  he cursor "p" ha
14c30 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b  s a pending seek
14c40 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20   operation that 
14c50 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
14c60 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e  .** carried out.
14c70 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f    Seek the curso
14c80 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72  r now.  If an er
14c90 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
14ca0 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  rn.** the approp
14cb0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
14cc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14cd0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
14ce0 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
14cf0 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
14d00 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20  *p){.  int res, 
14d10 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
14d20 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20  E_TEST.  extern 
14d30 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
14d40 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
14d50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65  .  assert( p->de
14d60 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a  ferredMoveto );.
14d70 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
14d80 61 62 6c 65 20 29 3b 0a 20 20 72 63 20 3d 20 73  able );.  rc = s
14d90 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
14da0 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75  oUnpacked(p->pCu
14db0 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
14dc0 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
14dd0 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
14de0 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
14df0 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
14e00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
14e10 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  KPT;.#ifdef SQLI
14e20 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
14e30 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
14e40 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65  ;.#endif.  p->de
14e50 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
14e60 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
14e70 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
14e80 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14e90 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
14ea0 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76  omething has mov
14eb0 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75  ed cursor "p" ou
14ec0 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79  t of place.  May
14ed0 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77 61  be the row it wa
14ee0 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20  s.** pointed to 
14ef0 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
14f00 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20  from under it.  
14f10 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74 72  Or maybe the btr
14f20 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61  ee was.** rebala
14f30 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72 20  nced.  Whatever 
14f40 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20 74  the cause, try t
14f50 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f  o restore "p" to
14f60 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a   the place it.**
14f70 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
14f80 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66  be pointing.  If
14f90 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c   the row was del
14fa0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
14fb0 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  der the.** curso
14fc0 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  r, set the curso
14fd0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  r to point to a 
14fe0 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  NULL row..*/.sta
14ff0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
15000 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f  OINLINE handleMo
15010 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43 75  vedCursor(VdbeCu
15020 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
15030 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20  isDifferentRow, 
15040 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rc;.  assert( p-
15050 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
15060 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15070 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
15080 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20  ved(p->pCursor) 
15090 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
150a0 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
150b0 6f 72 65 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ore(p->pCursor, 
150c0 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 29  &isDifferentRow)
150d0 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
150e0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
150f0 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65 72  ;.  if( isDiffer
15100 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c  entRow ) p->null
15110 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Row = 1;.  retur
15120 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
15130 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74  heck to ensure t
15140 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
15150 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f 72  s valid.  Restor
15160 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  e the cursor.** 
15170 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65 74  if need be.  Ret
15180 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f  urn any I/O erro
15190 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74 6f  r from the resto
151a0 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  re operation..*/
151b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
151c0 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56 64  CursorRestore(Vd
151d0 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
151e0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
151f0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
15200 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  ->pCursor) ){.  
15210 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
15220 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
15230 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
15240 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15250 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
15260 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20  rsor p is ready 
15270 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
15280 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63   the row to whic
15290 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  h it.** was last
152a0 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65   positioned.  Re
152b0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
152c0 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75  de if an OOM fau
152d0 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a  lt or I/O error.
152e0 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  ** prevents us f
152f0 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20  rom positioning 
15300 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
15310 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69  s correct positi
15320 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d  on..**.** If a M
15330 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
15340 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
15350 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
15360 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
15370 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20  MoveTo now.  If 
15380 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69  no move is pendi
15390 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ng, check to see
153a0 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20   if the row has 
153b0 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20  been.** deleted 
153c0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
153d0 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66  he cursor and if
153e0 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68   it has, mark th
153f0 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55  e row as.** a NU
15400 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66  LL row..**.** If
15410 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
15420 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
15430 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
15440 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20  ow and that row 
15450 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  has.** not been 
15460 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
15470 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
15480 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
15490 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
154a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
154b0 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
154c0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
154d0 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
154e0 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 72  dMoveto ){.    r
154f0 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65  eturn handleDefe
15500 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20  rredMoveto(p);. 
15510 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 43 75 72   }.  if( p->pCur
15520 73 6f 72 20 26 26 20 73 71 6c 69 74 65 33 42 74  sor && sqlite3Bt
15530 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
15540 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b  d(p->pCursor) ){
15550 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
15560 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
15570 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
15580 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15590 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
155a0 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
155b0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
155c0 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c  ialType().** sql
155d0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
155e0 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  peLen().** sqlit
155f0 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
15600 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
15610 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73  SerialPut().** s
15620 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15630 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61  Get().**.** enca
15640 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65  psulate the code
15650 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   that serializes
15660 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72   values for stor
15670 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a  age in SQLite.**
15680 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20   data and index 
15690 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65  records. Each se
156a0 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63  rialized value c
156b0 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
156c0 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e  'serial-type' an
156d0 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  d a blob of data
156e0 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  . The serial typ
156f0 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75  e is an 8-byte u
15700 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67  nsigned.** integ
15710 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
15720 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  varint..**.** In
15730 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78   an SQLite index
15740 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72   record, the ser
15750 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72  ial type is stor
15760 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f  ed directly befo
15770 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f  re.** the blob o
15780 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63  f data that it c
15790 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49  orresponds to. I
157a0 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64  n a table record
157b0 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20  , all serial.** 
157c0 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64  types are stored
157d0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
157e0 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64   the record, and
157f0 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61   the blobs of da
15800 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64  ta at.** the end
15810 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75  . Hence these fu
15820 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68  nctions allow th
15830 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64  e caller to hand
15840 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c  le the.** serial
15850 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62  -type and data b
15860 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  lob separately..
15870 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
15880 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
15890 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20  bes the various 
158a0 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20  storage classes 
158b0 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20  for data:.**.** 
158c0 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20    serial type   
158d0 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61       bytes of da
158e0 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20  ta      type.** 
158f0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
15900 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
15910 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
15920 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20  -------.**      
15930 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
15940 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15950 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20     NULL.**      
15960 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
15970 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
15980 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
15990 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20  r.**      2     
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  2            sig
159c0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
159d0 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
159e0 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20            3     
159f0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
15a00 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20  teger.**      4 
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
15a30 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
15a40 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20                6 
15a60 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
15a70 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
15a80 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20    6             
15a90 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
15aa0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
15ab0 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20  ger.**      7   
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ad0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49    8            I
15ae0 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20  EEE float.**    
15af0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20    8             
15b00 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
15b10 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
15b20 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20  stant 0.**      
15b30 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9               
15b40 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15b50 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
15b60 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c  ant 1.**     10,
15b70 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
15b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b90 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78   reserved for ex
15ba0 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e  pansion.**    N>
15bb0 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20  =12 and even    
15bc0 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20     (N-12)/2     
15bd0 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e     BLOB.**    N>
15be0 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20  =13 and odd     
15bf0 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20     (N-13)/2     
15c00 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68     text.**.** Th
15c10 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20  e 8 and 9 types 
15c20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e  were added in 3.
15c30 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74  3.0, file format
15c40 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69   4.  Prior versi
15c50 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
15c60 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73   will not unders
15c70 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61  tand those seria
15c80 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  l types..*/../*.
15c90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
15ca0 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
15cb0 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
15cc0 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73  n pMem..*/.u32 s
15cd0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15ce0 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
15cf0 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
15d00 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
15d10 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75  pMem->flags;.  u
15d20 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61  32 n;..  if( fla
15d30 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
15d40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
15d50 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
15d60 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46  _Int ){.    /* F
15d70 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65  igure out whethe
15d80 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34  r to use 1, 2, 4
15d90 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20  , 6 or 8 bytes. 
15da0 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
15db0 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29  X_6BYTE ((((i64)
15dc0 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29  0x00008000)<<32)
15dd0 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20  -1).    i64 i = 
15de0 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75  pMem->u.i;.    u
15df0 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c  64 u;.    if( i<
15e00 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e  0 ){.      u = ~
15e10 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
15e20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d      u = i;.    }
15e30 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
15e40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15e50 28 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c  ((i&1)==i && fil
15e60 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38  e_format>=4) ? 8
15e70 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20  +(u32)u : 1;.   
15e80 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32   }.    if( u<=32
15e90 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
15ea0 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
15eb0 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
15ec0 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
15ed0 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
15ee0 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
15ef0 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
15f00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
15f10 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
15f20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
15f30 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
15f40 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
15f50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
15f60 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
15f70 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
15f80 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e  assert( pMem->n>
15f90 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32  =0 );.  n = (u32
15fa0 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20  )pMem->n;.  if( 
15fb0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
15fc0 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
15fd0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
15fe0 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
15ff0 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
16000 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
16010 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16020 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
16030 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
16040 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
16050 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
16060 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
16070 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
16080 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
16090 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
160a0 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
160b0 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
160c0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
160d0 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
160e0 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
160f0 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
16100 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
16110 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
16120 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
16130 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
16140 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
16150 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
16160 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
16170 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
16180 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
16190 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
161a0 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
161b0 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
161c0 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
161d0 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
161e0 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
161f0 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
16200 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
16210 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
16220 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
16230 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
16240 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
16250 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
16260 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
16270 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
16280 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
16290 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
162a0 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
162b0 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
162c0 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
162d0 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
162e0 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
162f0 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
16300 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
16310 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
16320 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
16330 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
16340 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
16350 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
16360 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
16370 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
16380 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
16390 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
163a0 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
163b0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
163c0 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
163d0 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
163e0 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
163f0 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
16400 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
16410 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
16420 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
16430 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
16440 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
16450 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
16460 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
16470 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
16480 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
16490 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
164a0 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
164b0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
164c0 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
164d0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
164e0 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
164f0 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
16500 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
16510 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
16520 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
16530 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
16540 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
16550 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
16560 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
16570 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
16580 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
16590 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
165a0 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
165b0 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
165c0 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
165d0 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
165e0 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
165f0 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
16600 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
16610 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
16620 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
16630 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
16640 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
16650 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
16660 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
16670 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
16680 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
16690 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
166a0 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
166b0 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
166c0 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
166d0 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
166e0 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
166f0 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
16700 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
16710 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
16720 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
16730 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
16740 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
16750 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
16760 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
16770 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
16780 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
16790 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
167a0 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
167b0 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
167c0 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
167d0 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
167e0 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
167f0 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
16800 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
16810 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
16820 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
16830 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
16840 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
16850 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
16860 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
16870 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
16880 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
16890 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
168a0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
168b0 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
168c0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
168d0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
168e0 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
168f0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
16900 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
16910 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
16920 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
16930 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
16940 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
16950 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
16960 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
16970 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
16980 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
16990 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
169a0 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
169b0 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
169c0 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
169d0 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65  uf[].  The calle
169e0 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
169f0 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  .** for allocati
16a00 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ng enough space 
16a10 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64  to buf[] to hold
16a20 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
16a30 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  d, exclusive.** 
16a40 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e  of the pMem->u.n
16a50 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61  Zero bytes for a
16a60 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e   MEM_Zero value.
16a70 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
16a80 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16a90 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
16aa0 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
16ab0 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
16ac0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
16ad0 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
16ae0 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
16af0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
16b00 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
16b10 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
16b20 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
16b30 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
16b40 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
16b50 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32  , Mem *pMem, u32
16b60 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
16b70 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
16b80 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
16b90 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
16ba0 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
16bb0 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
16bc0 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
16bd0 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
16be0 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
16bf0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
16c00 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
16c10 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20  m->u.r) );.     
16c20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
16c30 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76  m->u.r, sizeof(v
16c40 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
16c50 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
16c60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16c70 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
16c80 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
16c90 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
16ca0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
16cb0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
16cc0 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
16cd0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62  .    do{.      b
16ce0 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76  uf[--i] = (u8)(v
16cf0 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
16d00 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c  >>= 8;.    }whil
16d10 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75  e( i );.    retu
16d20 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
16d30 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
16d40 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
16d50 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
16d60 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
16d70 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   + ((pMem->flags
16d80 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65   & MEM_Zero)?pMe
16d90 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20  m->u.nZero:0).  
16da0 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69             == (i
16db0 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt)sqlite3VdbeSe
16dc0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
16dd0 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
16de0 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
16df0 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
16e00 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
16e10 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
16e20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
16e30 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
16e40 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
16e50 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20  }../* Input "x" 
16e60 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  is a sequence of
16e70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63   unsigned charac
16e80 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65 73  ters that repres
16e90 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64  ent a.** big-end
16ea0 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65  ian integer.  Re
16eb0 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c  turn the equival
16ec0 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67  ent native integ
16ed0 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e  er.*/.#define ON
16ee0 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  E_BYTE_INT(x)   
16ef0 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64   ((i8)(x)[0]).#d
16f00 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49  efine TWO_BYTE_I
16f10 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28 69  NT(x)    (256*(i
16f20 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31  8)((x)[0])|(x)[1
16f30 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45  ]).#define THREE
16f40 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36  _BYTE_INT(x)  (6
16f50 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  5536*(i8)((x)[0]
16f60 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78  )|((x)[1]<<8)|(x
16f70 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[2]).#define FO
16f80 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20  UR_BYTE_UINT(x) 
16f90 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c   (((u32)(x)[0]<<
16fa0 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29  24)|((x)[1]<<16)
16fb0 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29  |((x)[2]<<8)|(x)
16fc0 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55  [3]).#define FOU
16fd0 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31  R_BYTE_INT(x) (1
16fe0 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78 29  6777216*(i8)((x)
16ff0 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  [0])|((x)[1]<<16
17000 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
17010 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  )[3])../*.** Des
17020 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
17030 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
17040 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
17050 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
17060 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
17070 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
17080 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
17090 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
170a0 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
170b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  s function is im
170c0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f  plemented as two
170d0 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e   separate routin
170e0 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e  es for performan
170f0 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63  ce..** The few c
17100 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69 72  ases that requir
17110 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  e local variable
17120 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74  s are broken out
17130 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65   into a separate
17140 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  .** routine so t
17150 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65  hat in most case
17160 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  s the overhead o
17170 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61  f moving the sta
17180 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73  ck pointer.** is
17190 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74   avoided..*/ .st
171a0 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f  atic u32 SQLITE_
171b0 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47  NOINLINE serialG
171c0 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
171d0 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
171e0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
171f0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
17200 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
17210 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
17220 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
17230 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
17240 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
17250 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
17260 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
17270 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
17280 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
17290 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
172a0 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20  TE_UINT(buf);.  
172b0 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54  u32 y = FOUR_BYT
172c0 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20  E_UINT(buf+4);. 
172d0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79   x = (x<<32) + y
172e0 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
172f0 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a  ype==6 ){.    /*
17300 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17310 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75  29851-52272 Valu
17320 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
17330 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20  n 64-bit.    ** 
17340 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
17350 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
17360 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
17370 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d  4*)&x;.    pMem-
17380 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
17390 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
173a0 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
173b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
173c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37  VIDENCE-OF: R-57
173d0 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20  343-49114 Value 
173e0 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
173f0 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36 34  IEEE 754-2008 64
17400 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61  -bit.    ** floa
17410 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65  ting point numbe
17420 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  r. */.#if !defin
17430 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
17440 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17450 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
17460 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  T).    /* Verify
17470 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
17480 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
17490 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
174a0 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74   same.    ** byt
174b0 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
174c0 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
174d0 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
174e0 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20  FLOAT is.    ** 
174f0 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d  defined that 64-
17500 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
17510 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79  nt values really
17520 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a   are mixed.    *
17530 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f  * endian..    */
17540 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
17550 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
17560 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
17570 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
17580 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
17590 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d  .0;.    u64 t2 =
175a0 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78   t1;.    swapMix
175b0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
175c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
175d0 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
175e0 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
175f0 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
17600 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
17610 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  if.    assert( s
17620 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
17630 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29  izeof(pMem->u.r)
17640 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d  ==8 );.    swapM
17650 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
17660 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
17670 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73  pMem->u.r, &x, s
17680 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70  izeof(x));.    p
17690 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c  Mem->flags = sql
176a0 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e  ite3IsNaN(pMem->
176b0 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20  u.r) ? MEM_Null 
176c0 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a  : MEM_Real;.  }.
176d0 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33    return 8;.}.u3
176e0 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
176f0 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
17700 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
17710 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
17720 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
17730 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
17740 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
17750 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
17760 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
17770 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
17780 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
17790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
177a0 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
177b0 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
177c0 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  ){.  switch( ser
177d0 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
177e0 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
177f0 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
17800 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
17810 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
17820 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
17830 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
17840 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a  : {  /* Null */.
17850 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
17860 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39  E-OF: R-24078-09
17870 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e  375 Value is a N
17880 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ULL. */.      pM
17890 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
178a0 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
178b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
178c0 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  e 1: {.      /* 
178d0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
178e0 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65  4885-25196 Value
178f0 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f   is an 8-bit two
17900 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20  s-complement.   
17910 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a     ** integer. *
17920 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
17930 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  i = ONE_BYTE_INT
17940 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
17950 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
17960 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
17970 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
17980 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17990 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
179a0 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
179b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
179c0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
179d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34  ENCE-OF: R-49794
179e0 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73 20  -35026 Value is 
179f0 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d  a big-endian 16-
17a00 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
17a10 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
17a20 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
17a30 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42  Mem->u.i = TWO_B
17a40 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
17a50 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
17a60 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
17a70 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
17a80 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
17a90 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
17aa0 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
17ab0 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
17ac0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
17ad0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
17ae0 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56 61  R-37839-54301 Va
17af0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
17b00 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20  ian 24-bit.     
17b10 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
17b20 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
17b30 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
17b40 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  = THREE_BYTE_INT
17b50 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
17b60 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
17b70 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
17b80 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
17b90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17ba0 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
17bb0 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
17bc0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
17bd0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
17be0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39  ENCE-OF: R-01849
17bf0 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73 20  -26079 Value is 
17c00 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d  a big-endian 32-
17c10 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
17c20 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
17c30 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
17c40 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f  Mem->u.i = FOUR_
17c50 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
17c60 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
17c70 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
17c80 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
17c90 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
17ca0 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
17cb0 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
17cc0 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
17cd0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
17ce0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
17cf0 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56   R-50385-09674 V
17d00 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
17d10 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20  dian 48-bit.    
17d20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
17d30 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
17d40 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
17d50 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
17d60 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36  T(buf+2) + (((i6
17d70 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
17d80 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
17d90 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
17da0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
17db0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
17dc0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
17dd0 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
17de0 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
17df0 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
17e00 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
17e10 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
17e20 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
17e30 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20  .      /* These 
17e40 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  use local variab
17e50 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20  les, so do them 
17e60 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f  in a separate ro
17e70 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74  utine.      ** t
17e80 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74  o avoid having t
17e90 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65  o move the frame
17ea0 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
17eb0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
17ec0 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69       return seri
17ed0 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c  alGet(buf,serial
17ee0 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20  _type,pMem);.   
17ef0 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20   }.    case 8:  
17f00 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a    /* Integer 0 *
17f10 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20  /.    case 9: { 
17f20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f   /* Integer 1 */
17f30 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
17f40 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32  CE-OF: R-12976-2
17f50 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74 68  2893 Value is th
17f60 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a  e integer 0. */.
17f70 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
17f80 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32  E-OF: R-18143-12
17f90 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68 65  121 Value is the
17fa0 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20   integer 1. */. 
17fb0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
17fc0 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
17fd0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
17fe0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
17ff0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
18000 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
18010 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
18020 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d  NCE-OF: R-14606-
18030 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20 61  31564 Value is a
18040 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e   BLOB that is (N
18050 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a  -12)/2 bytes in.
18060 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e        ** length.
18070 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
18080 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30  CE-OF: R-28401-0
18090 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61 20  0140 Value is a 
180a0 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65  string in the te
180b0 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a  xt encoding and.
180c0 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f        ** (N-13)/
180d0 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  2 bytes in lengt
180e0 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  h. */.      stat
180f0 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c  ic const u16 aFl
18100 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f  ag[] = { MEM_Blo
18110 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d  b|MEM_Ephem, MEM
18120 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d  _Str|MEM_Ephem }
18130 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
18140 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20  = (char *)buf;. 
18150 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28       pMem->n = (
18160 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
18170 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  2;.      pMem->f
18180 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72  lags = aFlag[ser
18190 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20  ial_type&1];.   
181a0 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e     return pMem->
181b0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
181c0 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a  eturn 0;.}./*.**
181d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
181e0 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
181f0 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
18200 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b  ce for an Unpack
18210 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75  edRecord.** stru
18220 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75  cture large enou
18230 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  gh to be used wi
18240 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  th sqlite3VdbeRe
18250 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a  cordUnpack() if.
18260 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
18270 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
18280 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74  er to KeyInfo st
18290 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f  ructure pKeyInfo
182a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63  ..**.** The spac
182b0 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f  e is either allo
182c0 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  cated using sqli
182d0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29  te3DbMallocRaw()
182e0 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a   or from within.
182f0 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64  ** the unaligned
18300 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76   buffer passed v
18310 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e  ia the second an
18320 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  d third argument
18330 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a  s (presumably.**
18340 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49   stack space). I
18350 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68  f the former, th
18360 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65  en *ppFree is se
18370 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  t to a pointer t
18380 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
18390 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
183a0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
183b0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
183c0 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68  ree(). Or, if th
183d0 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  e .** allocation
183e0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   comes from the 
183f0 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62  pSpace/szSpace b
18400 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69  uffer, *ppFree i
18410 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
18420 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
18430 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  g..**.** If an O
18440 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
18450 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
18460 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65  d..*/.UnpackedRe
18470 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62  cord *sqlite3Vdb
18480 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
18490 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20  cord(.  KeyInfo 
184a0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
184b0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72          /* Descr
184c0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65  iption of the re
184d0 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cord */.  char *
184e0 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  pSpace,         
184f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61            /* Una
18500 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61  ligned space ava
18510 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  ilable */.  int 
18520 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  szSpace,        
18530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18540 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20  ize of pSpace[] 
18550 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
18560 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20  ar **ppFree     
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18580 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f   OUT: Caller sho
18590 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70 6f  uld free this po
185a0 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e  inter */.){.  Un
185b0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b  packedRecord *p;
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
185d0 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   Unpacked record
185e0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
185f0 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20  int nOff;       
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70  /* Increment pSp
18620 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61  ace by nOff to a
18630 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74  lign it */.  int
18640 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
18650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18660 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
18670 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20  required for *p 
18680 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74  */..  /* We want
18690 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f   to shift the po
186a0 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20  inter pSpace up 
186b0 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20  such that it is 
186c0 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a  8-byte aligned..
186d0 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65    ** Thus, we ne
186e0 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  ed to calculate 
186f0 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62  a value, nOff, b
18700 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20  etween 0 and 7, 
18710 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69  to shift .  ** i
18720 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65  t by.  If pSpace
18730 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79   is already 8-by
18740 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66  te aligned, nOff
18750 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e   should be zero.
18760 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28  .  */.  nOff = (
18770 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f  8 - (SQLITE_PTR_
18780 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26  TO_INT(pSpace) &
18790 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74   7)) & 7;.  nByt
187a0 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
187b0 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
187c0 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29  )) + sizeof(Mem)
187d0 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  *(pKeyInfo->nFie
187e0 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79  ld+1);.  if( nBy
187f0 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20  te>szSpace+nOff 
18800 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61  ){.    p = (Unpa
18810 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c  ckedRecord *)sql
18820 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
18830 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42  pKeyInfo->db, nB
18840 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65  yte);.    *ppFre
18850 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20  e = (char *)p;. 
18860 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75     if( !p ) retu
18870 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
18880 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
18890 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b  Record*)&pSpace[
188a0 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72  nOff];.    *ppFr
188b0 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  ee = 0;.  }..  p
188c0 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  ->aMem = (Mem*)&
188d0 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
188e0 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
188f0 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
18900 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
18910 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
18920 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
18930 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
18940 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
18950 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
18960 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
18970 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b  .** Given the nK
18980 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67  ey-byte encoding
18990 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20   of a record in 
189a0 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65  pKey[], populate
189b0 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65   the .** Unpacke
189c0 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
189d0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
189e0 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
189f0 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63  nt with the.** c
18a00 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
18a10 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a  ecoded record..*
18a20 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  / .void sqlite3V
18a30 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
18a40 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
18a50 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
18a60 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
18a70 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
18a80 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18aa0 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
18ab0 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
18ac0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
18ad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
18ae0 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
18af0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
18b00 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  p      /* Popula
18b10 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72  te this structur
18b20 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
18b30 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ng. */.){.  cons
18b40 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
18b50 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
18b60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
18b70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20  Key;.  int d; . 
18b80 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20   u32 idx;       
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ba0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b   /* Offset in aK
18bb0 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f  ey[] to read fro
18bc0 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20  m */.  u16 u;   
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
18bf0 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
18c00 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  */.  u32 szHdr;.
18c10 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
18c20 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66  >aMem;..  p->def
18c30 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61  ault_rc = 0;.  a
18c40 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
18c50 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
18c60 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  ) );.  idx = get
18c70 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
18c80 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
18c90 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
18ca0 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
18cb0 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
18cc0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
18cd0 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
18ce0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
18cf0 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
18d00 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
18d10 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
18d20 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
18d30 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
18d40 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c  .    /* pMem->fl
18d50 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69  ags = 0; // sqli
18d60 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
18d70 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73  () will set this
18d80 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70   for us */.    p
18d90 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  Mem->szMalloc = 
18da0 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69  0;.    d += sqli
18db0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
18dc0 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61  (&aKey[d], seria
18dd0 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20  l_type, pMem);. 
18de0 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69     pMem++;.    i
18df0 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69  f( (++u)>=p->nFi
18e00 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  eld ) break;.  }
18e10 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b  .  assert( u<=pK
18e20 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
18e30 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c   1 );.  p->nFiel
18e40 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51  d = u;.}..#if SQ
18e50 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
18e60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
18e70 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65  ompares two inde
18e80 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72  x or table recor
18e90 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61  d keys in the sa
18ea0 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65  me way.** as the
18eb0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
18ec0 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74  rdCompare() rout
18ed0 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65  ine. Unlike Vdbe
18ee0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c  RecordCompare(),
18ef0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
18f00 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61  n deserializes a
18f10 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75  nd compares valu
18f20 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  es using the.** 
18f30 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18f40 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  lGet() and sqlit
18f50 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66  e3MemCompare() f
18f60 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20  unctions. It is 
18f70 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72  used.** in asser
18f80 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
18f90 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
18fa0 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65  e optimized code
18fb0 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64   in.** sqlite3Vd
18fc0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
18fd0 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74  ) returns result
18fe0 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f  s with these two
18ff0 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a   primitives..**.
19000 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
19010 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  f the result of 
19020 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71  comparison is eq
19030 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69  uivalent to desi
19040 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65  redResult..** Re
19050 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68  turn false if th
19060 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65  ere is a disagre
19070 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
19080 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
19090 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69  ompareDebug(.  i
190a0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
190b0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
190c0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f  Left key */.  co
190d0 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  nst UnpackedReco
190e0 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52  rd *pPKey2, /* R
190f0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
19100 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20  t desiredResult 
19110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
19120 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f  orrect answer */
19130 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
19140 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
19150 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
19160 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
19170 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
19180 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  1;          /* O
19190 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
191a0 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
191b0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
191c0 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
191d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
191e0 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  tes in header */
191f0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
19200 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
19210 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
19220 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
19230 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
19240 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e  *)pKey1;.  KeyIn
19250 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
19260 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65  Mem mem1;..  pKe
19270 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
19280 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pKeyInfo;.  if( 
19290 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20  pKeyInfo->db==0 
192a0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
192b0 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
192c0 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
192d0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
192e0 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67  ;.  /* mem1.flag
192f0 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20  s = 0;  // Will 
19300 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  be initialized b
19310 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  y sqlite3VdbeSer
19320 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56  ialGet() */.  VV
19330 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d  A_ONLY( mem1.szM
19340 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
19350 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
19360 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
19370 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ts */..  /* Comp
19380 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61  ilers may compla
19390 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69  in that mem1.u.i
193a0 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20   is potentially 
193b0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
193c0 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69   ** We could ini
193d0 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73  tialize it, as s
193e0 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69  hown here, to si
193f0 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70  lence those comp
19400 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74  laints..  ** But
19410 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75   in fact, mem1.u
19420 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63  .i will never ac
19430 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75  tually be used u
19440 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e  ninitialized, an
19450 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68  d doing .  ** th
19460 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e  e unnecessary in
19470 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73  itialization has
19480 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65   a measurable ne
19490 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e  gative performan
194a0 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20  ce.  ** impact, 
194b0 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69  since this routi
194c0 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67  ne is a very hig
194d0 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73  h runner.  And s
194e0 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a  o, we choose.  *
194f0 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  * to ignore the 
19500 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
19510 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73  s and leave this
19520 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74   variable uninit
19530 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
19540 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30  /*  mem1.u.i = 0
19550 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64  ;  // not needed
19560 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63  , here to silenc
19570 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
19580 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20  ng */.  .  idx1 
19590 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
195a0 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
195b0 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61  d1 = szHdr1;.  a
195c0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
195d0 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f  >nField+pKeyInfo
195e0 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
195f0 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52  2->nField || COR
19600 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
19610 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
19620 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
19630 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
19640 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
19650 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
19660 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
19670 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
19680 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
19690 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
196a0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
196b0 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
196c0 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
196d0 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
196e0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
196f0 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
19700 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20  al_type1 );..   
19710 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
19720 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
19730 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e  key space remain
19740 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20  ing to avoid.   
19750 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65   ** a buffer ove
19760 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b  rread.  The "d1+
19770 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20  serial_type1+2" 
19780 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69  subexpression wi
19790 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  ll.    ** always
197a0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
197b0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
197c0 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69   amount of requi
197d0 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20  red key space.. 
197e0 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61     ** Use that a
197f0 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20  pproximation to 
19800 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65  avoid the more e
19810 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f  xpensive call to
19820 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  .    ** sqlite3V
19830 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
19840 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  () in the common
19850 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
19860 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f    if( d1+serial_
19870 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65  type1+2>(u32)nKe
19880 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71  y1.     && d1+sq
19890 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
198a0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
198b0 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20  pe1)>(u32)nKey1 
198c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
198d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
198e0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
198f0 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
19900 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
19910 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
19920 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
19930 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
19940 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20  ype1, &mem1);.. 
19950 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
19960 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
19970 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19980 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
19990 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69   &pPKey2->aMem[i
199a0 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ], pKeyInfo->aCo
199b0 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ll[i]);.    if( 
199c0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  rc!=0 ){.      a
199d0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
199e0 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
199f0 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
19a00 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b   */.      if( pK
19a10 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
19a20 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
19a30 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49   rc = -rc;  /* I
19a40 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
19a50 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f   for DESC sort o
19a60 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  rder. */.      }
19a70 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75  .      goto debu
19a80 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20  gCompareEnd;.   
19a90 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77   }.    i++;.  }w
19aa0 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
19ab0 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
19ac0 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e  Field );..  /* N
19ad0 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
19ae0 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
19af0 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
19b00 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
19b10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
19b20 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
19b30 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
19b40 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
19b50 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
19b60 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
19b70 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
19b80 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
19b90 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
19ba0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
19bb0 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
19bc0 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
19bd0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
19be0 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
19bf0 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
19c00 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
19c10 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
19c20 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
19c30 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
19c40 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
19c50 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  rc = pPKey2->def
19c60 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43  ault_rc;..debugC
19c70 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28  ompareEnd:.  if(
19c80 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d   desiredResult==
19c90 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74  0 && rc==0 ) ret
19ca0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
19cb0 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20  iredResult<0 && 
19cc0 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc<0 ) return 1;
19cd0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
19ce0 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29  sult>0 && rc>0 )
19cf0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
19d00 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
19d10 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b  turn 1;.  if( pK
19d20 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
19d30 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
19d40 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
19d50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  .}.#endif..#if S
19d60 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
19d70 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
19d80 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e  er of fields (a.
19d90 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e  k.a. columns) in
19da0 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65   the record give
19db0 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65  n by.** pKey,nKe
19dc0 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74  y.  The verify t
19dd0 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69  hat this count i
19de0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
19df0 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c  qual to the.** l
19e00 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b  imit given by pK
19e10 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
19e20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65   pKeyInfo->nXFie
19e30 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ld..**.** If thi
19e40 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  s constraint is 
19e50 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69  not satisfied, i
19e60 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
19e70 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
19e80 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
19e90 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65  Int() and vdbeRe
19ea0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
19eb0 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  g() routines wil
19ec0 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  l.** not work co
19ed0 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69  rrectly.  If thi
19ee0 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20  s assert() ever 
19ef0 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62  fires, it probab
19f00 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ly means.** that
19f10 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69   the KeyInfo.nFi
19f20 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e  eld or KeyInfo.n
19f30 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65  XField values we
19f40 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69  re computed.** i
19f50 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73  ncorrectly..*/.s
19f60 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41  tatic void vdbeA
19f70 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
19f80 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69  ithinLimits(.  i
19f90 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76  nt nKey, const v
19fa0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
19fb0 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65  The record to ve
19fc0 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74  rify */ .  const
19fd0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
19fe0 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  fo       /* Comp
19ff0 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68  are size with th
1a000 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b  is KeyInfo */.){
1a010 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20  .  int nField = 
1a020 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  0;.  u32 szHdr;.
1a030 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32    u32 idx;.  u32
1a040 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73   notUsed;.  cons
1a050 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1a060 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
1a070 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b  nsigned char*)pK
1a080 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55  ey;..  if( CORRU
1a090 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  PT_DB ) return;.
1a0a0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1a0b0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1a0c0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
1a0d0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1a0e0 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65   szHdr<=(u32)nKe
1a0f0 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  y );.  while( id
1a100 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69  x<szHdr ){.    i
1a110 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1a120 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55  2(aKey+idx, notU
1a130 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64  sed);.    nField
1a140 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
1a150 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79  ( nField <= pKey
1a160 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1a170 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29  yInfo->nXField )
1a180 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1a190 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65  ne vdbeAssertFie
1a1a0 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1a1b0 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69  its(A,B,C).#endi
1a1c0 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70  f../*.** Both *p
1a1d0 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20  Mem1 and *pMem2 
1a1e0 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76  contain string v
1a1f0 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74  alues. Compare t
1a200 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  he two values.**
1a210 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1a220 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
1a230 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72  oll. As usual, r
1a240 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
1a250 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f   , zero.** or po
1a260 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
1a270 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74  *pMem1 is less t
1a280 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1a290 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a   greater than .*
1a2a0 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63  * *pMem2, respec
1a2b0 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20  tively. Similar 
1a2c0 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63  in spirit to "rc
1a2d0 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a   = (*pMem1) - (*
1a2e0 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61  pMem2);"..*/.sta
1a2f0 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70  tic int vdbeComp
1a300 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
1a310 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1a320 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  ,.  const Mem *p
1a330 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f  Mem2,.  const Co
1a340 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20  llSeq *pColl,.  
1a350 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20  u8 *prcErr      
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  /* If an OOM occ
1a380 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49  urs, set to SQLI
1a390 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20  TE_NOMEM */.){. 
1a3a0 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d   if( pMem1->enc=
1a3b0 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
1a3c0 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67     /* The string
1a3d0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
1a3e0 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63   the correct enc
1a3f0 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65  oding.  Call the
1a400 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69  .     ** compari
1a410 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72  son function dir
1a420 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74  ectly */.    ret
1a430 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  urn pColl->xCmp(
1a440 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65  pColl->pUser,pMe
1a450 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70  m1->n,pMem1->z,p
1a460 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a  Mem2->n,pMem2->z
1a470 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1a480 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73  int rc;.    cons
1a490 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b  t void *v1, *v2;
1a4a0 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b  .    int n1, n2;
1a4b0 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20  .    Mem c1;.   
1a4c0 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c   Mem c2;.    sql
1a4d0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1a4e0 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c1, pMem1->db, 
1a4f0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1a500 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1a510 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c2, pMem1->db
1a520 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1a530 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1a540 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20  hallowCopy(&c1, 
1a550 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem1, MEM_Ephem
1a560 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a570 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1a580 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d  (&c2, pMem2, MEM
1a590 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20  _Ephem);.    v1 
1a5a0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1a5b0 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1a5c0 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c1, pColl->e
1a5d0 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31  nc);.    n1 = v1
1a5e0 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a  ==0 ? 0 : c1.n;.
1a5f0 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33      v2 = sqlite3
1a600 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1a610 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70  e3_value*)&c2, p
1a620 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1a630 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a  n2 = v2==0 ? 0 :
1a640 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20   c2.n;.    rc = 
1a650 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
1a660 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31  l->pUser, n1, v1
1a670 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73  , n2, v2);.    s
1a680 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1a690 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
1a6a0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1a6b0 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 69  ease(&c2);.    i
1a6c0 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d  f( (v1==0 || v2=
1a6d0 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 29 20  =0) && prcErr ) 
1a6e0 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45  *prcErr = SQLITE
1a6f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75  _NOMEM;.    retu
1a700 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rn rc;.  }.}../*
1a710 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1a720 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e  blobs.  Return n
1a730 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1a740 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
1a750 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65  e first.** is le
1a760 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1a770 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1a780 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72  an the second, r
1a790 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
1a7a0 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61  If one blob is a
1a7b0 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f   prefix of the o
1a7c0 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73  ther, then the s
1a7d0 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65  horter is the le
1a7e0 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssor..*/.static 
1a7f0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
1a800 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  int sqlite3BlobC
1a810 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
1a820 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d   *pB1, const Mem
1a830 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 20   *pB2){.  int c 
1a840 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c  = memcmp(pB1->z,
1a850 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e   pB2->z, pB1->n>
1a860 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20  pB2->n ? pB2->n 
1a870 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28  : pB1->n);.  if(
1a880 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20   c ) return c;. 
1a890 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d   return pB1->n -
1a8a0 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a   pB2->n;.}.../*.
1a8b0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76  ** Compare the v
1a8c0 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  alues contained 
1a8d0 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72  by the two memor
1a8e0 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69  y cells, returni
1a8f0 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20  ng.** negative, 
1a900 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65  zero or positive
1a910 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73   if pMem1 is les
1a920 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1a930 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20  , or greater.** 
1a940 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74  than pMem2. Sort
1a950 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c  ing order is NUL
1a960 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f  L's first, follo
1a970 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28  wed by numbers (
1a980 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20  integers.** and 
1a990 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75  reals) sorted nu
1a9a0 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f  merically, follo
1a9b0 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65  wed by text orde
1a9c0 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61  red by the colla
1a9d0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
1a9e0 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c   pColl and final
1a9f0 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65  ly blob's ordere
1aa00 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a  d by memcmp()..*
1aa10 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61  *.** Two NULL va
1aa20 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1aa30 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69  red equal by thi
1aa40 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
1aa50 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nt sqlite3MemCom
1aa60 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1aa70 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d  pMem1, const Mem
1aa80 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43   *pMem2, const C
1aa90 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
1aaa0 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20    int f1, f2;.  
1aab0 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  int combined_fla
1aac0 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d  gs;..  f1 = pMem
1aad0 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d  1->flags;.  f2 =
1aae0 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20   pMem2->flags;. 
1aaf0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20   combined_flags 
1ab00 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72  = f1|f2;.  asser
1ab10 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  t( (combined_fla
1ab20 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
1ab30 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66  ==0 );. .  /* If
1ab40 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55   one value is NU
1ab50 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74  LL, it is less t
1ab60 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49  han the other. I
1ab70 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  f both values.  
1ab80 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74  ** are NULL, ret
1ab90 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
1aba0 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1abb0 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
1abc0 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f   return (f2&MEM_
1abd0 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f  Null) - (f1&MEM_
1abe0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Null);.  }..  /*
1abf0 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1ac00 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68   a number and th
1ac10 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20  e other is not, 
1ac20 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  the number is le
1ac30 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68  ss..  ** If both
1ac40 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f   are numbers, co
1ac50 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73 20 69  mpare as reals i
1ac60 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c  f one is a real,
1ac70 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a   or as integers.
1ac80 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c    ** if both val
1ac90 75 65 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  ues are integers
1aca0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1acb0 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d  bined_flags&(MEM
1acc0 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
1acd0 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c  {.    double r1,
1ace0 20 72 32 3b 0a 20 20 20 20 69 66 28 20 28 66 31   r2;.    if( (f1
1acf0 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29   & f2 & MEM_Int)
1ad00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1ad10 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d   pMem1->u.i < pM
1ad20 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
1ad30 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n -1;.      if( 
1ad40 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65  pMem1->u.i > pMe
1ad50 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
1ad60 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
1ad70 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1ad80 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f1&MEM_Real)!
1ad90 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d  =0 ){.      r1 =
1ada0 20 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a 20 20 20   pMem1->u.r;.   
1adb0 20 7d 65 6c 73 65 20 69 66 28 20 28 66 31 26 4d   }else if( (f1&M
1adc0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1add0 20 20 20 20 72 31 20 3d 20 28 64 6f 75 62 6c 65      r1 = (double
1ade0 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20  )pMem1->u.i;.   
1adf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1ae00 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1ae10 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65    if( (f2&MEM_Re
1ae20 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1ae30 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 75 2e 72 3b  r2 = pMem2->u.r;
1ae40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1ae50 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f2&MEM_Int)!=0 )
1ae60 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 28 64 6f  {.      r2 = (do
1ae70 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b  uble)pMem2->u.i;
1ae80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ae90 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1aea0 20 7d 0a 20 20 20 20 69 66 28 20 72 31 3c 72 32   }.    if( r1<r2
1aeb0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1aec0 20 20 69 66 28 20 72 31 3e 72 32 20 29 20 72 65    if( r1>r2 ) re
1aed0 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75  turn 1;.    retu
1aee0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
1aef0 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1af00 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65  a string and the
1af10 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62   other is a blob
1af20 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  , the string is 
1af30 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
1af40 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20  th are strings, 
1af50 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68  compare using th
1af60 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
1af70 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
1af80 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1af90 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  &MEM_Str ){.    
1afa0 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74  if( (f1 & MEM_St
1afb0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1afc0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1afd0 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d     if( (f2 & MEM
1afe0 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1aff0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1b000 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
1b010 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d  pMem1->enc==pMem
1b020 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61 73  2->enc );.    as
1b030 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1b040 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
1b050 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d   .            pM
1b060 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1b070 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d  _UTF16LE || pMem
1b080 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1b090 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f  TF16BE );..    /
1b0a0 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
1b0b0 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65  sequence must be
1b0c0 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73   defined at this
1b0d0 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a   point, even if.
1b0e0 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20      ** the user 
1b0f0 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c  deletes the coll
1b100 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
1b110 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72  fter the vdbe pr
1b120 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20  ogram is.    ** 
1b130 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77  compiled (this w
1b140 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68  as not always th
1b150 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a  e case)..    */.
1b160 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f      assert( !pCo
1b170 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll || pColl->xCm
1b180 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  p );..    if( pC
1b190 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  oll ){.      ret
1b1a0 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  urn vdbeCompareM
1b1b0 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20  emString(pMem1, 
1b1c0 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29  pMem2, pColl, 0)
1b1d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
1b1e0 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
1b1f0 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74   was passed as t
1b200 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74  he collate funct
1b210 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ion, fall throug
1b220 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  h.    ** to the 
1b230 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73  blob case and us
1b240 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  e memcmp().  */.
1b250 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20    }. .  /* Both 
1b260 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62  values must be b
1b270 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75  lobs.  Compare u
1b280 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20  sing memcmp().  
1b290 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
1b2a0 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70  te3BlobCompare(p
1b2b0 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a  Mem1, pMem2);.}.
1b2c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
1b2d0 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
1b2e0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1b2f0 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74  on is a serial-t
1b300 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72  ype that.** corr
1b310 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e  esponds to an in
1b320 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75  teger - all valu
1b330 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  es between 1 and
1b340 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a   9 inclusive .**
1b350 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73   except 7. The s
1b360 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20  econd points to 
1b370 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1b380 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ing an integer v
1b390 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a  alue.** serializ
1b3a0 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
1b3b0 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69  serial_type. Thi
1b3c0 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1b3d0 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72  ializes.** and r
1b3e0 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
1b3f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1b400 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1b410 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Int(u32 serial_t
1b420 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ype, const u8 *a
1b430 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20  Key){.  u32 y;. 
1b440 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1b450 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  _DB || (serial_t
1b460 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c  ype>=1 && serial
1b470 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69  _type<=9 && seri
1b480 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20  al_type!=7) );. 
1b490 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
1b4a0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
1b4b0 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a   0:.    case 1:.
1b4c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b4d0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1b4e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45        return ONE
1b4f0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1b500 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20  .    case 2:.   
1b510 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1b520 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1b530 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59     return TWO_BY
1b540 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1b550 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20    case 3:.      
1b560 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1b570 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1b580 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54  return THREE_BYT
1b590 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1b5a0 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20   case 4: {.     
1b5b0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1b5c0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1b5d0 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1b5e0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1b5f0 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1b600 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20  nt*)&y;.    }.  
1b610 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20    case 5: {.    
1b620 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1b630 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1b640 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59    return FOUR_BY
1b650 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
1b660 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1b670 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
1b680 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ey);.    }.    c
1b690 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75  ase 6: {.      u
1b6a0 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
1b6b0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1b6c0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1b6d0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1b6e0 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1b6f0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1b700 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72  aKey+4);.      r
1b710 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34  eturn (i64)*(i64
1b720 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *)&x;.    }.  }.
1b730 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61  .  return (seria
1b740 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a  l_type - 8);.}..
1b750 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1b760 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
1b770 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
1b780 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
1b790 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
1b7a0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1b7b0 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
1b7c0 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
1b7d0 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
1b7e0 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
1b7f0 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
1b800 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1b810 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
1b820 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
1b830 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
1b840 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
1b850 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
1b860 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1b870 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
1b880 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
1b890 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
1b8a0 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
1b8b0 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
1b8c0 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
1b8d0 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
1b8e0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  ** If argument b
1b8f0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
1b900 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1b910 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1b920 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64  has already.** d
1b930 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1b940 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1b950 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  of the keys are 
1b960 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  equal..**.** Key
1b970 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
1b980 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
1b990 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
1b9a0 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20  r of fields. If 
1b9b0 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74  all .** fields t
1b9c0 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f  hat appear in bo
1b9d0 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  th keys are equa
1b9e0 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e  l, then pPKey2->
1b9f0 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a  default_rc is .*
1ba00 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
1ba10 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f  * If database co
1ba20 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63  rruption is disc
1ba30 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65  overed, set pPKe
1ba40 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a  y2->errCode to .
1ba50 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
1ba60 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20  T and return 0. 
1ba70 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1ba80 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1ba90 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  .** pPKey2->errC
1baa0 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51  ode is set to SQ
1bab0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20  LITE_NOMEM and, 
1bac0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
1bad0 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63  L, the.** malloc
1bae0 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  -failed flag set
1baf0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
1bb00 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65  dle (pPKey2->pKe
1bb10 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 73  yInfo->db)..*/.s
1bb20 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1bb30 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1bb40 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  kip(.  int nKey1
1bb50 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1bb60 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
1bb70 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1bb80 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1bb90 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1bba0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53   key */.  int bS
1bbb0 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20  kip             
1bbc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1bbd0 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66  true, skip the f
1bbe0 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  irst field */.){
1bbf0 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1bc20 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1bc30 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
1bc40 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc60 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
1bc70 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d  ext field to com
1bc80 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  pare */.  u32 sz
1bc90 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  Hdr1;           
1bca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1bcb0 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64  e of record head
1bcc0 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
1bcd0 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
1bd00 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64  rst type in head
1bd10 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
1bd20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1bd30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1bd40 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d  n value */.  Mem
1bd50 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d   *pRhs = pPKey2-
1bd60 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  >aMem;       /* 
1bd70 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50  Next field of pP
1bd80 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20  Key2 to compare 
1bd90 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1bda0 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1bdb0 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e  >pKeyInfo;.  con
1bdc0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1bdd0 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1bde0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1bdf0 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65  )pKey1;.  Mem me
1be00 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b  m1;..  /* If bSk
1be10 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ip is true, then
1be20 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1be30 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e  already determin
1be40 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
1be50 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65  t.  ** two eleme
1be60 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20  nts in the keys 
1be70 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74  are equal. Fix t
1be80 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b  he various stack
1be90 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20   variables so.  
1bea0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ** that this rou
1beb0 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70  tine begins comp
1bec0 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63  aring at the sec
1bed0 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  ond field. */.  
1bee0 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20  if( bSkip ){.   
1bef0 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78   u32 s1;.    idx
1bf00 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e  1 = 1 + getVarin
1bf10 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
1bf20 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d  1);.    szHdr1 =
1bf30 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64   aKey1[0];.    d
1bf40 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c  1 = szHdr1 + sql
1bf50 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1bf60 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69  peLen(s1);.    i
1bf70 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b   = 1;.    pRhs++
1bf80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1bf90 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
1bfa0 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
1bfb0 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
1bfc0 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75  1;.    if( d1>(u
1bfd0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1bfe0 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e   .      pPKey2->
1bff0 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1c000 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1c010 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
1c020 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f  0;  /* Corruptio
1c030 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  n */.    }.    i
1c040 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41   = 0;.  }..  VVA
1c050 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
1c060 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1c070 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1c080 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1c090 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  s */.  assert( p
1c0a0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1c0b0 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e  >nField+pPKey2->
1c0c0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1c0d0 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1c0e0 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  d .       || COR
1c0f0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
1c100 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1c110 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1c120 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1c130 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1c140 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
1c150 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1c160 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1c170 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1c180 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1c190 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69  e;..    /* RHS i
1c1a0 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1c1b0 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c      if( pRhs->fl
1c1c0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
1c1d0 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1c1e0 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1c1f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c200 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1c210 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1c220 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
1c230 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1c240 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1c250 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1c260 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1c270 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1c280 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1c290 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1c2a0 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 28 64 6f  double rhs = (do
1c2b0 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e 69 3b 0a  uble)pRhs->u.i;.
1c2c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c2d0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1c2e0 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1c2f0 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1c300 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75        if( mem1.u
1c310 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  .r<rhs ){.      
1c320 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1c330 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d       }else if( m
1c340 65 6d 31 2e 75 2e 72 3e 72 68 73 20 29 7b 0a 20  em1.u.r>rhs ){. 
1c350 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1c360 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c380 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52   i64 lhs = vdbeR
1c390 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73  ecordDecodeInt(s
1c3a0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65  erial_type, &aKe
1c3b0 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20  y1[d1]);.       
1c3c0 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d   i64 rhs = pRhs-
1c3d0 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66  >u.i;.        if
1c3e0 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20  ( lhs<rhs ){.   
1c3f0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1c400 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1c410 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20  ( lhs>rhs ){.   
1c420 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1c430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c440 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1c450 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20  RHS is real */. 
1c460 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1c470 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
1c480 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  al ){.      seri
1c490 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1c4a0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28  idx1];.      if(
1c4b0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1c4c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c4d0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1c4e0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1c4f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1c500 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1c510 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64 6f 75  lse{.        dou
1c520 62 6c 65 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  ble rhs = pRhs->
1c530 75 2e 72 3b 0a 20 20 20 20 20 20 20 20 64 6f 75  u.r;.        dou
1c540 62 6c 65 20 6c 68 73 3b 0a 20 20 20 20 20 20 20  ble lhs;.       
1c550 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1c560 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1c570 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
1c580 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  mem1);.        i
1c590 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1c5a0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  7 ){.          l
1c5b0 68 73 20 3d 20 6d 65 6d 31 2e 75 2e 72 3b 0a 20  hs = mem1.u.r;. 
1c5c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c5d0 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20 28 64          lhs = (d
1c5e0 6f 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69 3b 0a  ouble)mem1.u.i;.
1c5f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c600 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b    if( lhs<rhs ){
1c610 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c620 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1c630 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b  e if( lhs>rhs ){
1c640 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c650 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
1c660 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1c670 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72   /* RHS is a str
1c680 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  ing */.    else 
1c690 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1c6a0 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
1c6b0 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
1c6c0 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
1c6d0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
1c6e0 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
1c6f0 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
1c700 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1c710 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20  ype<12 ){.      
1c720 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1c730 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
1c740 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
1c750 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c760 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1c770 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e  {.        mem1.n
1c780 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
1c790 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
1c7a0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1c7b0 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67  +mem1.n)==(unsig
1c7c0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1c7d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1c7e0 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75  d1+mem1.n+1)==(u
1c7f0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1c800 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31  .        if( (d1
1c810 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69  +mem1.n) > (unsi
1c820 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
1c830 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
1c840 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1c850 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1c860 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
1c870 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1c880 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
1c890 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
1c8a0 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
1c8b0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20  o->aColl[i] ){. 
1c8c0 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e           mem1.en
1c8d0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1c8e0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  c;.          mem
1c8f0 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
1c900 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  >db;.          m
1c910 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em1.flags = MEM_
1c920 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  Str;.          m
1c930 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26  em1.z = (char*)&
1c940 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20  aKey1[d1];.     
1c950 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
1c960 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d                &m
1c980 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49  em1, pRhs, pKeyI
1c990 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26  nfo->aColl[i], &
1c9a0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a  pPKey2->errCode.
1c9b0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1c9c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c9d0 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
1c9e0 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68   MIN(mem1.n, pRh
1c9f0 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
1ca00 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
1ca10 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
1ca20 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
1ca30 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
1ca40 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68  c = mem1.n - pRh
1ca50 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d  s->n; .        }
1ca60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ca70 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1ca80 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65  blob */.    else
1ca90 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1caa0 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20   & MEM_Blob ){. 
1cab0 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
1cac0 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
1cad0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1cae0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
1caf0 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
1cb00 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1cb10 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72  _type<12 || (ser
1cb20 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
1cb30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1cb40 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1cb50 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  {.        int nS
1cb60 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  tr = (serial_typ
1cb70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
1cb80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1cb90 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67  d1+nStr)==(unsig
1cba0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1cbb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1cbc0 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73  d1+nStr+1)==(uns
1cbd0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1cbe0 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e         if( (d1+n
1cbf0 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  Str) > (unsigned
1cc00 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
1cc10 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
1cc20 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
1cc30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1cc40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1cc50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1cc60 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1cc70 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
1cc80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1cc90 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c  nCmp = MIN(nStr,
1cca0 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20   pRhs->n);.     
1ccb0 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70       rc = memcmp
1ccc0 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68  (&aKey1[d1], pRh
1ccd0 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20  s->z, nCmp);.   
1cce0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30         if( rc==0
1ccf0 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70   ) rc = nStr - p
1cd00 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20  Rhs->n;.        
1cd10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1cd20 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e  .    /* RHS is n
1cd30 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b  ull */.    else{
1cd40 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1cd50 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1cd60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65  ;.      rc = (se
1cd70 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20  rial_type!=0);. 
1cd80 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
1cd90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1cda0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1cdb0 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
1cdc0 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20      rc = -rc;.  
1cdd0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
1cde0 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
1cdf0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1ce00 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1ce10 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73   rc) );.      as
1ce20 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1ce30 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65  loc==0 );  /* Se
1ce40 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20  e comment below 
1ce50 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1ce60 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
1ce70 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a  ++;.    pRhs++;.
1ce80 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
1ce90 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1cea0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
1ceb0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c  .    idx1 += sql
1cec0 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65  ite3VarintLen(se
1ced0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77  rial_type);.  }w
1cee0 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69  hile( idx1<(unsi
1cef0 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 69  gned)szHdr1 && i
1cf00 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
1cf10 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64  && d1<=(unsigned
1cf20 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20  )nKey1 );..  /* 
1cf30 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
1cf40 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
1cf50 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
1cf60 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
1cf70 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
1cf80 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
1cf90 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
1cfa0 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
1cfb0 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
1cfc0 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
1cfd0 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
1cfe0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
1cff0 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
1d000 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1d010 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
1d020 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
1d030 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   one or both of 
1d040 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74  the keys ran out
1d050 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20   of fields and. 
1d060 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c   ** all the fiel
1d070 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
1d080 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20  int were equal. 
1d090 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75  Return the defau
1d0a0 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65  lt_rc.  ** value
1d0b0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1d0c0 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20  CORRUPT_DB .    
1d0d0 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64     || vdbeRecord
1d0e0 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1d0f0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1d100 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  2, pPKey2->defau
1d110 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c  lt_rc) .       |
1d120 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  | pKeyInfo->db->
1d130 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29  mallocFailed.  )
1d140 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79  ;.  return pPKey
1d150 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d  2->default_rc;.}
1d160 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1d170 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20  RecordCompare(. 
1d180 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1d190 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
1d1a0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1d1b0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1d1c0 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
1d1d0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1d1e0 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 64  /.){.  return vd
1d1f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1d200 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
1d210 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29  Key1, pPKey2, 0)
1d220 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1d230 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
1d240 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
1d250 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
1d260 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1d270 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
1d280 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
1d290 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74  pPKey2 is an int
1d2a0 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68  eger, and (b) th
1d2b0 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65  e .** size-of-he
1d2c0 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74  ader varint at t
1d2d0 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
1d2e0 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
1d2f0 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79  n a single.** by
1d300 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73  te (i.e. is less
1d310 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a   than 128)..**.*
1d320 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65  * To avoid conce
1d330 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72  rns about buffer
1d340 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73   overreads, this
1d350 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
1d360 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65   used.** on sche
1d370 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61  mas where the ma
1d380 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64  ximum valid head
1d390 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79  er size is 63 by
1d3a0 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a  tes or less..*/.
1d3b0 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
1d3c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1d3d0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1d3e0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1d3f0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1d400 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1d410 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
1d420 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1d430 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
1d440 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75  Key = &((const u
1d450 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73  8*)pKey1)[*(cons
1d460 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78  t u8*)pKey1 & 0x
1d470 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  3F];.  int seria
1d480 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74  l_type = ((const
1d490 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a   u8*)pKey1)[1];.
1d4a0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32    int res;.  u32
1d4b0 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69   y;.  u64 x;.  i
1d4c0 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61  64 v = pPKey2->a
1d4d0 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36  Mem[0].u.i;.  i6
1d4e0 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73  4 lhs;..  vdbeAs
1d4f0 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1d500 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
1d510 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
1d520 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73  >pKeyInfo);.  as
1d530 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65  sert( (*(u8*)pKe
1d540 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52  y1)<=0x3F || COR
1d550 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69  RUPT_DB );.  swi
1d560 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
1d570 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20   ){.    case 1: 
1d580 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
1d590 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1d5a0 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59      lhs = ONE_BY
1d5b0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1d5c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1d5d0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1d5e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d5f0 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
1d600 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1d610 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1d620 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1d630 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1d640 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1d650 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d660 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
1d670 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
1d680 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1d690 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45  lhs = THREE_BYTE
1d6a0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1d6b0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1d6c0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1d6d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d6e0 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
1d6f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1d700 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  /.      y = FOUR
1d710 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1d720 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69  ;.      lhs = (i
1d730 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
1d740 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1d750 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1d760 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d770 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
1d780 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1d790 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1d7a0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1d7b0 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
1d7c0 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1d7d0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1d7e0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1d7f0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1d800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d810 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20   6: { /* 8-byte 
1d820 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1d830 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52  /.      x = FOUR
1d840 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1d850 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1d860 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1d870 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1d880 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a      lhs = *(i64*
1d890 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63  )&x;.      testc
1d8a0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1d8b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d8c0 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20  .    case 8: .  
1d8d0 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20      lhs = 0;.   
1d8e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1d8f0 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20  se 9:.      lhs 
1d900 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
1d910 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;..    /* This c
1d920 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d  ase could be rem
1d930 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61  oved without cha
1d940 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nging the result
1d950 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20  s of running.   
1d960 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49   ** this code. I
1d970 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73  ncluding it caus
1d980 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61  es gcc to genera
1d990 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74  te a faster swit
1d9a0 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ch .    ** state
1d9b0 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20  ment (since the 
1d9c0 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20  range of switch 
1d9d0 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72  targets now star
1d9e0 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20  ts at zero and. 
1d9f0 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75     ** is contigu
1da00 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f  ous) but does no
1da10 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c  t cause any dupl
1da20 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65  icate code to be
1da30 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a   generated.    *
1da40 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65  * (as gcc is cle
1da50 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  ver enough to co
1da60 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69  mbine the two li
1da70 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72  ke cases). Other
1da80 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   .    ** compile
1da90 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69  rs might be simi
1daa0 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61  lar.  */ .    ca
1dab0 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20  se 0: case 7:.  
1dac0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1dad0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1dae0 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
1daf0 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20  , pPKey2);..    
1db00 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
1db10 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1db20 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1db30 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1db40 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ey2);.  }..  if(
1db50 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v>lhs ){.    re
1db60 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
1db70 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68    }else if( v<lh
1db80 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
1db90 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c  PKey2->r2;.  }el
1dba0 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e  se if( pPKey2->n
1dbb0 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f  Field>1 ){.    /
1dbc0 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
1dbd0 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
1dbe0 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f  ys are equal. Co
1dbf0 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69  mpare the traili
1dc00 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ng .    ** field
1dc10 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  s.  */.    res =
1dc20 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1dc30 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
1dc40 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1dc50 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
1dc60 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
1dc70 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
1dc80 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20   keys are equal 
1dc90 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
1dca0 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a   trailing.    **
1dcb0 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20   fields. Return 
1dcc0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1dcd0 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  rc in this case.
1dce0 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50   */.    res = pP
1dcf0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1dd00 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1dd10 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1dd20 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1dd30 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65  Key1, pPKey2, re
1dd40 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  s) );.  return r
1dd50 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  es;.}../*.** Thi
1dd60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
1dd70 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
1dd80 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
1dd90 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1dda0 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
1ddb0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
1ddc0 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72   pPKey2 is a str
1ddd0 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68  ing, that (b) th
1dde0 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a  e first field.**
1ddf0 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
1de00 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
1de10 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74  ARY and (c) that
1de20 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
1de30 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61  der varint .** a
1de40 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
1de50 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
1de60 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
1de70 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
1de80 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
1de90 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74  areString(.  int
1dea0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1deb0 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1dec0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1ded0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1dee0 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
1def0 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
1df00 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d  onst u8 *aKey1 =
1df10 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79   (const u8*)pKey
1df20 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  1;.  int serial_
1df30 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b  type;.  int res;
1df40 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ..  vdbeAssertFi
1df50 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1df60 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
1df70 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
1df80 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e  nfo);.  getVarin
1df90 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
1dfa0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69  erial_type);.  i
1dfb0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1dfc0 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  2 ){.    res = p
1dfd0 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20  PKey2->r1;      
1dfe0 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
1dff0 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20   is a number or 
1e000 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73  a null */.  }els
1e010 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1e020 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a  ype & 0x01) ){ .
1e030 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1e040 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r2;      /* (p
1e050 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
1e060 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65   blob */.  }else
1e070 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a  {.    int nCmp;.
1e080 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20      int nStr;.  
1e090 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b    int szHdr = aK
1e0a0 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74  ey1[0];..    nSt
1e0b0 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1e0c0 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66  -12) / 2;.    if
1e0d0 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29  ( (szHdr + nStr)
1e0e0 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20   > nKey1 ){.    
1e0f0 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1e100 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1e110 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e120 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1e130 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1e140 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20  .    }.    nCmp 
1e150 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61  = MIN( pPKey2->a
1e160 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29  Mem[0].n, nStr )
1e170 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63  ;.    res = memc
1e180 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d  mp(&aKey1[szHdr]
1e190 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  , pPKey2->aMem[0
1e1a0 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20  ].z, nCmp);..   
1e1b0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
1e1c0 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20       res = nStr 
1e1d0 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  - pPKey2->aMem[0
1e1e0 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ].n;.      if( r
1e1f0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
1e200 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
1e210 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  eld>1 ){.       
1e220 20 20 20 72 65 73 20 3d 20 76 64 62 65 52 65 63     res = vdbeRec
1e230 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1e240 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
1e250 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20   pPKey2, 1);.   
1e260 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e270 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1e280 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1e290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e2a0 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
1e2b0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
1e2c0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20   pPKey2->r2;.   
1e2d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e2e0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1e2f0 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r1;.      }.    
1e300 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
1e310 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
1e320 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d  PKey2->r2;.    }
1e330 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20  else{.      res 
1e340 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1e350 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1e360 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1e370 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1e380 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1e390 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43  res).       || C
1e3a0 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20  ORRUPT_DB.      
1e3b0 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79   || pPKey2->pKey
1e3c0 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1e3d0 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65  Failed.  );.  re
1e3e0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1e3f0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1e400 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
1e410 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1e420 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20  re() compatible 
1e430 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74  function.** suit
1e440 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69  able for compari
1e450 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65  ng serialized re
1e460 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70  cords to the unp
1e470 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73  acked record pas
1e480 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e  sed.** as the on
1e490 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
1e4a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71  RecordCompare sq
1e4b0 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
1e4c0 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63  pare(UnpackedRec
1e4d0 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61  ord *p){.  /* va
1e4e0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
1e4f0 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e  eInt() and varin
1e500 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  tRecordCompareSt
1e510 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75  ring() both assu
1e520 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  me.  ** that the
1e530 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
1e540 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75  varint that occu
1e550 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  rs at the start 
1e560 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20  of each record. 
1e570 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69   ** fits in a si
1e580 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20  ngle byte (i.e. 
1e590 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e  is 127 or less).
1e5a0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
1e5b0 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61  pareInt().  ** a
1e5c0 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
1e5d0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f   it is safe to o
1e5e0 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72  verread a buffer
1e5f0 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65   by at least the
1e600 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70   .  ** maximum p
1e610 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65  ossible legal he
1e620 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38  ader size plus 8
1e630 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20   bytes. Because 
1e640 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75  there is.  ** gu
1e650 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1e660 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20  t least 74 (but 
1e670 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f  not 136) bytes o
1e680 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77  f padding follow
1e690 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75  ing each.  ** bu
1e6a0 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76  ffer passed to v
1e6b0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
1e6c0 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b  reInt() this mak
1e6d0 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74  es it convenient
1e6e0 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74   to.  ** limit t
1e6f0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
1e700 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65  eader to 64 byte
1e710 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65  s in cases where
1e720 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1e730 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65  .  ** is an inte
1e740 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ger..  **.  ** T
1e750 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74  he easiest way t
1e760 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c  o enforce this l
1e770 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69  imit is to consi
1e780 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73  der only records
1e790 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69   with.  ** 13 fi
1e7a0 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66  elds or less. If
1e7b0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1e7c0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
1e7d0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  the maximum lega
1e7e0 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69  l.  ** header si
1e7f0 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20  ze is (12*5 + 1 
1e800 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a  + 1) bytes.  */.
1e810 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e    if( (p->pKeyIn
1e820 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e  fo->nField + p->
1e830 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1e840 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e  d)<=13 ){.    in
1e850 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65  t flags = p->aMe
1e860 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20  m[0].flags;.    
1e870 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  if( p->pKeyInfo-
1e880 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29  >aSortOrder[0] )
1e890 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20  {.      p->r1 = 
1e8a0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
1e8b0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
1e8c0 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31        p->r1 = -1
1e8d0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
1e8e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1e8f0 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e   (flags & MEM_In
1e900 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
1e910 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
1e920 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20  pareInt;.    }. 
1e930 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
1e940 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b  gs & MEM_Real );
1e950 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
1e960 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
1e970 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1e980 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f   flags & MEM_Blo
1e990 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  b );.    if( (fl
1e9a0 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c  ags & (MEM_Real|
1e9b0 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f  MEM_Null|MEM_Blo
1e9c0 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65  b))==0 && p->pKe
1e9d0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d  yInfo->aColl[0]=
1e9e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1e9f0 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  rt( flags & MEM_
1ea00 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74  Str );.      ret
1ea10 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
1ea20 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20  mpareString;.   
1ea30 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1ea40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1ea50 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a  rdCompare;.}../*
1ea60 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20  .** pCur points 
1ea70 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
1ea80 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  y created using 
1ea90 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1eaa0 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61  d opcode..** Rea
1eab0 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65  d the rowid (the
1eac0 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74   last field in t
1ead0 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73  he record) and s
1eae0 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
1eaf0 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  d..** Return SQL
1eb00 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
1eb10 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
1eb20 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
1eb30 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  erwise..**.** pC
1eb40 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e  ur might be poin
1eb50 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74  ting to text obt
1eb60 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72  ained from a cor
1eb70 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
1eb80 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f  le..** So the co
1eb90 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntent cannot be 
1eba0 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70  trusted.  Do app
1ebb0 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20  ropriate checks 
1ebc0 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a  on the content..
1ebd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1ebe0 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74  beIdxRowid(sqlit
1ebf0 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72  e3 *db, BtCursor
1ec00 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
1ec10 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
1ec20 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
1ec30 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
1ec40 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1ec50 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
1ec60 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
1ec70 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
1ec80 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
1ec90 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
1eca0 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
1ecb0 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
1ecc0 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a   Mem m, v;..  /*
1ecd0 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
1ece0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
1ecf0 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
1ed00 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
1ed10 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
1ed20 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
1ed30 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
1ed40 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
1ed50 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e  ruption..  ** An
1ed60 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  y corruption is 
1ed70 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69  detected in sqli
1ed80 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
1ed90 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20  lPtr(), though, 
1eda0 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  so.  ** this cod
1edb0 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73  e can safely ass
1edc0 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65  ume that nCellKe
1edd0 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20  y is 32-bits  . 
1ede0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
1edf0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1ee00 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
1ee10 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
1ee20 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
1ee30 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
1ee40 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
1ee50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ee60 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69  );     /* pCur i
1ee70 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
1ee80 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
1ee90 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72   fail */.  asser
1eea0 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
1eeb0 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
1eec0 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
1eed0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
1eee0 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
1eef0 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
1ef00 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
1ef10 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1ef20 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
1ef30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
1ef40 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
1ef50 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
1ef60 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
1ef70 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1ef80 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
1ef90 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
1efa0 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
1efb0 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
1efc0 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
1efd0 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
1efe0 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
1eff0 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
1f000 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
1f010 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
1f020 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
1f030 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
1f040 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
1f050 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
1f060 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
1f070 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
1f080 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
1f090 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
1f0a0 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
1f0b0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1f0c0 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
1f0d0 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
1f0e0 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
1f0f0 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
1f100 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
1f110 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
1f120 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1f130 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
1f140 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
1f150 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1f160 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
1f170 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1f180 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
1f190 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1f1a0 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
1f1b0 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
1f1c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1f1d0 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
1f1e0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1f1f0 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
1f200 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
1f210 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
1f220 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
1f230 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
1f240 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
1f250 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
1f260 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
1f270 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1f280 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65  typeRowid);.  te
1f290 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e  stcase( (u32)m.n
1f2a0 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  ==szHdr+lenRowid
1f2b0 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
1f2c0 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64  ly((u32)m.n<szHd
1f2d0 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20  r+lenRowid) ){. 
1f2e0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
1f2f0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
1f300 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68  }..  /* Fetch th
1f310 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68  e integer off th
1f320 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
1f330 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
1f340 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1f350 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
1f360 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
1f370 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
1f380 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
1f390 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1f3a0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
1f3b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f3c0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
1f3d0 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  if database corr
1f3e0 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
1f3f0 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62  ed after m has b
1f400 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  een.  ** allocat
1f410 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20  ed.  Free the m 
1f420 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
1f430 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1f440 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63  . */.idx_rowid_c
1f450 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73  orruption:.  tes
1f460 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f  tcase( m.szMallo
1f470 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c!=0 );.  sqlite
1f480 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1f490 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
1f4a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f4b0 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  T;.}../*.** Comp
1f4c0 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74  are the key of t
1f4d0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
1f4e0 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73  hat cursor pC is
1f4f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61   pointing to aga
1f500 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
1f510 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63  string in pUnpac
1f520 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ked.  Write into
1f530 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
1f540 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
1f550 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1f560 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
1f570 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1f580 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
1f590 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65  er than pUnpacke
1f5a0 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
1f5b0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
1f5c0 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64  .**.** pUnpacked
1f5d0 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
1f5e0 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
1f5f0 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
1f600 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
1f610 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
1f620 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
1f630 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
1f640 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
1f650 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
1f660 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65  red as well.  He
1f670 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  nce, this routin
1f680 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20  e only compares 
1f690 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a  the prefixes .**
1f6a0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69   of the keys pri
1f6b0 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20  or to the final 
1f6c0 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65  rowid, not the e
1f6d0 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  ntire key..*/.in
1f6e0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
1f6f0 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71  KeyCompare(.  sq
1f700 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f720 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1f730 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43  ction */.  VdbeC
1f740 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20  ursor *pC,      
1f750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f760 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d  he cursor to com
1f770 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
1f780 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1f790 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20   *pUnpacked,    
1f7a0 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76     /* Unpacked v
1f7b0 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f  ersion of key */
1f7c0 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1f7f0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75   comparison resu
1f800 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  lt here */.){.  
1f810 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
1f820 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
1f830 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
1f840 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65  C->pCursor;.  Me
1f850 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  m m;..  assert( 
1f860 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1f870 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
1f880 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63  );.  VVA_ONLY(rc
1f890 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65   =) sqlite3Btree
1f8a0 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
1f8b0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65  CellKey);.  asse
1f8c0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
1f8d0 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20  K );    /* pCur 
1f8e0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
1f8f0 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f  so KeySize canno
1f900 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e  t fail */.  /* n
1f910 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77  CellKey will alw
1f920 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30  ays be between 0
1f930 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20   and 0xffffffff 
1f940 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
1f950 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72  ay.  ** that btr
1f960 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
1f970 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56   and sqlite3GetV
1f980 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d  arint32() are im
1f990 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69  plemented */.  i
1f9a0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c  f( nCellKey<=0 |
1f9b0 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66  | nCellKey>0x7ff
1f9c0 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65  fffff ){.    *re
1f9d0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
1f9e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1f9f0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
1fa00 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1fa10 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63  &m, db, 0);.  rc
1fa20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
1fa30 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70  mFromBtree(pC->p
1fa40 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29  Cursor, 0, (u32)
1fa50 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
1fa60 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1fa70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1fa80 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
1fa90 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1faa0 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e  re(m.n, m.z, pUn
1fab0 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74  packed);.  sqlit
1fac0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1fad0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
1fae0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1faf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fb00 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
1fb10 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
1fb20 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
1fb30 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
1fb40 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
1fb50 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1fb60 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
1fb70 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
1fb80 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
1fb90 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
1fba0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1fbb0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
1fbc0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62  ->mutex) );.  db
1fbd0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61  ->nChange = nCha
1fbe0 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61  nge;.  db->nTota
1fbf0 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  lChange += nChan
1fc00 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ge;.}../*.** Set
1fc10 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76   a flag in the v
1fc20 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  dbe to update th
1fc30 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1fc40 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61   when it is fina
1fc50 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65  lised.** or rese
1fc60 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1fc70 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
1fc80 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76  es(Vdbe *v){.  v
1fc90 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20  ->changeCntOn = 
1fca0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
1fcb0 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20   every prepared 
1fcc0 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69  statement associ
1fcd0 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
1fce0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
1fcf0 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a  ** as expired..*
1fd00 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20  *.** An expired 
1fd10 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20  statement means 
1fd20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69  that recompilati
1fd30 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  on of the statem
1fd40 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d  ent is.** recomm
1fd50 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73  end.  Statements
1fd60 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69   expire when thi
1fd70 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20  ngs happen that 
1fd80 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72  make their.** pr
1fd90 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e  ograms obsolete.
1fda0 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d    Removing user-
1fdb0 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
1fdc0 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  s or collating.*
1fdd0 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20  * sequences, or 
1fde0 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68  changing an auth
1fdf0 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69  orization functi
1fe00 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73  on are the types
1fe10 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68   of.** things th
1fe20 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64  at make prepared
1fe30 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f   statements obso
1fe40 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lete..*/.void sq
1fe50 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
1fe60 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71  redStatements(sq
1fe70 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
1fe80 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d  be *p;.  for(p =
1fe90 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70   db->pVdbe; p; p
1fea0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1feb0 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
1fec0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1fed0 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  urn the database
1fee0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1fef0 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71   the Vdbe..*/.sq
1ff00 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64  lite3 *sqlite3Vd
1ff10 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20  beDb(Vdbe *v){. 
1ff20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d   return v->db;.}
1ff30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1ff40 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
1ff50 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
1ff60 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
1ff70 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
1ff80 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
1ff90 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
1ffa0 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
1ffb0 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
1ffc0 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
1ffd0 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
1ffe0 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
1fff0 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
20000 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
20010 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
20020 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
20030 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
20040 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
20050 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
20060 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
20070 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
20080 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
20090 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
200a0 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
200b0 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
200c0 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
200d0 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
200e0 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
200f0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
20100 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
20110 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
20120 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e    if( 0==(pMem->
20130 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
20140 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
20150 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d  e3_value *pRet =
20160 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
20170 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69  (v->db);.      i
20180 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
20190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
201a0 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65  mCopy((Mem *)pRe
201b0 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  t, pMem);.      
201c0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70    sqlite3ValueAp
201d0 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74  plyAffinity(pRet
201e0 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54  , aff, SQLITE_UT
201f0 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  F8);.      }.   
20200 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a     return pRet;.
20210 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20220 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
20230 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72  onfigure SQL var
20240 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68  iable iVar so th
20250 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77  at binding a new
20260 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67   value to it sig
20270 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  nals.** to sqlit
20280 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20  e3_reoptimize() 
20290 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e  that re-preparin
202a0 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
202b0 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
202c0 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20   a better query 
202d0 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  plan..*/.void sq
202e0 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
202f0 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ask(Vdbe *v, int
20300 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74   iVar){.  assert
20310 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
20320 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20  ( iVar>32 ){.   
20330 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78   v->expmask = 0x
20340 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73  ffffffff;.  }els
20350 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  e{.    v->expmas
20360 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20  k |= ((u32)1 << 
20370 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d  (iVar-1));.  }.}
20380 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20390 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
203a0 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  LE./*.** Transfe
203b0 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  r error message 
203c0 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c  text from an sql
203d0 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73  ite3_vtab.zErrMs
203e0 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
203f0 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
20400 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
20410 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61  3_malloc) into a
20420 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74   Vdbe.zErrMsg (t
20430 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
20440 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
20450 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
20460 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20  alloc)..*/.void 
20470 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
20480 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c  tErrmsg(Vdbe *p,
20490 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
204a0 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  Vtab){.  sqlite3
204b0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
204c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
204d0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
204e0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71   p->zErrMsg = sq
204f0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
20500 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
20510 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
20520 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
20530 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
20540 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  Msg = 0;.}.#endi
20550 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
20560 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
20570 0a                                               .