/ Hex Artifact Content
Login

Artifact 3d6b2b412ef2193aa4729922dfc5df1efadbf6df:


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 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62    Op *pOp;.  Vdb
2cf0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20  eOpIter sIter;. 
2d00: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
2d10: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
2d20: 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76  );.  sIter.v = v
2d30: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70  ;..  while( (pOp
2d40: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
2d50: 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20  Iter))!=0 ){.   
2d60: 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f   int opcode = pO
2d70: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69  p->opcode;.    i
2d80: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65  f( opcode==OP_De
2d90: 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d  stroy || opcode=
2da0: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
2db0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
2dc0: 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e .#ifndef SQLIT
2dd0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
2de0: 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f  EY.     || (opco
2df0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
2e00: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
2e10: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23  & pOp->p2==1) .#
2e20: 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28  endif.     || ((
2e30: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
2e40: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
2e50: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
2e60: 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78   && ((pOp->p1&0x
2e70: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
2e80: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
2e90: 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20  2==OE_Abort)).  
2ea0: 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62    ){.      hasAb
2eb0: 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ort = 1;.      b
2ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2ed0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2ee0: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
2ef0: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
2f00: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
2f10: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
2f20: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2f30: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
2f40: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
2f50: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
2f60: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
2f70: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
2f80: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
2f90: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2fa0: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
2fb0: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
2fc0: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
2fd0: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
2fe0: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
2ff0: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
3000: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
3010: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
3020: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
3030: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
3040: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
3050: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b  ort==mayAbort );
3060: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
3070: 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20  ITE_DEBUG - the 
3080: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
3090: 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e  Abort() function
30a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20   */../*.** Loop 
30b0: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
30c0: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
30d0: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
30e0: 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f  re negative.** o
30f0: 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  n jump instructi
3100: 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20  ons.  Each such 
3110: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
3120: 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a  .  Resolve the.*
3130: 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69  * label by setti
3140: 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ng the P2 value 
3150: 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e  to its correct n
3160: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  on-zero value..*
3170: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3180: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
3190: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
31a0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
31b0: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72  erted..**.** Var
31c0: 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41  iable *pMaxFuncA
31d0: 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  rgs is set to th
31e0: 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  e maximum value 
31f0: 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65  of any P2 argume
3200: 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f  nt .** to an OP_
3210: 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67  Function, OP_Agg
3220: 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74  Step or OP_VFilt
3230: 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20  er opcode. This 
3240: 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73  is used by .** s
3250: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
3260: 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68  ady() to size th
3270: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
3280: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rray..**.** The 
3290: 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c 64  Op.opflags field
32a0: 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20 6f   is set on all o
32b0: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  pcodes..*/.stati
32c0: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
32d0: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
32e0: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
32f0: 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  s){.  int i;.  i
3300: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
3310: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
3320: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
3330: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
3340: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
3350: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
3360: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
3370: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
3380: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f  Reader = 0;.  fo
3390: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
33a0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
33b0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
33c0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
33d0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f  ->opcode;..    /
33e0: 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20  * NOTE: Be sure 
33f0: 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f  to update mkopco
3400: 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64  deh.awk when add
3410: 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a  ing or removing.
3420: 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f      ** cases fro
3430: 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a  m this switch! *
3440: 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  /.    switch( op
3450: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  code ){.      ca
3460: 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a  se OP_Function:.
3470: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 67        case OP_Ag
3480: 67 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20 20  gStep: {.       
3490: 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61   if( pOp->p5>nMa
34a0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
34b0: 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20   = pOp->p5;.    
34c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
34d0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50   }.      case OP
34e0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a  _Transaction: {.
34f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
3500: 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64  >p2!=0 ) p->read
3510: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
3520: 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a    /* fall thru *
3530: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
3540: 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
3550: 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  it:.      case O
3560: 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20  P_Savepoint: {. 
3570: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61         p->bIsRea
3580: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
3590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
35a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35b0: 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63 61  MIT_WAL.      ca
35c0: 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  se OP_Checkpoint
35d0: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  :.#endif.      c
35e0: 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20  ase OP_Vacuum:. 
35f0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75       case OP_Jou
3600: 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20  rnalMode: {.    
3610: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
3620: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
3630: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
3640: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3650: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
3660: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
3670: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61 73  LTABLE.      cas
3680: 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a  e OP_VUpdate: {.
3690: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
36a0: 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p2>nMaxArgs ) n
36b0: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
36c0: 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  2;.        break
36d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36e0: 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a  case OP_VFilter:
36f0: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e   {.        int n
3700: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3710: 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20  ( p->nOp - i >= 
3720: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  3 );.        ass
3730: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
3740: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
3750: 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 70  );.        n = p
3760: 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20  Op[-1].p1;.     
3770: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
3780: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
3790: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
37a0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
37b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
37c0: 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  xt:.      case O
37d0: 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20  P_NextIfOpen:.  
37e0: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
37f0: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  erNext: {.      
3800: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
3810: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
3820: 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70  eNext;.        p
3830: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3840: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
3850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3860: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
3870: 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ev:.      case O
3880: 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a  P_PrevIfOpen: {.
3890: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
38a0: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
38b0: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
38c0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
38d0: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43  type = P4_ADVANC
38e0: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
38f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3900: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67  .    pOp->opflag
3910: 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  s = sqlite3Opcod
3920: 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65  eProperty[opcode
3930: 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d  ];.    if( (pOp-
3940: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
3950: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70  _JUMP)!=0 && pOp
3960: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->p2<0 ){.      
3970: 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e  assert( -1-pOp->
3980: 70 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  p2<pParse->nLabe
3990: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
39a0: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
39b0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
39c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
39d0: 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65  ee(p->db, pParse
39e0: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61  ->aLabel);.  pPa
39f0: 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b  rse->aLabel = 0;
3a00: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  .  pParse->nLabe
3a10: 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75  l = 0;.  *pMaxFu
3a20: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
3a30: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  s;.  assert( p->
3a40: 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20  bIsReader!=0 || 
3a50: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
3a60: 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d  >btreeMask) );.}
3a70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3a80: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
3a90: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
3aa0: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
3ab0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
3ac0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3ad0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
3ae0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
3af0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
3b00: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
3b10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
3b20: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
3b30: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
3b40: 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f  he array of opco
3b50: 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  des associated w
3b60: 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  ith.** the Vdbe 
3b70: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
3b80: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74  rst argument. It
3b90: 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
3ba0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a  responsibility.*
3bb0: 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72  * to arrange for
3bc0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72   the returned ar
3bd0: 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75  ray to be eventu
3be0: 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
3bf0: 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65   the .** vdbeFre
3c00: 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74  eOpArray() funct
3c10: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ion..**.** Befor
3c20: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e  e returning, *pn
3c30: 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Op is set to the
3c40: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
3c50: 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  es in the return
3c60: 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73  ed.** array. Als
3c70: 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20  o, *pnMaxArg is 
3c80: 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65  set to the large
3c90: 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74  r of its current
3ca0: 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74   value and .** t
3cb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
3cc0: 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65  ries in the Vdbe
3cd0: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72  .apArg[] array r
3ce0: 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75  equired to execu
3cf0: 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  te the .** retur
3d00: 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ned program..*/.
3d10: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
3d20: 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56  dbeTakeOpArray(V
3d30: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f  dbe *p, int *pnO
3d40: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67  p, int *pnMaxArg
3d50: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  ){.  VdbeOp *aOp
3d60: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73   = p->aOp;.  ass
3d70: 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e  ert( aOp && !p->
3d80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3d90: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
3da0: 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65  that sqlite3Vdbe
3db0: 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20  UsesBtree() was 
3dc0: 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  not called on th
3dd0: 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72  is VM */.  asser
3de0: 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  t( DbMaskAllZero
3df0: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29  (p->btreeMask) )
3e00: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
3e10: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
3e20: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
3e30: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
3e40: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
3e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
3e60: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
3e70: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
3e80: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
3e90: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
3ea0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
3eb0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
3ec0: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
3ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3ee0: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
3ef0: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
3f00: 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74 20 69  onst *aOp, int i
3f10: 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74 20 61  Lineno){.  int a
3f20: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
3f30: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3f40: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
3f50: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
3f60: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
3f70: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
3f80: 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20  ray(p, nOp) ){. 
3f90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3fa0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
3fb0: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e  ;.  if( ALWAYS(n
3fc0: 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  Op>0) ){.    int
3fd0: 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69   i;.    VdbeOpLi
3fe0: 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20  st const *pIn = 
3ff0: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
4000: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49  ; i<nOp; i++, pI
4010: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n++){.      int 
4020: 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20  p2 = pIn->p2;.  
4030: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74      VdbeOp *pOut
4040: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64   = &p->aOp[i+add
4050: 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  r];.      pOut->
4060: 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70  opcode = pIn->op
4070: 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74  code;.      pOut
4080: 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a  ->p1 = pIn->p1;.
4090: 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 29        if( p2<0 )
40a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
40b0: 28 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50  ( sqlite3OpcodeP
40c0: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
40d0: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
40e0: 4d 50 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  MP );.        pO
40f0: 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20  ut->p2 = addr + 
4100: 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20  ADDR(p2);.      
4110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
4120: 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  Out->p2 = p2;.  
4130: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74      }.      pOut
4140: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a  ->p3 = pIn->p3;.
4150: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79        pOut->p4ty
4160: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
4170: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  .      pOut->p4.
4180: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75  p = 0;.      pOu
4190: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
41a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
41b0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
41c0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  .      pOut->zCo
41d0: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  mment = 0;.#endi
41e0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
41f0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
4200: 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69      pOut->iSrcLi
4210: 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a  ne = iLineno+i;.
4220: 23 65 6c 73 65 0a 20 20 20 20 20 20 28 76 6f 69  #else.      (voi
4230: 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69  d)iLineno;.#endi
4240: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
4250: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
4260: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
4270: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
4280: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
4290: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
42a0: 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70  Op(0, i+addr, &p
42b0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a  ->aOp[i+addr]);.
42c0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
42d0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20     }.    p->nOp 
42e0: 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65  += nOp;.  }.  re
42f0: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
4300: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
4310: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f  alue of the P1 o
4320: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
4330: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
4340: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
4350: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
4360: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
4370: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
4380: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
4390: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
43a0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
43b0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
43c0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
43d0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
43e0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
43f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4400: 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33  geP1(Vdbe *p, u3
4410: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
4420: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4430: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4440: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4450: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4460: 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p1 = val;.  }.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4480: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4490: 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P2 operand for a
44a0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
44b0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
44c0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
44d0: 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a   for setting a j
44e0: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  ump destination.
44f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4500: 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62  VdbeChangeP2(Vdb
4510: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
4520: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
4530: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
4540: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
4550: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4560: 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61  Op[addr].p2 = va
4570: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4580: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4590: 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61   of the P3 opera
45a0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
45b0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
45c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
45d0: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
45e0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
45f0: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
4600: 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( p!=0 );.  if( 
4610: 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64  ((u32)p->nOp)>ad
4620: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
4630: 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b  [addr].p3 = val;
4640: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
4650: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
4660: 66 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64  f the P5 operand
4670: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
4680: 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20  cently.** added 
4690: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  operation..*/.vo
46a0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
46b0: 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20  angeP5(Vdbe *p, 
46c0: 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  u8 val){.  asser
46d0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( p!=0 );.  if(
46e0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61   p->aOp ){.    a
46f0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
4700: 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d  );.    p->aOp[p-
4710: 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c  >nOp-1].p5 = val
4720: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
4730: 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65  hange the P2 ope
4740: 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74  rand of instruct
4750: 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74  ion addr so that
4760: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
4770: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
4780: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
4790: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64  tion to be coded
47a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
47b0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64  3VdbeJumpHere(Vd
47c0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
47d0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  {.  sqlite3VdbeC
47e0: 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c  hangeP2(p, addr,
47f0: 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 70 2d 3e 70   p->nOp);.  p->p
4800: 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 20  Parse->iFixedOp 
4810: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a  = p->nOp - 1;.}.
4820: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
4830: 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72  nput FuncDef str
4840: 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65  ucture is epheme
4850: 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69  ral, then free i
4860: 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75  t.  If.** the Fu
4870: 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68  ncDef is not eph
4880: 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e  ermal, then do n
4890: 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  othing..*/.stati
48a0: 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d  c void freeEphem
48b0: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c  eralFunction(sql
48c0: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
48d0: 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20  f *pDef){.  if( 
48e0: 41 4c 57 41 59 53 28 70 44 65 66 29 20 26 26 20  ALWAYS(pDef) && 
48f0: 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
4900: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
4910: 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20  PHEM)!=0 ){.    
4920: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4930: 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a  , pDef);.  }.}..
4940: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
4950: 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69  FreeOpArray(sqli
4960: 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74  te3 *, Op *, int
4970: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  );../*.** Delete
4980: 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e   a P4 value if n
4990: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
49a0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28  tic void freeP4(
49b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
49c0: 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p4type, void *p
49d0: 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a  4){.  if( p4 ){.
49e0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29      assert( db )
49f0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34  ;.    switch( p4
4a00: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
4a10: 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20  se P4_REAL:.    
4a20: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
4a30: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44  .      case P4_D
4a40: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61  YNAMIC:.      ca
4a50: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
4a60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4a70: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
4a80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4aa0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
4ab0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
4ac0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4ad0: 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   ) sqlite3KeyInf
4ae0: 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a  oUnref((KeyInfo*
4af0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
4b00: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4b10: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
4b20: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  TF: {.        if
4b30: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4b40: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ed==0 ) sqlite3_
4b50: 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20  free(p4);.      
4b60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4b70: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46  .      case P4_F
4b80: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
4b90: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
4ba0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e  unction(db, (Fun
4bb0: 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20  cDef*)p4);.     
4bc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4bd0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
4be0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  MEM: {.        i
4bf0: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
4c00: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eed==0 ){.      
4c10: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
4c20: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
4c30: 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  lue*)p4);.      
4c40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4c50: 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d     Mem *p = (Mem
4c60: 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20  *)p4;.          
4c70: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
4c80: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
4c90: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
4ca0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4cb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
4cc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4cd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4ce0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
4cf0: 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 20  VTAB : {.       
4d00: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4d10: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4d20: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54  e3VtabUnlock((VT
4d30: 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20  able *)p4);.    
4d40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4d50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
4d60: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73  /*.** Free the s
4d70: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
4d80: 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70  or aOp and any p
4d90: 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74  4 values allocat
4da0: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70  ed for the.** op
4db0: 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  codes contained 
4dc0: 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69  within. If aOp i
4dd0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73  s not NULL it is
4de0: 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
4df0: 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72  ain .** nOp entr
4e00: 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ies. .*/.static 
4e10: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
4e20: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
4e30: 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e  , Op *aOp, int n
4e40: 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29  Op){.  if( aOp )
4e50: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  {.    Op *pOp;. 
4e60: 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20     for(pOp=aOp; 
4e70: 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70  pOp<&aOp[nOp]; p
4e80: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
4e90: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4ea0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
4eb0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4ec0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
4ed0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c  MMENTS.      sql
4ee0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4ef0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
4f00: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
4f10: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4f20: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
4f30: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
4f40: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
4f50: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
4f60: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
4f70: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
4f80: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
4f90: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
4fa0: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
4fb0: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
4fc0: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
4fd0: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
4fe0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
4ff0: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
5000: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
5010: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
5020: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
5030: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
5040: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
5050: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
5060: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
5070: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
5080: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
5090: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76  nto OP_Noop.*/.v
50a0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
50b0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
50c0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
50d0: 20 20 69 66 28 20 61 64 64 72 3c 70 2d 3e 6e 4f    if( addr<p->nO
50e0: 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20  p ){.    VdbeOp 
50f0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61  *pOp = &p->aOp[a
5100: 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  ddr];.    sqlite
5110: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
5120: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
5130: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
5140: 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d 73 65  p4.p);.    memse
5150: 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pOp, 0, sizeof
5160: 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 70  (pOp[0]));.    p
5170: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
5180: 4e 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 61 64  Noop;.    if( ad
5190: 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 20 29 20 70  dr==p->nOp-1 ) p
51a0: 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a  ->nOp--;.  }.}..
51b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73  /*.** If the las
51c0: 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22  t opcode is "op"
51d0: 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61   and it is not a
51e0: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
51f0: 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  n,.** then remov
5200: 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72  e it.  Return tr
5210: 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ue if and only i
5220: 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20  f an opcode was 
5230: 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
5240: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
5250: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62  ePriorOpcode(Vdb
5260: 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20  e *p, u8 op){.  
5270: 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28  if( (p->nOp-1)>(
5280: 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65  p->pParse->iFixe
5290: 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b 70  dOp) && p->aOp[p
52a0: 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d  ->nOp-1].opcode=
52b0: 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  =op ){.    sqlit
52c0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
52d0: 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b  op(p, p->nOp-1);
52e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
52f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
5300: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
5310: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
5320: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70  lue of the P4 op
5330: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
5340: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
5350: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
5360: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
5370: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
5380: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
5390: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
53a0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
53b0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
53c0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
53d0: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
53e0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
53f0: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
5400: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
5410: 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  4 operand is dyn
5420: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
5430: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
5440: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
5450: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
5460: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5470: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
5480: 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d  * A value of n==
5490: 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74  0 means copy byt
54a0: 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20  es of zP4 up to 
54b0: 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  and including th
54c0: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20  e.** first null 
54d0: 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68  byte.  If n>0 th
54e0: 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65  en copy n+1 byte
54f0: 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a  s of zP4..** .**
5500: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
5510: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
5520: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
5530: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
5540: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
5550: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
5560: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
5570: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
5580: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
5590: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
55a0: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
55b0: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
55c0: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
55d0: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
55e0: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
55f0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5600: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
5610: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
5620: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5630: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
5640: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
5650: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
5660: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
5670: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
5680: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
5690: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
56a0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
56b0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
56c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d  ;.  if( p->aOp==
56d0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
56e0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
56f0: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n!=P4_VTAB ){. 
5700: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
5710: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
5720: 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a  **)&zP4);.    }.
5730: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5740: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5750: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
5760: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
5770: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
5780: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
5790: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20   - 1;.  }.  pOp 
57a0: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
57b0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
57c0: 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53  p4type==P4_NOTUS
57d0: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  ED.       || pOp
57e0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
57f0: 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  32.       || pOp
5800: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59  ->p4type==P4_KEY
5810: 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65 50 34  INFO );.  freeP4
5820: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
5830: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
5840: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
5850: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
5860: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
5870: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
5880: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
5890: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
58a0: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
58b0: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
58c0: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
58d0: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
58e0: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
58f0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
5900: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5910: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
5920: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
5930: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5940: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
5950: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
5960: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
5970: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
5980: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5990: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
59a0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
59b0: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65  P4_KEYINFO;.  }e
59c0: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54  lse if( n==P4_VT
59d0: 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  AB ){.    pOp->p
59e0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
59f0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5a00: 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20  e = P4_VTAB;.   
5a10: 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b   sqlite3VtabLock
5a20: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b  ((VTable *)zP4);
5a30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 56  .    assert( ((V
5a40: 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62  Table *)zP4)->db
5a50: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c  ==p->db );.  }el
5a60: 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  se if( n<0 ){.  
5a70: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5a80: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5a90: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67  p->p4type = (sig
5aa0: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65  ned char)n;.  }e
5ab0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  lse{.    if( n==
5ac0: 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  0 ) n = sqlite3S
5ad0: 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20  trlen30(zP4);.  
5ae0: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71    pOp->p4.z = sq
5af0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
5b00: 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  ->db, zP4, n);. 
5b10: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5b20: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d   P4_DYNAMIC;.  }
5b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5b40: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
5b50: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
5b60: 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65  opcode to the Ke
5b70: 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a  yInfo for the.**
5b80: 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f   index given..*/
5b90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5ba0: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61  eSetP4KeyInfo(Pa
5bb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
5bc0: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62  ex *pIdx){.  Vdb
5bd0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5be0: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
5bf0: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
5c00: 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 73  ( pIdx!=0 );.  s
5c10: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5c20: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
5c30: 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f  )sqlite3KeyInfoO
5c40: 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
5c50: 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Idx),.          
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
5c70: 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64  EYINFO);.}..#ifd
5c80: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5c90: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
5ca0: 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  S./*.** Change t
5cb0: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
5cc0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
5cd0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
5ce0: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
5cf0: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
5d00: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
5d10: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
5d20: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
5d30: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
5d40: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
5d50: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
5d60: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
5d70: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
5d80: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
5d90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
5da0: 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  beVComment(Vdbe 
5db0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5dc0: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
5dd0: 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   ap){.  assert( 
5de0: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
5df0: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
5e00: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
5e10: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5e20: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
5e30: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5e40: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
5e50: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nOp ){.    asser
5e60: 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  t( p->aOp );.   
5e70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
5e80: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ->db, p->aOp[p->
5e90: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29  nOp-1].zComment)
5ea0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
5eb0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20  nOp-1].zComment 
5ec0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
5ed0: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
5ee0: 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  , ap);.  }.}.voi
5ef0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
5f00: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
5f10: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
5f20: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
5f30: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
5f40: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
5f50: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
5f60: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
5f70: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
5f80: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
5f90: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
5fa0: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
5fb0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
5fc0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
5fd0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
5fe0: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
5ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6000: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
6010: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
6020: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
6030: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
6040: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
6050: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
6060: 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e  }.}.#endif  /* N
6070: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
6080: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
6090: 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ERAGE./*.** Set 
60a0: 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65  the value if the
60b0: 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20   iSrcLine field 
60c0: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
60d0: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
60e0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
60f0: 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65  lite3VdbeSetLine
6100: 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20  Number(Vdbe *v, 
6110: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71  int iLine){.  sq
6120: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
6130: 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  ,-1)->iSrcLine =
6140: 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66   iLine;.}.#endif
6150: 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f   /* SQLITE_VDBE_
6160: 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a  COVERAGE */../*.
6170: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
6180: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
6190: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
61a0: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
61b0: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
61c0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
61d0: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
61e0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
61f0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
6200: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
6210: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
6220: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
6230: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
6240: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
6250: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
6260: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
6270: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
6280: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
6290: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
62a0: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
62b0: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
62c0: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
62d0: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
62e0: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
62f0: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
6300: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
6310: 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  fter an OOM faul
6320: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
6330: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
6340: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
6350: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
6360: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
6370: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
6380: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
6390: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
63a0: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
63b0: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
63c0: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
63d0: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
63e0: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
63f0: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
6400: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
6410: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
6420: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
6430: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
6440: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
6450: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
6460: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
6470: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
6480: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
6490: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
64a0: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
64b0: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
64c0: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
64d0: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
64e0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
64f0: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
6500: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
6510: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
6520: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
6530: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
6540: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
6550: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
6560: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
6570: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
6580: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
6590: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
65a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
65b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
65c0: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
65d0: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
65e0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
65f0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
6600: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
6610: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
6620: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
6630: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
6640: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
6650: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
6660: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
6670: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
6680: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
6690: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
66a0: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
66b0: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
66c0: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
66d0: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
66e0: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
66f0: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
6700: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
6710: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
6720: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
6730: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
6740: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
6750: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
6760: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
6770: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
6780: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
6790: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
67a0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
67b0: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
67c0: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
67d0: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
67e0: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
67f0: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
6800: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
6810: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
6820: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
6830: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
6840: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
6850: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
6860: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
6870: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
6880: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
6890: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
68a0: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
68b0: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
68c0: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
68d0: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
68e0: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
68f0: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
6900: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
6910: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
6920: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
6930: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
6940: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
6950: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
6960: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
6970: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
6980: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
6990: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
69a0: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
69b0: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
69c0: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
69d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
69e0: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
69f0: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
6a00: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
6a10: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
6a20: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
6a30: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
6a40: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
6a50: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
6a60: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
6a70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
6a80: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
6a90: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
6aa0: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
6ab0: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
6ac0: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
6ad0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
6ae0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
6af0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
6b00: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
6b10: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
6b20: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
6b30: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
6b40: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
6b50: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
6b60: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
6b70: 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e + 1;.    for(i
6b80: 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70  i=jj=0; jj<nTemp
6b90: 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f  -1 && (c = zSyno
6ba0: 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69  psis[ii])!=0; ii
6bb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  ++){.      if( c
6bc0: 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20  =='P' ){.       
6bd0: 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b   c = zSynopsis[+
6be0: 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii];.        if
6bf0: 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20  ( c=='4' ){.    
6c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6c10: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
6c20: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
6c30: 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d   zP4);.        }
6c40: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20  else if( c=='X' 
6c50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6c60: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6c70: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6c80: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
6c90: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  mment);.        
6ca0: 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20    seenCom = 1;. 
6cb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6cc0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d          int v1 =
6cd0: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70   translateP(c, p
6ce0: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Op);.          i
6cf0: 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20  nt v2;.         
6d00: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6d10: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
6d20: 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b  p+jj, "%d", v1);
6d30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
6d40: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
6d50: 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d  +ii+1, "@P", 2)=
6d60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6d70: 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20    ii += 3;.     
6d80: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
6d90: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
6da0: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20  mp+jj);.        
6db0: 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61      v2 = transla
6dc0: 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69  teP(zSynopsis[ii
6dd0: 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  ], pOp);.       
6de0: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
6df0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
6e00: 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "+1",2)==0 ){.  
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
6e20: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
6e30: 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20     v2++;.       
6e40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6e50: 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20     if( v2>1 ){. 
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
6e70: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6e80: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6e90: 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d  , "..%d", v1+v2-
6ea0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
6eb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
6ec0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
6ed0: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e  ynopsis+ii+1, ".
6ee0: 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70  .P3", 4)==0 && p
6ef0: 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20  Op->p3==0 ){.   
6f00: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34           ii += 4
6f10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6f30: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
6f40: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
6f50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6f60: 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b        zTemp[jj++
6f70: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = c;.      }. 
6f80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
6f90: 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d  enCom && jj<nTem
6fa0: 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d  p-5 && pOp->zCom
6fb0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ment ){.      sq
6fc0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6fd0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
6fe0: 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e  j, "; %s", pOp->
6ff0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
7000: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
7010: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
7020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7030: 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70  jj<nTemp ) zTemp
7040: 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  [jj] = 0;.  }els
7050: 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e if( pOp->zComm
7060: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
7070: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7080: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20  p, zTemp, "%s", 
7090: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
70a0: 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33      jj = sqlite3
70b0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
70c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
70d0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
70e0: 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  jj = 0;.  }.  re
70f0: 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69  turn jj;.}.#endi
7100: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
7110: 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65 66 69  G */...#if !defi
7120: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7130: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
7140: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
7150: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
7160: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
7170: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
7180: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
7190: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
71a0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
71b0: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
71c0: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
71d0: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
71e0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
71f0: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
7200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
7210: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
7220: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
7230: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
7240: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
7250: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
7260: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
7270: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
7280: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
7290: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
72a0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
72b0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
72c0: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
72d0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
72e0: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
72f0: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
7300: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7310: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7320: 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79  mp, "k(%d", pKey
7330: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
7340: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33       i = sqlite3
7350: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
7360: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
7370: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
7380: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
7390: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
73a0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
73b0: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
73c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
73d0: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
73e0: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b  ->zName : "nil";
73f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
7400: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7410: 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  (zColl);.       
7420: 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d   if( n==6 && mem
7430: 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52  cmp(zColl,"BINAR
7440: 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Y",6)==0 ){.    
7450: 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42        zColl = "B
7460: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  ";.          n =
7470: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7480: 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54        if( i+n>nT
7490: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
74a0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
74b0: 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20  [i],",...",4);. 
74c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
74d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
74e0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
74f0: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ,';.        if( 
7500: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
7510: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
7520: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
7530: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d  = '-';.        }
7540: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
7550: 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c  &zTemp[i], zColl
7560: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , n+1);.        
7570: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  i += n;.      }.
7580: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
7590: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
75a0: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
75b0: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
75c0: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
75d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
75e0: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
75f0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
7600: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
7610: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
7620: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7630: 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30  p, zTemp, "(%.20
7640: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
7650: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
7660: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7670: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
7680: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
7690: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
76a0: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
76b0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
76c0: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
76d0: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
76e0: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
76f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7700: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
7710: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7720: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7730: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
7740: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
7750: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7760: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7770: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
7780: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7790: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
77a0: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
77b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
77c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
77d0: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
77e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
77f0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
7800: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
7810: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
7820: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7830: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
7840: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
7850: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
7860: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
7870: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
7880: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
7890: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
78a0: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
78b0: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
78c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
78d0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
78e0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
78f0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
7900: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
7910: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
7920: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7930: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7940: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
7950: 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a  g", pMem->u.r);.
7960: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7970: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
7980: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  M_Null ){.      
7990: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
79a0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
79b0: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20   "NULL");.      
79c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
79d0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
79e0: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
79f0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
7a00: 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d  (blob)";.      }
7a10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7a20: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
7a30: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7a40: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34  ABLE.    case P4
7a50: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
7a60: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
7a70: 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
7a80: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
7a90: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7aa0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7ab0: 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56  "vtab:%p:%p", pV
7ac0: 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64  tab, pVtab->pMod
7ad0: 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ule);.      brea
7ae0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
7af0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
7b00: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
7b10: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7b20: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e  Temp, zTemp, "in
7b30: 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20  tarray");.      
7b40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7b50: 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47   case P4_SUBPROG
7b60: 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAM: {.      sql
7b70: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7b80: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f  emp, zTemp, "pro
7b90: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
7ba0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7bb0: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
7bc0: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
7bd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
7be0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
7bf0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
7c00: 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  4 = pOp->p4.z;. 
7c10: 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20       if( zP4==0 
7c20: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
7c30: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   zTemp;.        
7c40: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
7c50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7c60: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
7c70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
7c80: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
7c90: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
7ca0: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
7cb0: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
7cc0: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
7cd0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65  d..**.** The pre
7ce0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
7cf0: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e   need to know in
7d00: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d   advance the com
7d10: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20  plete set of.** 
7d20: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
7d30: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
7d40: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20  use.  A mask of 
7d50: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a  these databases.
7d60: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ** is maintained
7d70: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
7d80: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61  .  The p->lockMa
7d90: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  sk value is the 
7da0: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e  subset of.** p->
7db0: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74  btreeMask of dat
7dc0: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
7dd0: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e   require a lock.
7de0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7df0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
7e00: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
7e10: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
7e20: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
7e30: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
7e40: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
7e50: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
7e60: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
7e70: 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b  k)*8 );.  DbMask
7e80: 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  Set(p->btreeMask
7e90: 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31  , i);.  if( i!=1
7ea0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
7eb0: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
7ec0: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
7ed0: 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e     DbMaskSet(p->
7ee0: 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  lockMask, i);.  
7ef0: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
7f00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
7f10: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
7f20: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
7f30: 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  >0./*.** If SQLi
7f40: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
7f50: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
7f60: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
7f70: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
7f80: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
7f90: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
7fa0: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
7fb0: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
7fc0: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
7fd0: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
7fe0: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
7ff0: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
8000: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
8010: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
8020: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
8030: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
8040: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
8050: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
8060: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
8070: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
8080: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
8090: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
80a0: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
80b0: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
80c0: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
80d0: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
80e0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
80f0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
8100: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
8110: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
8120: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
8130: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
8140: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
8150: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
8160: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
8170: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
8180: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
8190: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
81a0: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
81b0: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
81c0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
81d0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
81e0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
81f0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
8200: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
8210: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
8220: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
8230: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
8240: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
8250: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
8260: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
8270: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
8280: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
8290: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
82a0: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
82b0: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
82c0: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
82d0: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
82e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
82f0: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
8300: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
8310: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
8320: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
8330: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
8340: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
8350: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
8360: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
8370: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
8380: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
8390: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
83a0: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
83b0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
83c0: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
83d0: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
83e0: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
83f0: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
8400: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
8410: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
8420: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
8430: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
8440: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
8450: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8460: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
8470: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
8480: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
8490: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
84a0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
84b0: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
84c0: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
84d0: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
84e0: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
84f0: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
8500: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8510: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
8520: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8530: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
8540: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
8550: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
8560: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
8570: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
8580: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
8590: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
85a0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
85b0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
85c0: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
85d0: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
85e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
85f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8600: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
8610: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
8620: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
8630: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
8640: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8650: 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74  Leave(aDb[i].pBt
8660: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
8670: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
8680: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
8690: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
86a0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
86b0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
86c0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
86d0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
86e0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
86f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8700: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
8710: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
8720: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
8730: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
8740: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a  tr[50];.  char z
8750: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74  Com[100];.  stat
8760: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
8770: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
8780: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
8790: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e   %-13s %.2X %s\n
87a0: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
87b0: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
87c0: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
87d0: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
87e0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69  izeof(zPtr));.#i
87f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8800: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
8810: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d  NTS.  displayCom
8820: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a  ment(pOp, zP4, z
8830: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d  Com, sizeof(zCom
8840: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d  ));.#else.  zCom
8850: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
8860: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
8870: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
8880: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
8890: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
88a0: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
88b0: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
88c0: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
88d0: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
88e0: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
88f0: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
8900: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
8910: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
8920: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
8930: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
8940: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
8950: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
8960: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
8970: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
8980: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
8990: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
89a0: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
89b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
89c0: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
89d0: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
89e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
89f0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
8a00: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
8a10: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
8a20: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20      Mem *pEnd = 
8a30: 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74  &p[N];.    sqlit
8a40: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
8a50: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
8a60: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
8a70: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
8a80: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
8a90: 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  d ){.      do{. 
8aa0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a         if( p->sz
8ab0: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
8ac0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
8ad0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77  alloc);.      }w
8ae0: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
8af0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
8b00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
8b10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
8b20: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
8b30: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
8b40: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8b50: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
8b60: 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70  kMemInvariants(p
8b70: 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ) );..      /* T
8b80: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
8b90: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
8ba0: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
8bb0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
8bc0: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
8bd0: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
8be0: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
8bf0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
8c00: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
8c10: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
8c20: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
8c30: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
8c40: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
8c50: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
8c60: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
8c70: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
8c80: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
8c90: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
8ca0: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
8cb0: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
8cc0: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
8cd0: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
8ce0: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
8cf0: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
8d00: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
8d10: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
8d20: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
8d30: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
8d40: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
8d50: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
8d60: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
8d70: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
8d80: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
8d90: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
8da0: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
8db0: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
8dc0: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
8dd0: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
8de0: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
8df0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
8e00: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
8e10: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
8e20: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
8e30: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
8e40: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
8e50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
8e60: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67  >flags & MEM_Agg
8e70: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8e80: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
8e90: 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20  EM_Dyn );.      
8ea0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
8eb0: 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29  gs & MEM_Frame )
8ec0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8ed0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
8ee0: 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20  _RowSet );.     
8ef0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
8f00: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d  EM_Agg|MEM_Dyn|M
8f10: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77  EM_Frame|MEM_Row
8f20: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Set) ){.        
8f30: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
8f40: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
8f50: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d  }else if( p->szM
8f60: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
8f70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8f80: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
8f90: 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c          p->szMal
8fa0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  loc = 0;.      }
8fb0: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ..      p->flags
8fc0: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
8fd0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b  ;.    }while( (+
8fe0: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
8ff0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9000: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
9010: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
9020: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
9030: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
9040: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
9050: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
9060: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
9070: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
9080: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
9090: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
90a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
90b0: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
90c0: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
90d0: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
90e0: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
90f0: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
9100: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
9110: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
9120: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
9130: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
9140: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
9150: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
9160: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
9170: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
9180: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
9190: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
91a0: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
91b0: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
91c0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
91d0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
91e0: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
91f0: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
9200: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
9210: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
9220: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
9230: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
9240: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
9250: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
9260: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
9270: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
9280: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
9290: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
92a0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
92b0: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
92c0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
92d0: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
92e0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
92f0: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
9300: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
9310: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
9320: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
9330: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
9340: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
9350: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
9360: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
9370: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
9380: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
9390: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
93a0: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
93b0: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a  UERY PLAN..**.**
93c0: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
93d0: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
93e0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
93f0: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
9400: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
9410: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
9420: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
9430: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
9440: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
9450: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
9460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9470: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
9480: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94a0: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
94b0: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
94c0: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
94d0: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
9500: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
9510: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
9520: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9540: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
9550: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
9560: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9580: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
9590: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
95a0: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
95b0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
95d0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
95e0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
95f0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9620: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
9630: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9650: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
9660: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
9670: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
9680: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
9690: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
96a0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
96b0: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
96c0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
96d0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
96e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
96f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
9700: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
9710: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
9720: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
9730: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
9740: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
9750: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
9760: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
9770: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
9780: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
9790: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
97a0: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
97b0: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
97c0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
97d0: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
97e0: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
97f0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
9800: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
9810: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
9820: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
9830: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9840: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
9850: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
9860: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
9870: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
9880: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9890: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
98a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
98b0: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
98c0: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
98d0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
98e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
98f0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
9900: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
9910: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
9920: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
9930: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
9940: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
9950: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
9960: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
9970: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
9980: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
9990: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
99a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
99b0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
99c0: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
99d0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
99e0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
99f0: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
9a00: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
9a10: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
9a20: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
9a30: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
9a40: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
9a50: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
9a60: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
9a70: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
9a80: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
9a90: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
9aa0: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
9ab0: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
9ac0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
9ad0: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
9ae0: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
9af0: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
9b00: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
9b10: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
9b20: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
9b30: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
9b40: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
9b50: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
9b60: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
9b70: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
9b80: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
9b90: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
9ba0: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
9bb0: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
9bc0: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
9bd0: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
9be0: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
9bf0: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
9c00: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
9c10: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
9c20: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
9c30: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
9c40: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
9c50: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
9c60: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
9c70: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
9c80: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
9c90: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
9ca0: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
9cb0: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
9cc0: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
9cd0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
9ce0: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
9cf0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
9d00: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
9d10: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
9d20: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
9d30: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
9d40: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
9d50: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
9d60: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
9d70: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
9d80: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
9d90: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
9da0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
9db0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
9dc0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
9dd0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
9de0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
9df0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
9e00: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
9e10: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
9e20: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
9e30: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
9e40: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
9e50: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
9e60: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
9e70: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
9e80: 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  zP4;.    Op *pOp
9e90: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  ;.    if( i<p->n
9ea0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
9eb0: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
9ec0: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
9ed0: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
9ee0: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
9ef0: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
9f00: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
9f10: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
9f20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9f30: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
9f40: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
9f50: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
9f60: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
9f70: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
9f80: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
9f90: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
9fa0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
9fb0: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
9fc0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
9fd0: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
9fe0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
9ff0: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
a000: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
a010: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
a020: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
a030: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
a040: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
a050: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a060: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
a070: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
a0a0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
a0b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
a0c0: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
a0d0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
a0e0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
a0f0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  m;.      pMem->z
a100: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
a110: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
a120: 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63  >opcode); /* Opc
a130: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ode */.      ass
a140: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
a150: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
a160: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a170: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
a180: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
a190: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
a1a0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
a1b0: 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50   /* When an OP_P
a1c0: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73  rogram opcode is
a1d0: 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20   encounter (the 
a1e0: 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74  only opcode that
a1f0: 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20   has.      ** a 
a200: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72  P4_SUBPROGRAM ar
a210: 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20  gument), expand 
a220: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a230: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
a240: 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65  rams.      ** ke
a250: 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d  pt in p->aMem[9]
a260: 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  .z to hold the n
a270: 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73  ew program - ass
a280: 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72  uming this subpr
a290: 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68  ogram.      ** h
a2a0: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
a2b0: 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20  een seen..      
a2c0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  */.      if( pOp
a2d0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
a2e0: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
a2f0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
a300: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
a310: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
a320: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
a330: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
a340: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
a350: 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a       if( apSub[j
a360: 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  ]==pOp->p4.pProg
a370: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
a380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a390: 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51  f( j==nSub && SQ
a3a0: 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33  LITE_OK==sqlite3
a3b0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62  VdbeMemGrow(pSub
a3c0: 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30  , nByte, nSub!=0
a3d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
a3e0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
a3f0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
a400: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
a410: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
a420: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
a430: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
a440: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
a450: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
a460: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
a470: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
a480: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a490: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
a4a0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
a4b0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
a4c0: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4e0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
a4f0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
a500: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
a510: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
a520: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
a550: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
a560: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a570: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
a580: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
a5b0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
a5c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
a5d0: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
a5e0: 7a 65 28 70 4d 65 6d 2c 20 33 32 29 20 29 7b 20  ze(pMem, 32) ){ 
a5f0: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
a600: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
a610: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
a620: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a630: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
a640: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
a650: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
a660: 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73  m;.    zP4 = dis
a670: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
a680: 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66  ->z, 32);.    if
a690: 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29  ( zP4!=pMem->z )
a6a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a6b0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
a6c0: 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49  m, zP4, -1, SQLI
a6d0: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20  TE_UTF8, 0);.   
a6e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
a6f0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
a700: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
a710: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
a720: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
a730: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
a740: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
a750: 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a   }.    pMem++;..
a760: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
a770: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
a780: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
a790: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
a7a0: 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20  pMem, 4) ){.    
a7b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
a7c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a7d0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
a7e0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
a7f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
a800: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a810: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
a820: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b      pMem->n = 2;
a830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a840: 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d  nprintf(3, pMem-
a850: 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  >z, "%.2x", pOp-
a860: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
a870: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
a880: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
a890: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
a8a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a8b0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
a8c0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28  MMENTS.      if(
a8d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
a8e0: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
a8f0: 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20  em, 500) ){.    
a900: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
a910: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a920: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
a930: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
a940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
a950: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a960: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
a970: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69      pMem->n = di
a980: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
a990: 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  , zP4, pMem->z, 
a9a0: 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  500);.      pMem
a9b0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
a9c0: 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  TF8;.#else.     
a9d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a9e0: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa00: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e  * Comment */.#en
aa10: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  dif.    }..    p
aa20: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
aa30: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
aa40: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73  -1);.    p->pRes
aa50: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
aa60: 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  m[1];.    p->rc 
aa70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
aa80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
aa90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
aaa0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
aab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
aac0: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
aad0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
aae0: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
aaf0: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
ab00: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
ab10: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
ab20: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
ab30: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
ab40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
ab50: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71   0;.  if( p->zSq
ab60: 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e  l ){.    z = p->
ab70: 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  zSql;.  }else if
ab80: 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20  ( p->nOp>=1 ){. 
ab90: 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20     const VdbeOp 
aba0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30  *pOp = &p->aOp[0
abb0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ];.    if( pOp->
abc0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
abd0: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
abe0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70  ){.      z = pOp
abf0: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68  ->p4.z;.      wh
ac00: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
ac10: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
ac20: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
ac30: 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20   ) printf("SQL: 
ac40: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23  [%s]\n", z);.}.#
ac50: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
ac60: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ac70: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
ac80: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
ac90: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
aca0: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
acb0: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
acc0: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
acd0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
ace0: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
acf0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
ad00: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
ad10: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
ad20: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
ad30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
ad40: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
ad50: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
ad60: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
ad70: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
ad80: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
ad90: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
ada0: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
adb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
adc0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
add0: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
ade0: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
adf0: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
ae00: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
ae10: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
ae20: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
ae30: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
ae40: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
ae50: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
ae60: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
ae70: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
ae80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ae90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
aea0: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
aeb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
aec0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
aed0: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
aee0: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
aef0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
af00: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
af10: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
af20: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  IOTRACE */../*.*
af30: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
af40: 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69   from a fixed si
af50: 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65  ze buffer and re
af60: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
af70: 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e  o.** that space.
af80: 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e    If insufficien
af90: 74 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  t space is avail
afa0: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  able, return NUL
afb0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75  L..**.** The pBu
afc0: 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  f parameter is t
afd0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
afe0: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68   of a pointer wh
aff0: 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65  ich will.** rece
b000: 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f  ive the new memo
b010: 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72  ry.  pBuf is nor
b020: 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20  mally NULL.  If 
b030: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
b040: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
b050: 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  at memory space 
b060: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
b070: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
b080: 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hat.** this rout
b090: 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61  ine should not a
b0a0: 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20  llocate any new 
b0b0: 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42  memory.  When pB
b0c0: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
b0d0: 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  L simply return 
b0e0: 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f  pBuf.  Only allo
b0f0: 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20  cate new memory 
b100: 73 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a  space when pBuf.
b110: 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ** is NULL..**.*
b120: 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e  * nByte is the n
b130: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
b140: 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a  f space needed..
b150: 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f  **.** *ppFrom po
b160: 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c  ints to availabl
b170: 65 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64  e space and pEnd
b180: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65   points to the e
b190: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61  nd of the.** ava
b1a0: 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57  ilable space.  W
b1b0: 68 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c  hen space is all
b1c0: 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20  ocated, *ppFrom 
b1d0: 69 73 20 61 64 76 61 6e 63 65 64 20 70 61 73 74  is advanced past
b1e0: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
b1f0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  he allocated spa
b200: 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74  ce..**.** *pnByt
b210: 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f  e is a counter o
b220: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
b230: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  bytes of space t
b240: 68 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a  hat have failed.
b250: 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20  ** to allocate. 
b260: 20 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73   If there is ins
b270: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
b280: 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61  in *ppFrom to sa
b290: 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71  tisfy the.** req
b2a0: 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65  uest, then incre
b2b0: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20  ment *pnByte by 
b2c0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
b2d0: 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74  e request..*/.st
b2e0: 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63  atic void *alloc
b2f0: 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70  Space(.  void *p
b300: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Buf,          /*
b310: 20 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f   Where return po
b320: 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74  inter will be st
b330: 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ored */.  int nB
b340: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  yte,           /
b350: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
b360: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
b370: 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20  .  u8 **ppFrom, 
b380: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
b390: 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d  T: Allocate from
b3a0: 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38   *ppFrom */.  u8
b3b0: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
b3c0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
b3d0: 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65   1 byte past the
b3e0: 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20   end of *ppFrom 
b3f0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
b400: 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  *pnByte         
b410: 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f   /* If allocatio
b420: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65  n cannot be made
b430: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  , increment *pnB
b440: 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  yte */.){.  asse
b450: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
b460: 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d  LIGNMENT(*ppFrom
b470: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20  ) );.  if( pBuf 
b480: 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20  ) return pBuf;. 
b490: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
b4a0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28  nByte);.  if( &(
b4b0: 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20  *ppFrom)[nByte] 
b4c0: 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70  <= pEnd ){.    p
b4d0: 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70  Buf = (void*)*pp
b4e0: 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f  From;.    *ppFro
b4f0: 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65  m += nByte;.  }e
b500: 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65  lse{.    *pnByte
b510: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20   += nByte;.  }. 
b520: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a   return pBuf;.}.
b530: 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68  ./*.** Rewind th
b540: 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74  e VDBE back to t
b550: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20  he beginning in 
b560: 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a  preparation for.
b570: 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a  ** running it..*
b580: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b590: 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70  beRewind(Vdbe *p
b5a0: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
b5b0: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
b5c0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
b5d0: 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23  FILE).  int i;.#
b5e0: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
b5f0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
b600: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
b610: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
b620: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
b630: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
b640: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
b650: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
b660: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
b670: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
b680: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
b690: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
b6a0: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
b6b0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
b6c0: 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  RUN;..#ifdef SQL
b6d0: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
b6e0: 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=1; i<p->nMem; 
b6f0: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
b700: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d  ( p->aMem[i].db=
b710: 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65  =p->db );.  }.#e
b720: 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  ndif.  p->pc = -
b730: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
b740: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72  ITE_OK;.  p->err
b750: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
b760: 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ort;.  p->magic 
b770: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
b780: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
b790: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
b7a0: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
b7b0: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
b7c0: 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74   255;.  p->iStat
b7d0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ement = 0;.  p->
b7e0: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  nFkConstraint = 
b7f0: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
b800: 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30  ROFILE.  for(i=0
b810: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
b820: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  {.    p->aOp[i].
b830: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  cnt = 0;.    p->
b840: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
b850: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
b860: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
b870: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
b880: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66   for execution f
b890: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
b8a0: 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74  e after.** creat
b8b0: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20  ing the virtual 
b8c0: 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69  machine.  This i
b8d0: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
b8e0: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
b8f0: 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61  ting registers a
b900: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
b910: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
b920: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
b930: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
b940: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
b950: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
b960: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
b970: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
b980: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
b990: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
b9a0: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
b9b0: 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68  tly once on each
b9c0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
b9d0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
b9e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b9f0: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
ba00: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
ba10: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
ba20: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
ba30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ba40: 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c  ed, further call
ba50: 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s to .** sqlite3
ba60: 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63  VdbeAddOp() func
ba70: 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62  tions are prohib
ba80: 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ited.  This rout
ba90: 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a  ine disconnects.
baa0: 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ** the Vdbe from
bab0: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
bac0: 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65  t that helped ge
bad0: 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61  nerate it so tha
bae0: 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62  t the.** the Vdb
baf0: 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64  e becomes an ind
bb00: 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20  ependent entity 
bb10: 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62  and the Parse ob
bb20: 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64  ject can be.** d
bb30: 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
bb40: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56  Use the sqlite3V
bb50: 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63  dbeRewind() proc
bb60: 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65  edure to restore
bb70: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
bb80: 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74  ne back.** to it
bb90: 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20  s initial state 
bba0: 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65  after it has bee
bbb0: 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  n run..*/.void s
bbc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
bbd0: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
bc00: 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  E */.  Parse *pP
bc10: 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20  arse            
bc20: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
bc30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
bc40: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
bc70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
bc80: 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20  int nVar;       
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bca0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  * Number of para
bcb0: 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  meters */.  int 
bcc0: 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
bcd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bce0: 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72  mber of VM memor
bcf0: 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  y registers */. 
bd00: 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20   int nCursor;   
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
bd30: 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f  sors required */
bd40: 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
bd70: 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70  rguments in subp
bd80: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
bd90: 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20   nOnce;         
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bdb0: 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65  umber of OP_Once
bdc0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f   instructions */
bdd0: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
be00: 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b  r */.  u8 *zCsr;
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
be30: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
be40: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  location */.  u8
be50: 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *zEnd;         
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
be70: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
be80: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
be90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68       /* How much
bec0: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73   extra memory is
bed0: 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73   needed */..  as
bee0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
bef0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
bf00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
bf10: 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
bf20: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
bf30: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
bf40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
bf50: 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b  se==p->pParse );
bf60: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
bf70: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
bf80: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a  locFailed==0 );.
bf90: 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d    nVar = pParse-
bfa0: 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20  >nVar;.  nMem = 
bfb0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
bfc0: 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  nCursor = pParse
bfd0: 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d  ->nTab;.  nArg =
bfe0: 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67   pParse->nMaxArg
bff0: 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72  ;.  nOnce = pPar
c000: 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28  se->nOnce;.  if(
c010: 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63   nOnce==0 ) nOnc
c020: 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65  e = 1; /* Ensure
c030: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79   at least one by
c040: 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c  te in p->aOnceFl
c050: 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  ag[] */.  .  /* 
c060: 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20  For each cursor 
c070: 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61  required, also a
c080: 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79  llocate a memory
c090: 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20   cell. Memory.  
c0a0: 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31  ** cells (nMem+1
c0b0: 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c  -nCursor)..nMem,
c0c0: 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c   inclusive, will
c0d0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62   never be used b
c0e0: 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20  y.  ** the vdbe 
c0f0: 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64  program. Instead
c100: 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74   they are used t
c110: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
c120: 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75   for.  ** VdbeCu
c130: 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74  rsor/BtCursor st
c140: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c  ructures. The bl
c150: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
c160: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20  ociated with .  
c170: 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73  ** cursor 0 is s
c180: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
c190: 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72  cell nMem. Memor
c1a0: 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a  y cell (nMem-1).
c1b0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
c1c0: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
c1d0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
c1e0: 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20  ursor 1, etc..  
c1f0: 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
c200: 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  : allocateCursor
c210: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20  ()..  */.  nMem 
c220: 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f  += nCursor;..  /
c230: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
c240: 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69   for memory regi
c250: 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61  sters, SQL varia
c260: 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f  bles, VDBE curso
c270: 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20  rs and .  ** an 
c280: 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c  array to marshal
c290: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72   SQL function ar
c2a0: 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f  guments in..  */
c2b0: 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26  .  zCsr = (u8*)&
c2c0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20  p->aOp[p->nOp]; 
c2d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
c2e0: 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66  mory avaliable f
c2f0: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
c300: 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26  .  zEnd = (u8*)&
c310: 70 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e  p->aOp[pParse->n
c320: 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69  OpAlloc];  /* Fi
c330: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 65 6e  rst byte past en
c340: 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a  d of zCsr[] */..
c350: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
c360: 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70  s(p, &nArg);.  p
c370: 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
c380: 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d  l = (u8)(pParse-
c390: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26  >isMultiWrite &&
c3a0: 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72   pParse->mayAbor
c3b0: 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  t);.  if( pParse
c3c0: 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65  ->explain && nMe
c3d0: 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d  m<10 ){.    nMem
c3e0: 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d   = 10;.  }.  mem
c3f0: 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e  set(zCsr, 0, zEn
c400: 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72 20  d-zCsr);.  zCsr 
c410: 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29  += (zCsr - (u8*)
c420: 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28 20  0)&7;.  assert( 
c430: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
c440: 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20  MENT(zCsr) );.  
c450: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
c460: 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72  .  /* Memory for
c470: 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61   registers, para
c480: 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20  meters, cursor, 
c490: 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65  etc, is allocate
c4a0: 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61  d in two.  ** pa
c4b0: 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69  sses.  On the fi
c4c0: 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79  rst pass, we try
c4d0: 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64   to reuse unused
c4e0: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20   space at the . 
c4f0: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f   ** end of the o
c500: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66  pcode array.  If
c510: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
c520: 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65  o satisfy all me
c530: 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72  mory.  ** requir
c540: 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e  ements by reusin
c550: 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  g the opcode arr
c560: 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68  ay tail, then th
c570: 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61  e second.  ** pa
c580: 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20  ss will fill in 
c590: 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61  the rest using a
c5a0: 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f   fresh allocatio
c5b0: 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
c5c0: 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70  his two-pass app
c5d0: 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65  roach that reuse
c5e0: 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  s as much memory
c5f0: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
c600: 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f  m.  ** the lefto
c610: 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65  ver space at the
c620: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
c630: 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67  de array can sig
c640: 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
c650: 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e  reduce the amoun
c660: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64  t of memory held
c670: 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73   by a prepared s
c680: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
c690: 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20   do {.    nByte 
c6a0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  = 0;.    p->aMem
c6b0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
c6c0: 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65  >aMem, nMem*size
c6d0: 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20  of(Mem), &zCsr, 
c6e0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
c6f0: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c     p->aVar = all
c700: 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c  ocSpace(p->aVar,
c710: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
c720: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
c730: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
c740: 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61  apArg = allocSpa
c750: 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  ce(p->apArg, nAr
c760: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20  g*sizeof(Mem*), 
c770: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
c780: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56  yte);.    p->azV
c790: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
c7a0: 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73  p->azVar, nVar*s
c7b0: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a  izeof(char*), &z
c7c0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
c7d0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72  e);.    p->apCsr
c7e0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
c7f0: 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a  >apCsr, nCursor*
c800: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
c810: 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r*),.           
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
c830: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
c840: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63  te);.    p->aOnc
c850: 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61  eFlag = allocSpa
c860: 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c  ce(p->aOnceFlag,
c870: 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a   nOnce, &zCsr, z
c880: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
c890: 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
c8a0: 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20       p->pFree = 
c8b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
c8c0: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
c8d0: 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d      }.    zCsr =
c8e0: 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a   p->pFree;.    z
c8f0: 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74  End = &zCsr[nByt
c900: 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42  e];.  }while( nB
c910: 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  yte && !db->mall
c920: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70  ocFailed );..  p
c930: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72  ->nCursor = nCur
c940: 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46  sor;.  p->nOnceF
c950: 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69  lag = nOnce;.  i
c960: 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20  f( p->aVar ){.  
c970: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56    p->nVar = (ynV
c980: 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72  ar)nVar;.    for
c990: 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b  (n=0; n<nVar; n+
c9a0: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  +){.      p->aVa
c9b0: 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  r[n].flags = MEM
c9c0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  _Null;.      p->
c9d0: 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aVar[n].db = db;
c9e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c9f0: 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20   p->azVar ){.   
ca00: 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72   p->nzVar = pPar
ca10: 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d  se->nzVar;.    m
ca20: 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20  emcpy(p->azVar, 
ca30: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70  pParse->azVar, p
ca40: 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70  ->nzVar*sizeof(p
ca50: 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20  ->azVar[0]));.  
ca60: 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d    memset(pParse-
ca70: 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73  >azVar, 0, pPars
ca80: 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28  e->nzVar*sizeof(
ca90: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d  pParse->azVar[0]
caa0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
cab0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e  >aMem ){.    p->
cac0: 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20  aMem--;         
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cae0: 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d  aMem[] goes from
caf0: 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20   1..nMem */.    
cb00: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20  p->nMem = nMem; 
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f  /*       not fro
cb30: 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20  m 0..nMem-1 */. 
cb40: 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e     for(n=1; n<=n
cb50: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Mem; n++){.     
cb60: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67   p->aMem[n].flag
cb70: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
cb80: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  d;.      p->aMem
cb90: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
cba0: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c   }.  }.  p->expl
cbb0: 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78  ain = pParse->ex
cbc0: 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  plain;.  sqlite3
cbd0: 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
cbe0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
cbf0: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
cc00: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
cc10: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
cc20: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
cc30: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
cc40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
cc50: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
cc60: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
cc70: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
cc80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
cc90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
cca0: 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e  eSorterClose(p->
ccb0: 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20  db, pCx);.  if( 
ccc0: 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pCx->pBt ){.    
ccd0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
cce0: 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pCx->pBt);.   
ccf0: 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75   /* The pCx->pCu
cd00: 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f  rsor will be clo
cd10: 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  se automatically
cd20: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20  , if it exists, 
cd30: 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  by.    ** the ca
cd40: 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d  ll above. */.  }
cd50: 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43  else if( pCx->pC
cd60: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
cd70: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
cd80: 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f  rsor(pCx->pCurso
cd90: 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  r);.  }.#ifndef 
cda0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
cdb0: 55 41 4c 54 41 42 4c 45 0a 20 20 65 6c 73 65 20  UALTABLE.  else 
cdc0: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
cdd0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
cde0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
cdf0: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
ce00: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
ce10: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
ce20: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
ce30: 6c 65 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72  le = pVtabCursor
ce40: 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
ce50: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
ce60: 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70  ethod = 1;.    p
ce70: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
ce80: 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20  VtabCursor);.   
ce90: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
cea0: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
ceb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
cec0: 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
ced0: 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
cee0: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
cef0: 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
cf00: 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
cf10: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
cf20: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
cf30: 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
cf40: 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
cf50: 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
cf60: 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
cf70: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
cf80: 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
cf90: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
cfa0: 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
cfb0: 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20  .  v->aOnceFlag 
cfc0: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46  = pFrame->aOnceF
cfd0: 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46  lag;.  v->nOnceF
cfe0: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  lag = pFrame->nO
cff0: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f  nceFlag;.  v->aO
d000: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b  p = pFrame->aOp;
d010: 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61  .  v->nOp = pFra
d020: 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d  me->nOp;.  v->aM
d030: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65  em = pFrame->aMe
d040: 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70  m;.  v->nMem = p
d050: 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76  Frame->nMem;.  v
d060: 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65  ->apCsr = pFrame
d070: 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43  ->apCsr;.  v->nC
d080: 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e  ursor = pFrame->
d090: 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62  nCursor;.  v->db
d0a0: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46  ->lastRowid = pF
d0b0: 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  rame->lastRowid;
d0c0: 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  v->nChange = 
d0d0: 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b  pFrame->nChange;
d0e0: 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67  .  v->db->nChang
d0f0: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43  e = pFrame->nDbC
d100: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
d110: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
d120: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
d130: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
d140: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
d150: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
d160: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
d170: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
d180: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
d190: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
d1a0: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
d1b0: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
d1c0: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
d1d0: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
d1e0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
d1f0: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
d200: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
d210: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
d220: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
d230: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
d240: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
d250: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
d260: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
d270: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
d280: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
d290: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
d2a0: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
d2b0: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
d2c0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
d2d0: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
d2e0: 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d  .    p->pFrame =
d2f0: 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d   0;.    p->nFram
d300: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
d310: 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d  ert( p->nFrame==
d320: 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61  0 );..  if( p->a
d330: 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  pCsr ){.    int 
d340: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
d350: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
d360: 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75  +){.      VdbeCu
d370: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
d380: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Csr[i];.      if
d390: 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pC ){.        
d3a0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
d3b0: 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20  ursor(p, pC);.  
d3c0: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69        p->apCsr[i
d3d0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
d3e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
d3f0: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  ->aMem ){.    re
d400: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70  leaseMemArray(&p
d410: 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d  ->aMem[1], p->nM
d420: 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  em);.  }.  while
d430: 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29  ( p->pDelFrame )
d440: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
d450: 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46  *pDel = p->pDelF
d460: 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65  rame;.    p->pDe
d470: 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70  lFrame = pDel->p
d480: 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
d490: 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
d4a0: 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20  te(pDel);.  }.. 
d4b0: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61   /* Delete any a
d4c0: 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f  uxdata allocatio
d4d0: 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 56  ns made by the V
d4e0: 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41  M */.  if( p->pA
d4f0: 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65 33  uxData ) sqlite3
d500: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
d510: 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61  a(p, -1, 0);.  a
d520: 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61  ssert( p->pAuxDa
d530: 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ta==0 );.}../*.*
d540: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
d550: 4d 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  M after a single
d560: 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   run..*/.static 
d570: 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62  void Cleanup(Vdb
d580: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
d590: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23   *db = p->db;..#
d5a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
d5b0: 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  UG.  /* Execute 
d5c0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
d5d0: 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
d5e0: 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73  at the Vdbe.apCs
d5f0: 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64  r[] and .  ** Vd
d600: 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73  be.aMem[] arrays
d610: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
d620: 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20  en cleaned up.  
d630: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  */.  int i;.  if
d640: 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72  ( p->apCsr ) for
d650: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
d660: 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  or; i++) assert(
d670: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20   p->apCsr[i]==0 
d680: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
d690: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
d6a0: 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b   i<=p->nMem; i++
d6b0: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65  ) assert( p->aMe
d6c0: 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  m[i].flags==MEM_
d6d0: 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d  Undefined );.  }
d6e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
d6f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
d700: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
d710: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
d720: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
d730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
d740: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
d750: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
d760: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
d770: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
d780: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
d790: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
d7a0: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
d7b0: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
d7c0: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
d7d0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
d7e0: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
d7f0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
d800: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
d810: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
d820: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
d830: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
d840: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
d850: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
d860: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
d870: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
d880: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  me;.  int n;.  s
d890: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
d8a0: 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65  db;..  releaseMe
d8b0: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
d8c0: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
d8d0: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
d8e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d8f0: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
d900: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
d910: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
d920: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75  >nResColumn = (u
d930: 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20  16)nResColumn;. 
d940: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70   p->aColName = p
d950: 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
d960: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
d970: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d  ero(db, sizeof(M
d980: 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70  em)*n );.  if( p
d990: 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20  ->aColName==0 ) 
d9a0: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
d9b0: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
d9c0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
d9d0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
d9e0: 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70  pColName->db = p
d9f0: 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  ->db;.    pColNa
da00: 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  me++;.  }.}../*.
da10: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
da20: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
da30: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
da40: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
da50: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
da60: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
da70: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
da80: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
da90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
daa0: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
dab0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
dac0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
dad0: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
dae0: 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
daf0: 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
db00: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
db10: 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
db20: 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
db30: 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
db40: 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
db50: 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
db60: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
db70: 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
db80: 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
db90: 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
dba0: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
dbb0: 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
dbc0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
dbd0: 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
dbe0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
dbf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
dc00: 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
dc10: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
dc20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dc30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
dc40: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
dc50: 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
dc60: 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
dc90: 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
dca0: 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
dcb0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
dcd0: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
dce0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
dcf0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
dd00: 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
dd10: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
dd20: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
dd30: 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
dd40: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
dd50: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
dd60: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
dd70: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
dd80: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
dd90: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
dda0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
ddb0: 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
ddc0: 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
ddd0: 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
dde0: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
ddf0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
de00: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
de10: 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
de20: 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
de30: 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
de40: 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
de50: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
de60: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
de70: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
de80: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
de90: 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
dea0: 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
deb0: 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
dec0: 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
ded0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
dee0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
def0: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
df00: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
df10: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
df20: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
df30: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
df40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
df50: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
df60: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
df70: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
df80: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
df90: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
dfa0: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
dfb0: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
dfc0: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
dfd0: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
dfe0: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
dff0: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
e000: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
e010: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
e020: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
e030: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
e040: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
e050: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
e060: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
e070: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e080: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
e090: 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
e0a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
e0b0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
e0c0: 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
e0d0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
e0e0: 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
e0f0: 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
e100: 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
e110: 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
e120: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
e130: 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
e140: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
e150: 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
e160: 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
e170: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
e180: 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
e190: 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
e1a0: 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
e1b0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
e1c0: 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
e1d0: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
e1e0: 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
e1f0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
e200: 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
e210: 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
e220: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
e230: 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
e240: 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
e250: 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
e260: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
e270: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
e280: 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a  nc(db, p);..  /*
e290: 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
e2a0: 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
e2b0: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
e2c0: 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
e2d0: 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
e2e0: 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
e2f0: 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
e300: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
e310: 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
e320: 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
e330: 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
e340: 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
e350: 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
e360: 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
e370: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
e380: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
e390: 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
e3a0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
e3b0: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
e3c0: 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
e3d0: 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
e3e0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
e3f0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
e400: 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
e410: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
e420: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
e430: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
e440: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
e450: 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20      needXcommit 
e460: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
e470: 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a  !=1 ) nTrans++;.
e480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e490: 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20  eeEnter(pBt);.  
e4a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e4b0: 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
e4c0: 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  ck(sqlite3BtreeP
e4d0: 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20  ager(pBt));.    
e4e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
e4f0: 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ave(pBt);.    }.
e500: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
e510: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
e520: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
e530: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
e540: 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73   any write-trans
e550: 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20  actions at all, 
e560: 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69  invoke the commi
e570: 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20  t hook */.  if( 
e580: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64  needXcommit && d
e590: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
e5a0: 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64  ck ){.    rc = d
e5b0: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
e5c0: 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  ck(db->pCommitAr
e5d0: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
e5e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
e5f0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
e600: 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20  _COMMITHOOK;.   
e610: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
e620: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
e630: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
e640: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
e650: 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
e660: 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
e670: 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
e680: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
e690: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
e6a0: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
e6b0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
e6c0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
e6d0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
e6e0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
e6f0: 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
e700: 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
e710: 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
e720: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
e730: 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72  e is :memory: or
e740: 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49   a temp file.  I
e750: 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73  n .  ** that cas
e760: 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  e we do not supp
e770: 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
e780: 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
e790: 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  o use the .  ** 
e7a0: 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
e7b0: 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
e7c0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   0==sqlite3Strle
e7d0: 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65  n30(sqlite3Btree
e7e0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
e7f0: 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20  aDb[0].pBt)).   
e800: 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29  || nTrans<=1.  )
e810: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
e820: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e830: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
e840: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
e850: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
e860: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
e870: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
e880: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
e890: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
e8a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
e8b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
e8c0: 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
e8d0: 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
e8e0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
e8f0: 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
e900: 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
e910: 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
e920: 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
e930: 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
e940: 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
e950: 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
e960: 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
e970: 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
e980: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
e990: 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
e9a0: 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
e9b0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
e9c0: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
e9d0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
e9e0: 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
e9f0: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
ea00: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
ea10: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
ea20: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
ea30: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
ea40: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
ea50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ea60: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
ea70: 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b  haseTwo(pBt, 0);
ea80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ea90: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
eaa0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
eab0: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
eac0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
ead0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
eae0: 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
eaf0: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
eb00: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
eb10: 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
eb20: 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
eb30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
eb40: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
eb50: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
eb60: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
eb70: 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69  mically..  */.#i
eb80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
eb90: 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
eba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
ebb0: 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
ebc0: 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  s;.    int needS
ebd0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ync = 0;.    cha
ebe0: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
ebf0: 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
ec00: 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
ec10: 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
ec20: 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
ec30: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
ec40: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
ec50: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
ec60: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
ec70: 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
ec80: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
ec90: 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
eca0: 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74    int retryCount
ecb0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
ecc0: 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a  ainFile;..    /*
ecd0: 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
ece0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
ecf0: 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46  me */.    nMainF
ed00: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ile = sqlite3Str
ed10: 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29  len30(zMainFile)
ed20: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
ed30: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
ed40: 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39  b, "%s-mjXXXXXX9
ed50: 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29  XXz", zMainFile)
ed60: 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65  ;.    if( zMaste
ed70: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
ed80: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
ed90: 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69  do {.      u32 i
eda0: 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66  Random;.      if
edb0: 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a  ( retryCount ){.
edc0: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72          if( retr
edd0: 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20  yCount>100 ){.  
ede0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
edf0: 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
ee00: 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22   "MJ delete: %s"
ee10: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
ee20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
ee30: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
ee40: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
ee50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ee60: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72    }else if( retr
ee70: 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  yCount==1 ){.   
ee80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
ee90: 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
eea0: 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22  "MJ collide: %s"
eeb0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
eec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
eed0: 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b      retryCount++
eee0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
eef0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
ef00: 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61  f(iRandom), &iRa
ef10: 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  ndom);.      sql
ef20: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33  ite3_snprintf(13
ef30: 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e  , &zMaster[nMain
ef40: 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39  File], "-mj%06X9
ef50: 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20  %02X",.         
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e        (iRandom>>
ef80: 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61  8)&0xffffff, iRa
ef90: 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20  ndom&0xff);.    
efa0: 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e    /* The antipen
efb0: 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74  ultimate charact
efc0: 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  er of the master
efd0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
efe0: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22  st.      ** be "
eff0: 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65  9" to avoid name
f000: 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e   collisions when
f010: 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e   using 8+3 filen
f020: 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ames. */.      a
f030: 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73  ssert( zMaster[s
f040: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f050: 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20  Master)-3]=='9' 
f060: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f070: 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69  FileSuffix3(zMai
f080: 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b  nFile, zMaster);
f090: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f0a0: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
f0b0: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
f0c0: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
f0d0: 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
f0e0: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
f0f0: 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
f100: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f110: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
f120: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
f130: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
f140: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
f150: 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
f160: 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
f170: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
f180: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
f190: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
f1a0: 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
f1b0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
f1c0: 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
f1d0: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
f1e0: 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
f1f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
f200: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f210: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
f220: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
f230: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
f240: 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
f250: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
f260: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
f270: 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
f280: 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
f290: 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
f2a0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
f2b0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
f2c0: 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
f2d0: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
f2e0: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
f2f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f300: 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
f310: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
f320: 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
f330: 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
f340: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f350: 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
f360: 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
f370: 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
f380: 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
f390: 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
f3a0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
f3b0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f3c0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
f3d0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
f3e0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  Bt;.      if( sq
f3f0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
f400: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
f410: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
f420: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
f430: 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
f440: 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
f450: 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b   if( zFile==0 ){
f460: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
f470: 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  nue;  /* Ignore 
f480: 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79  TEMP and :memory
f490: 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
f4a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f4b0: 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30   assert( zFile[0
f4c0: 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]!=0 );.        
f4d0: 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26  if( !needSync &&
f4e0: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79   !sqlite3BtreeSy
f4f0: 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20  ncDisabled(pBt) 
f500: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
f510: 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
f520: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
f530: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
f540: 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c  (pMaster, zFile,
f550: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
f560: 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65  (zFile)+1, offse
f570: 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  t);.        offs
f580: 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  et += sqlite3Str
f590: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a  len30(zFile)+1;.
f5a0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
f5b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f5c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
f5d0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
f5e0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
f5f0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
f600: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
f610: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f620: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
f630: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
f640: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f650: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f660: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
f670: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f680: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
f690: 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
f6a0: 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
f6b0: 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
f6c0: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
f6d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
f6e0: 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20   needSync .     
f6f0: 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  && 0==(sqlite3Os
f700: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
f710: 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
f720: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
f730: 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
f740: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
f750: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
f760: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
f770: 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
f780: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f790: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
f7a0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
f7b0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
f7c0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
f7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
f7e0: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
f7f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
f800: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
f810: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
f820: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
f830: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
f840: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
f850: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
f860: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f870: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
f880: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
f890: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
f8a0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
f8b0: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
f8c0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
f8d0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
f8e0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
f8f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
f900: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
f910: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
f920: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
f930: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
f940: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
f950: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
f960: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
f970: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
f980: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
f990: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
f9a0: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
f9b0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f9c0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
f9d0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
f9e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
f9f0: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
fa00: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
fa10: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
fa20: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
fa30: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
fa40: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
fa50: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
fa60: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
fa70: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
fa80: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
fa90: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
faa0: 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
fab0: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
fac0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
fad0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
fae0: 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
faf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
fb00: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
fb10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fb20: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
fb30: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
fb40: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fb50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
fb60: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
fb70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
fb80: 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
fb90: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
fba0: 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
fbb0: 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
fbc0: 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
fbd0: 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
fbe0: 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
fbf0: 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
fc00: 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
fc10: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
fc20: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
fc30: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
fc40: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
fc50: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
fc60: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
fc70: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
fc80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
fc90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
fca0: 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
fcb0: 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
fcc0: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
fcd0: 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
fce0: 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
fcf0: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
fd00: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
fd10: 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
fd20: 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
fd30: 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
fd40: 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
fd50: 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
fd60: 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
fd70: 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
fd80: 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
fd90: 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
fda0: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
fdb0: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
fdc0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
fdd0: 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
fde0: 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
fdf0: 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
fe00: 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
fe10: 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
fe20: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
fe30: 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
fe40: 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
fe50: 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
fe60: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
fe70: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
fe80: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
fe90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fea0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
feb0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
fec0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
fed0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
fee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
fef0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
ff00: 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a  aseTwo(pBt, 1);.
ff10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ff20: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
ff30: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
ff40: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
ff50: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
ff60: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
ff70: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
ff80: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
ff90: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
ffa0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
ffb0: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
ffc0: 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f  3.nVdbeActive co
ffd0: 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
ffe0: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
fff0: 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
10000 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
10010 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
10020 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
10030 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
10040 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
10050 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
10060 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
10070 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
10080 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
10090 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
100a0 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
100b0 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
100c0 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
100d0 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
100e0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
100f0 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
10100 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
10110 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
10120 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
10130 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
10140 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
10150 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d  0;.  int nRead =
10160 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
10170 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
10180 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
10190 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71  e3_stmt_busy((sq
101a0 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29  lite3_stmt*)p) )
101b0 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
101c0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
101d0 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
101e0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
101f0 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65  >bIsReader ) nRe
10200 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ad++;.    }.    
10210 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
10220 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
10230 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65  =db->nVdbeActive
10240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
10250 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57  rite==db->nVdbeW
10260 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  rite );.  assert
10270 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64  ( nRead==db->nVd
10280 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73  beRead );.}.#els
10290 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
102a0 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
102b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
102c0 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
102d0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
102e0 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
102f0 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
10300 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
10310 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
10320 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
10330 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
10340 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
10350 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
10360 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
10370 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
10380 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
10390 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
103a0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
103b0 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
103c0 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
103d0 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
103e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
103f0 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
10400 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
10410 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
10420 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
10430 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
10440 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
10450 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
10460 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
10470 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
10480 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
10490 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f  ){.  sqlite3 *co
104a0 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  nst db = p->db;.
104b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
104c0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  E_OK;..  /* If p
104d0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  ->iStatement is 
104e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
104f0 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62  o, then this Vdb
10500 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a  e opened a .  **
10510 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10520 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75  action that shou
10530 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72  ld be closed her
10540 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65  e. The only exce
10550 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68  ption.  ** is th
10560 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d  at an IO error m
10570 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  ay have occurred
10580 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65  , causing an eme
10590 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e  rgency rollback.
105a0 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  .  ** In this ca
105b0 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  se (db->nStateme
105c0 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72  nt==0), and ther
105d0 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
105e0 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  do..  */.  if( d
105f0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26  b->nStatement &&
10600 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29   p->iStatement )
10610 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
10620 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
10630 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
10640 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73  ement-1;..    as
10650 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50  sert( eOp==SAVEP
10660 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  OINT_ROLLBACK ||
10670 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
10680 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73  RELEASE);.    as
10690 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
106a0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73  ment>0 );.    as
106b0 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
106c0 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
106d0 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
106e0 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  int) );..    for
106f0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
10700 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
10710 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
10720 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  K;.      Btree *
10730 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
10740 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
10750 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pBt ){.        i
10760 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
10770 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
10780 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
10790 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
107a0 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
107b0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
107c0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
107d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
107e0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
107f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
10800 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
10810 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
10820 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
10830 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
10840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
10850 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
10870 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20   = rc2;.        
10880 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10890 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
108a0 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74  nt--;.    p->iSt
108b0 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  atement = 0;..  
108c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
108d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
108e0 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
108f0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
10900 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10910 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
10920 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
10930 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
10940 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10950 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10960 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
10970 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
10980 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
10990 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
109a0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
109b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
109c0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
109d0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
109e0 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
109f0 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72  ack, also restor
10a00 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  e the .    ** da
10a10 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64  tabase handles d
10a20 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
10a30 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68  nt counter to th
10a40 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77  e value it had w
10a50 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
10a60 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10a70 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
10a80 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f  .  */.    if( eO
10a90 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
10aa0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64  LBACK ){.      d
10ab0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
10ac0 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f   = p->nStmtDefCo
10ad0 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44  ns;.      db->nD
10ae0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
10af0 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43   p->nStmtDefImmC
10b00 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ons;.    }.  }. 
10b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10b20 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
10b30 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
10b40 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
10b50 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61  opened by the da
10b60 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c  tabase .** handl
10b70 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
10b80 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  h the VM passed 
10b90 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69  as an argument i
10ba0 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a  s about to be .*
10bb0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20  * committed. If 
10bc0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
10bd0 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66  nding deferred f
10be0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
10bf0 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69  raint.** violati
10c00 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ons, return SQLI
10c10 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77  TE_ERROR. Otherw
10c20 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
10c30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
10c40 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46  re outstanding F
10c50 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64  K violations and
10c60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
10c70 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
10c80 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65  E_ERROR, set the
10c90 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56   result of the V
10ca0 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  M to SQLITE_CONS
10cb0 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
10cc0 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61  Y.** and write a
10cd0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
10ce0 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75  to it. Then retu
10cf0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
10d00 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
10d10 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
10d20 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  KEY.int sqlite3V
10d30 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20  dbeCheckFk(Vdbe 
10d40 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64  *p, int deferred
10d50 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
10d60 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
10d70 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62  (deferred && (db
10d80 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b  ->nDeferredCons+
10d90 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
10da0 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20  Cons)>0) .   || 
10db0 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
10dc0 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
10dd0 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72  ) .  ){.    p->r
10de0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
10df0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
10e00 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63  ;.    p->errorAc
10e10 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
10e20 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
10e30 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
10e40 67 2c 20 64 62 2c 20 22 46 4f 52 45 49 47 4e 20  g, db, "FOREIGN 
10e50 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
10e60 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74  ailed");.    ret
10e70 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10e80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
10e90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
10ea0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
10eb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
10ec0 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45   the when a VDBE
10ed0 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20   tries to halt. 
10ee0 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20   If the VDBE.** 
10ef0 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73  has made changes
10f00 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63   and is in autoc
10f10 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e  ommit mode, then
10f20 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a   commit those.**
10f30 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20   changes.  If a 
10f40 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64  rollback is need
10f50 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  ed, then do the 
10f60 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
10f70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10f80 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
10f90 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  move the state o
10fa0 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53  f a VM from.** S
10fb0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20  QLITE_MAGIC_RUN 
10fc0 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  to SQLITE_MAGIC_
10fd0 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72  HALT.  It is har
10fe0 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c  mless to.** call
10ff0 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68   this on a VM th
11000 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c  at is in the SQL
11010 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73  ITE_MAGIC_HALT s
11020 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tate..**.** Retu
11030 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
11040 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
11050 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c   could not compl
11060 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a  ete because of.*
11070 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  * lock contentio
11080 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  n, return SQLITE
11090 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54  _BUSY.  If SQLIT
110a0 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
110b0 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ed, it.** means 
110c0 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f  the close did no
110d0 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65  t happen and nee
110e0 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ds to be repeate
110f0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
11100 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a  3VdbeHalt(Vdbe *
11110 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  p){.  int rc;   
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
11140 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74   store transient
11150 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f   return codes */
11160 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11170 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68   p->db;..  /* Th
11180 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  is function cont
11190 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74  ains the logic t
111a0 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69  hat determines i
111b0 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  f a statement or
111c0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
111d0 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74  n will be commit
111e0 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
111f0 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ck as a result o
11200 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75  f the.  ** execu
11210 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72  tion of this vir
11220 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20  tual machine. . 
11230 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20   **.  ** If any 
11240 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
11250 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20   errors occur:. 
11260 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c   **.  **     SQL
11270 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20  ITE_NOMEM.  **  
11280 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a     SQLITE_IOERR.
11290 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
112a0 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51  FULL.  **     SQ
112b0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20  LITE_INTERRUPT. 
112c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68   **.  ** Then th
112d0 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65  e internal cache
112e0 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
112f0 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
11300 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74  nsistent.  ** st
11310 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ate.  We need to
11320 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74   rollback the st
11330 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
11340 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73  ion, if there is
11350 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68  .  ** one, or th
11360 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73  e complete trans
11370 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
11380 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  is no statement 
11390 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
113a0 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  /..  if( p->db->
113b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
113c0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
113d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
113e0 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  if( p->aOnceFlag
113f0 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e   ) memset(p->aOn
11400 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f  ceFlag, 0, p->nO
11410 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73  nceFlag);.  clos
11420 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
11430 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
11440 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
11450 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11460 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68  ITE_OK;.  }.  ch
11470 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
11480 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63  (db);..  /* No c
11490 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
114a0 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  k needed if the 
114b0 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74  program never st
114c0 61 72 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a  arted or if the.
114d0 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
114e0 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64  nt does not read
114f0 20 6f 72 20 77 72 69 74 65 20 61 20 64 61 74 61   or write a data
11500 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20  base file.  */. 
11510 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26   if( p->pc>=0 &&
11520 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b   p->bIsReader ){
11530 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
11540 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
11550 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
11560 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61   */.    int eSta
11570 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20  tementOp = 0;.  
11580 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
11590 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
115a0 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
115b0 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65  if a 'special' e
115c0 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rror */..    /* 
115d0 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20  Lock all btrees 
115e0 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74  used by the stat
115f0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ement */.    sql
11600 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29  ite3VdbeEnter(p)
11610 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
11620 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
11630 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
11640 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
11650 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53   & 0xff;.    isS
11660 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
11670 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11680 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
11690 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
116a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
116b0 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
116c0 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
116d0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
116e0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
116f0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
11700 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
11710 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72  -only and the er
11720 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
11730 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20  TE_INTERRUPT, . 
11740 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62       ** no rollb
11750 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79  ack is necessary
11760 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20  . Otherwise, at 
11770 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e  least a savepoin
11780 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
11790 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
117a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72  rolled back to r
117b0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
117c0 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20  ase to a .      
117d0 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74  ** consistent st
117e0 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
117f0 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74      ** Even if t
11800 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
11810 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73  read-only, it is
11820 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65   important to pe
11830 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61  rform.      ** a
11840 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72   statement or tr
11850 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
11860 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66  ck operation. If
11870 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20   the error .    
11880 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68    ** occurred wh
11890 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ile writing to t
118a0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d  he journal, sub-
118b0 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62  journal or datab
118c0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
118d0 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
118e0 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75  effort to free u
118f0 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73  p cache space (s
11900 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
11910 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73    ** pagerStress
11920 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20  () in pager.c), 
11930 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
11940 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74  required to rest
11950 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
11960 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e  e pager to a con
11970 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
11980 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
11990 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  ( !p->readOnly |
119a0 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e  | mrc!=SQLITE_IN
119b0 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  TERRUPT ){.     
119c0 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c     if( (mrc==SQL
119d0 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
119e0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
119f0 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
11a00 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
11a10 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
11a20 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
11a30 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ACK;.        }el
11a40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
11a50 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
11a60 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
11a70 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
11a80 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
11a90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
11aa0 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
11ab0 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
11ac0 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
11ad0 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
11ae0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
11af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
11b00 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
11b10 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
11b20 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  CK);.          s
11b30 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
11b40 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
11b50 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
11b60 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
11b70 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
11b80 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
11b90 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11ba0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d  /* Check for imm
11bb0 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
11bc0 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a  ey violations. *
11bd0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
11be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11bf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
11c00 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20  heckFk(p, 0);.  
11c10 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
11c20 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
11c30 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
11c40 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
11c50 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20  y active writer 
11c60 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e  .    ** VM, then
11c70 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20   we do either a 
11c80 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
11c90 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ck of the curren
11ca0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  t transaction. .
11cb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
11cc0 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61  te: This block a
11cd0 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20  lso runs if one 
11ce0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
11cf0 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20  rrors handled . 
11d00 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
11d10 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a  occurred. .    *
11d20 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  /.    if( !sqlit
11d30 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29  e3VtabInSync(db)
11d40 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75   .     && db->au
11d50 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26  toCommit .     &
11d60 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  & db->nVdbeWrite
11d70 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ==(p->readOnly==
11d80 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0) .    ){.     
11d90 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
11da0 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
11db0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
11dc0 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
11dd0 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
11de0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
11df0 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a  eCheckFk(p, 1);.
11e00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
11e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11e20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
11e30 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  (p->readOnly) ){
11e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
11e50 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
11e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
11e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
11e80 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
11e90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
11ea0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
11eb0 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
11ec0 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20      }else{ .    
11ed0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74        /* The aut
11ee0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
11ef0 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20   true, the vdbe 
11f00 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63  program was succ
11f10 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20  essful .        
11f20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27    ** or hit an '
11f30 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61  OR FAIL' constra
11f40 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72  int and there ar
11f50 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f  e no deferred fo
11f60 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20  reign.          
11f70 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  ** key constrain
11f80 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68  ts to hold up th
11f90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
11fa0 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d  his means a comm
11fb0 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  it .          **
11fc0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
11fd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
11fe0 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70  vdbeCommit(db, p
11ff0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12000 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
12010 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72  ITE_BUSY && p->r
12020 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
12030 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12040 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
12050 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12060 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
12070 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
12080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12090 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
120a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
120b0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
120c0 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
120d0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
120e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
120f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12100 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
12110 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
12120 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
12130 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  mmCons = 0;.    
12140 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
12150 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72  &= ~SQLITE_Defer
12160 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73  FKs;.          s
12170 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
12180 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b  rnalChanges(db);
12190 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
121a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
121b0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
121c0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
121d0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
121e0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
121f0 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74   }.      db->nSt
12200 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  atement = 0;.   
12210 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
12220 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20  ementOp==0 ){.  
12230 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
12240 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65  QLITE_OK || p->e
12250 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
12260 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ail ){.        e
12270 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
12280 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b  VEPOINT_RELEASE;
12290 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
122a0 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
122b0 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
122c0 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
122d0 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
122e0 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65  LLBACK;.      }e
122f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
12300 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
12310 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
12320 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
12330 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
12340 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
12350 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
12360 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
12370 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
12380 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
12390 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65  }.  .    /* If e
123a0 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e  StatementOp is n
123b0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
123c0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
123d0 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20  ction needs to. 
123e0 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74     ** be committ
123f0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
12400 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56  k. Call sqlite3V
12410 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
12420 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  t() to.    ** do
12430 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65   so. If this ope
12440 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  ration returns a
12450 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65  n error, and the
12460 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
12470 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  nt.    ** error 
12480 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f  code is SQLITE_O
12490 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53  K or SQLITE_CONS
124a0 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f  TRAINT, then pro
124b0 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  mote the.    ** 
124c0 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
124d0 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20  t error code..  
124e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74    */.    if( eSt
124f0 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20  atementOp ){.   
12500 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
12510 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
12520 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f  t(p, eStatementO
12530 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
12540 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
12550 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12560 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29   || (p->rc&0xff)
12570 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
12580 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  INT ){.         
12590 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
125a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
125b0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
125c0 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
125d0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
125e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
125f0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
12600 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
12610 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
12620 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12630 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
12640 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
12650 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
12660 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
12670 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
12680 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
12690 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
126a0 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
126b0 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20  r DELETE and no 
126c0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
126d0 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73  ction.    ** has
126e0 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
126f0 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61  k, update the da
12700 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12710 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  n change-counter
12720 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
12730 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
12740 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53   ){.      if( eS
12750 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45  tatementOp!=SAVE
12760 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
12770 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12780 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
12790 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
127a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
127b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
127c0 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
127d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
127e0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
127f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12800 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
12810 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
12820 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
12830 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  }..  /* We have 
12840 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c  successfully hal
12850 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74  ted and closed t
12860 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74  he VM.  Record t
12870 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69  his fact. */.  i
12880 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
12890 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69     db->nVdbeActi
128a0 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70  ve--;.    if( !p
128b0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d  ->readOnly ) db-
128c0 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20  >nVdbeWrite--;. 
128d0 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
128e0 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52  der ) db->nVdbeR
128f0 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  ead--;.    asser
12900 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
12910 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ve>=db->nVdbeRea
12920 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
12930 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d   db->nVdbeRead>=
12940 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
12950 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
12960 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20  ->nVdbeWrite>=0 
12970 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  );.  }.  p->magi
12980 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48  c = VDBE_MAGIC_H
12990 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  ALT;.  checkActi
129a0 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20  veVdbeCnt(db);. 
129b0 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
129c0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
129d0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
129e0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
129f0 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
12a00 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  it flag is set t
12a10 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  o true, then any
12a20 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65   locks that were
12a30 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f   held.  ** by co
12a40 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65  nnection db have
12a50 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73   now been releas
12a60 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ed. Call sqlite3
12a70 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
12a80 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e  ed() .  ** to in
12a90 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65  voke any require
12aa0 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  d unlock-notify 
12ab0 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
12ac0 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
12ad0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
12ae0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
12af0 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a  ocked(db);.  }..
12b00 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
12b10 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64  dbeActive>0 || d
12b20 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
12b30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65   || db->nStateme
12b40 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  nt==0 );.  retur
12b50 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  n (p->rc==SQLITE
12b60 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42  _BUSY ? SQLITE_B
12b70 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29  USY : SQLITE_OK)
12b80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
12b90 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
12ba0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
12bb0 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
12bc0 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
12bd0 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
12be0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
12bf0 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
12c00 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
12c10 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
12c20 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
12c30 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
12c40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
12c50 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
12c60 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
12c70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65  error message be
12c80 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56  longing to the V
12c90 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  DBE passed.** as
12ca0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
12cb0 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62  ent to its datab
12cc0 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74  ase handle (so t
12cd0 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65  hat they will be
12ce0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79   .** returned by
12cf0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
12d00 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20  3_errcode() and 
12d10 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
12d20 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
12d30 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
12d40 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65  clear the VDBE e
12d50 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73  rror code or mes
12d60 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f  sage, just.** co
12d70 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65  pies them to the
12d80 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12d90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12da0 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
12db0 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  r(Vdbe *p){.  sq
12dc0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
12dd0 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  b;.  int rc = p-
12de0 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45  >rc;.  if( p->zE
12df0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38 20  rrMsg ){.    u8 
12e00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64  mallocFailed = d
12e10 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
12e20 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
12e30 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
12e40 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72  .    if( db->pEr
12e50 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20  r==0 ) db->pErr 
12e60 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
12e70 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  w(db);.    sqlit
12e80 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
12e90 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
12ea0 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
12eb0 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
12ec0 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
12ed0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
12ee0 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61  oc();.    db->ma
12ef0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c  llocFailed = mal
12f00 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 64  locFailed;.    d
12f10 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  b->errCode = rc;
12f20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
12f30 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
12f40 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
12f50 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
12f60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
12f70 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  LOG./*.** If an 
12f80 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
12f90 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67  LLOG hook is reg
12fa0 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20  istered and the 
12fb0 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c  VM has been run,
12fc0 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a   .** invoke it..
12fd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
12fe0 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
12ff0 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20  Vdbe *v){.  if( 
13000 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
13010 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76  fig.xSqllog && v
13020 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13030 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d  && v->zSql && v-
13040 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68  >pc>=0 ){.    ch
13050 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20  ar *zExpanded = 
13060 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e  sqlite3VdbeExpan
13070 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29  dSql(v, v->zSql)
13080 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d  ;.    assert( v-
13090 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d  >db->init.busy==
130a0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78  0 );.    if( zEx
130b0 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20  panded ){.      
130c0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
130d0 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20  fig.xSqllog(.   
130e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
130f0 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
13100 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45  ogArg, v->db, zE
13110 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20  xpanded, 1.     
13120 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
13130 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a  3DbFree(v->db, z
13140 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d  Expanded);.    }
13150 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
13160 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65  efine vdbeInvoke
13170 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66  Sqllog(x).#endif
13180 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
13190 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
131a0 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
131b0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
131c0 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
131d0 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
131e0 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
131f0 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
13200 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
13210 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
13220 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
13230 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
13240 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
13250 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
13260 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
13270 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
13280 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
13290 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
132a0 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
132b0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
132c0 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
132d0 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
132e0 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
132f0 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
13300 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
13310 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
13320 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
13330 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
13340 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20  .  /* If the VM 
13350 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63  did not run to c
13360 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20  ompletion or if 
13370 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  it encountered a
13380 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68  n.  ** error, th
13390 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  en it might not 
133a0 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64  have been halted
133b0 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68   properly.  So h
133c0 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e  alt.  ** it now.
133d0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
133e0 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f  dbeHalt(p);..  /
133f0 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61  * If the VDBE ha
13400 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61  s be run even pa
13410 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72  rtially, then tr
13420 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72  ansfer the error
13430 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65   code.  ** and e
13440 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f  rror message fro
13450 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20  m the VDBE into 
13460 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
13470 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75  e structure.  Bu
13480 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44  t.  ** if the VD
13490 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  BE has just been
134a0 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20   set to run but 
134b0 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  has not actually
134c0 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20   executed any.  
134d0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
134e0 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d  yet, leave the m
134f0 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72  ain database err
13500 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  or information u
13510 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20  nchanged..  */. 
13520 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
13530 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53  .    vdbeInvokeS
13540 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71  qllog(p);.    sq
13550 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
13560 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73  rError(p);.    s
13570 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
13580 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
13590 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
135a0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e  ;.    if( p->run
135b0 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78  OnlyOnce ) p->ex
135c0 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  pired = 1;.  }el
135d0 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20  se if( p->rc && 
135e0 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20  p->expired ){.  
135f0 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64    /* The expired
13600 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
13610 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65   the VDBE before
13620 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a   the first call.
13630 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
13640 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f  3_step(). For co
13650 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65  nsistency (since
13660 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
13670 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65  was.    ** calle
13680 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  d), set the data
13690 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68  base error in th
136a0 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e  is case as well.
136b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
136c0 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
136d0 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45  db, p->rc, p->zE
136e0 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30  rrMsg ? "%s" : 0
136f0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
13700 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13710 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
13720 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
13730 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
13740 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
13750 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56  ry used by the V
13760 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e  DBE.  */.  Clean
13770 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76  up(p);..  /* Sav
13780 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
13790 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
137a0 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
137b0 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
137c0 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
137d0 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
137e0 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
137f0 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
13800 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
13810 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
13820 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
13830 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
13840 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
13850 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
13860 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
13870 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
13880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
13890 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
138a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
138b0 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  zSql ){.        
138c0 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a  char c, pc = 0;.
138d0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
138e0 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
138f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63       for(i=0; (c
13900 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d   = p->zSql[i])!=
13910 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
13920 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20     if( pc=='\n' 
13930 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  ) fprintf(out, "
13940 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  -- ");.         
13950 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20   putc(c, out);. 
13960 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b           pc = c;
13970 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13980 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20     if( pc!='\n' 
13990 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  ) fprintf(out, "
139a0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
139b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
139c0 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
139d0 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31       char zHdr[1
139e0 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  00];.        sql
139f0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
13a00 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72  zeof(zHdr), zHdr
13a10 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38  , "%6u %12llu %8
13a20 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20  llu ",.         
13a30 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c    p->aOp[i].cnt,
13a40 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
13a50 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20  Op[i].cycles,.  
13a60 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
13a70 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f  i].cnt>0 ? p->aO
13a80 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61  p[i].cycles/p->a
13a90 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20  Op[i].cnt : 0.  
13aa0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
13ab0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
13ac0 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20  s", zHdr);.     
13ad0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
13ae0 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
13af0 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
13b00 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
13b10 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
13b20 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72  #endif.  p->iCur
13b30 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20  rentTime = 0;.  
13b40 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
13b50 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
13b60 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d  turn p->rc & db-
13b70 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a  >errMask;.}. ./*
13b80 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
13b90 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
13ba0 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
13bb0 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
13bc0 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
13bd0 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
13be0 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
13bf0 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
13c00 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
13c10 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13c20 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
13c30 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13c40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
13c50 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
13c60 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
13c70 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
13c80 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
13c90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
13ca0 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  t(p);.    assert
13cb0 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65  ( (rc & p->db->e
13cc0 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
13cd0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
13ce0 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74  Delete(p);.  ret
13cf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13d00 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f   If parameter iO
13d10 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  p is less than z
13d20 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ero, then invoke
13d30 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
13d40 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c  for.** all auxil
13d50 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
13d60 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  rs currently cac
13d70 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  hed by the VM pa
13d80 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66  ssed as.** the f
13d90 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
13da0 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20  *.** Or, if iOp 
13db0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
13dc0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
13dd0 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72  , then the destr
13de0 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79  uctor is.** only
13df0 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f   invoked for tho
13e00 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  se auxiliary dat
13e10 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74  a pointers creat
13e20 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a  ed by the user .
13e30 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  ** function invo
13e40 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75  ked by the OP_Fu
13e50 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74  nction opcode at
13e60 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70   instruction iOp
13e70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65   of .** VM pVdbe
13e80 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20  , and only then 
13e90 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  if:.**.**    * t
13ea0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75  he associated fu
13eb0 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
13ec0 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20   is the 32nd or 
13ed0 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a  later (counting.
13ee0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66  **      from lef
13ef0 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a  t to right), or.
13f00 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63  **.**    * the c
13f10 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
13f20 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73   in argument mas
13f30 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72  k is clear (wher
13f40 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20  e the first.**  
13f50 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72      function par
13f60 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e  ameter correspon
13f70 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e  ds to bit 0 etc.
13f80 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
13f90 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
13fa0 61 74 61 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ata(Vdbe *pVdbe,
13fb0 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61   int iOp, int ma
13fc0 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 20 2a  sk){.  AuxData *
13fd0 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e 70 41  *pp = &pVdbe->pA
13fe0 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28  uxData;.  while(
13ff0 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44   *pp ){.    AuxD
14000 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b  ata *pAux = *pp;
14010 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29  .    if( (iOp<0)
14020 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e  .     || (pAux->
14030 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75  iOp==iOp && (pAu
14040 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28  x->iArg>31 || !(
14050 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32  mask & MASKBIT32
14060 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a  (pAux->iArg)))).
14070 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
14080 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72  tcase( pAux->iAr
14090 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69  g==31 );.      i
140a0 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
140b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
140c0 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
140d0 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
140e0 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d       *pp = pAux-
140f0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
14100 6c 69 74 65 33 44 62 46 72 65 65 28 70 56 64 62  lite3DbFree(pVdb
14110 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20  e->db, pAux);.  
14120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
14130 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b  p= &pAux->pNext;
14140 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
14150 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  .** Free all mem
14160 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
14170 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73  ith the Vdbe pas
14180 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
14190 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65  d argument,.** e
141a0 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74  xcept for object
141b0 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69   itself, which i
141c0 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a  s preserved..**.
141d0 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
141e0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
141f0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69  unction and sqli
14200 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20  te3VdbeDelete() 
14210 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44  is that.** VdbeD
14220 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c  elete() also unl
14230 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72  inks the Vdbe fr
14240 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56  om the list of V
14250 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  Ms associated wi
14260 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  th.** the databa
14270 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e  se connection an
14280 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65  d frees the obje
14290 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f  ct itself..*/.vo
142a0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  id sqlite3VdbeCl
142b0 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  earObject(sqlite
142c0 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
142d0 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  .  SubProgram *p
142e0 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  Sub, *pNext;.  i
142f0 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
14300 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
14310 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
14320 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
14330 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
14340 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
14350 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
14360 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
14370 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75  ME_N);.  for(pSu
14380 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70  b=p->pProgram; p
14390 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29  Sub; pSub=pNext)
143a0 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53  {.    pNext = pS
143b0 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76  ub->pNext;.    v
143c0 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
143d0 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53  b, pSub->aOp, pS
143e0 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71  ub->nOp);.    sq
143f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14400 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  pSub);.  }.  for
14410 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69  (i=p->nzVar-1; i
14420 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65  >=0; i--) sqlite
14430 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
14440 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65  zVar[i]);.  vdbe
14450 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
14460 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
14470 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
14480 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
14490 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
144a0 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
144b0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
144c0 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
144d0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
144e0 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
144f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
14500 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
14510 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
14520 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  b;..  if( NEVER(
14530 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  p==0) ) return;.
14540 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
14550 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14560 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
14570 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
14580 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63  e3VdbeClearObjec
14590 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20  t(db, p);.  if( 
145a0 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
145b0 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
145c0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  = p->pNext;.  }e
145d0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
145e0 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b   db->pVdbe==p );
145f0 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d  .    db->pVdbe =
14600 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
14610 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
14620 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
14630 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
14640 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
14650 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41  = VDBE_MAGIC_DEA
14660 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a  D;.  p->db = 0;.
14670 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14680 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
14690 20 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20   The cursor "p" 
146a0 68 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65  has a pending se
146b0 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  ek operation tha
146c0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
146d0 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75  en.** carried ou
146e0 74 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72  t.  Seek the cur
146f0 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20  sor now.  If an 
14700 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
14710 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72  turn.** the appr
14720 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
14730 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
14740 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
14750 45 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64  E handleDeferred
14760 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
14770 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73  r *p){.  int res
14780 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
14790 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72  ITE_TEST.  exter
147a0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
147b0 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
147c0 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  if.  assert( p->
147d0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
147e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
147f0 73 54 61 62 6c 65 20 29 3b 0a 20 20 72 63 20 3d  sTable );.  rc =
14800 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
14810 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70  etoUnpacked(p->p
14820 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
14830 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
14840 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  res);.  if( rc )
14850 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
14860 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
14870 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14880 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51  _BKPT;.#ifdef SQ
14890 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
148a0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
148b0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e  ++;.#endif.  p->
148c0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
148d0 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74   0;.  p->cacheSt
148e0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
148f0 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  LE;.  return SQL
14900 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14910 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d   Something has m
14920 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20  oved cursor "p" 
14930 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d  out of place.  M
14940 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20  aybe the row it 
14950 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  was.** pointed t
14960 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  o was deleted ou
14970 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e  t from under it.
14980 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62    Or maybe the b
14990 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61  tree was.** reba
149a0 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65  lanced.  Whateve
149b0 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79  r the cause, try
149c0 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20   to restore "p" 
149d0 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a  to the place it.
149e0 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  ** is supposed t
149f0 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20  o be pointing.  
14a00 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64  If the row was d
14a10 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
14a20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72  under the.** cur
14a30 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72  sor, set the cur
14a40 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
14a50 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73  a NULL row..*/.s
14a60 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
14a70 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
14a80 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65  MovedCursor(Vdbe
14a90 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
14aa0 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  t isDifferentRow
14ab0 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  , rc;.  assert( 
14ac0 70 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  p->pCursor!=0 );
14ad0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14ae0 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
14af0 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  Moved(p->pCursor
14b00 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
14b10 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
14b20 73 74 6f 72 65 28 70 2d 3e 70 43 75 72 73 6f 72  store(p->pCursor
14b30 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f  , &isDifferentRo
14b40 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74  w);.  p->cacheSt
14b50 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
14b60 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66  LE;.  if( isDiff
14b70 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75  erentRow ) p->nu
14b80 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74  llRow = 1;.  ret
14b90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14ba0 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65   Check to ensure
14bb0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
14bc0 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74   is valid.  Rest
14bd0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ore the cursor.*
14be0 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52  * if need be.  R
14bf0 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72  eturn any I/O er
14c00 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ror from the res
14c10 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  tore operation..
14c20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
14c30 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
14c40 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
14c50 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
14c60 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
14c70 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a  (p->pCursor) ){.
14c80 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
14c90 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b  eMovedCursor(p);
14ca0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
14cb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14cc0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
14cd0 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64  cursor p is read
14ce0 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  y to read or wri
14cf0 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68  te the row to wh
14d00 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61  ich it.** was la
14d10 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20  st positioned.  
14d20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
14d30 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66  code if an OOM f
14d40 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f  ault or I/O erro
14d50 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73  r.** prevents us
14d60 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e   from positionin
14d70 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
14d80 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69  its correct posi
14d90 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
14da0 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
14db0 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
14dc0 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
14dd0 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
14de0 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49  * MoveTo now.  I
14df0 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e  f no move is pen
14e00 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73  ding, check to s
14e10 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61  ee if the row ha
14e20 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65  s been.** delete
14e30 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
14e40 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20   the cursor and 
14e50 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20  if it has, mark 
14e60 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20  the row as.** a 
14e70 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  NULL row..**.** 
14e80 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
14e90 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
14ea0 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  g to the correct
14eb0 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f   row and that ro
14ec0 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65  w has.** not bee
14ed0 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
14ee0 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
14ef0 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  sor, then this r
14f00 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
14f10 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
14f20 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
14f30 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
14f40 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72  {.  if( p->defer
14f50 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
14f60 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65   return handleDe
14f70 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b  ferredMoveto(p);
14f80 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 43  .  }.  if( p->pC
14f90 75 72 73 6f 72 20 26 26 20 73 71 6c 69 74 65 33  ursor && sqlite3
14fa0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
14fb0 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20  ved(p->pCursor) 
14fc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
14fd0 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
14fe0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
14ff0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15000 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
15010 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
15020 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
15030 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
15040 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15050 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
15060 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
15070 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
15080 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
15090 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
150a0 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
150b0 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
150c0 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
150d0 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
150e0 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
150f0 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
15100 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
15110 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
15120 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
15130 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
15140 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
15150 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
15160 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
15170 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
15180 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
15190 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
151a0 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
151b0 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
151c0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
151d0 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
151e0 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
151f0 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
15200 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
15210 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
15220 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
15230 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
15240 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
15250 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
15260 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
15270 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
15280 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
15290 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
152a0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
152b0 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
152c0 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
152d0 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79   blob separately
152e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
152f0 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
15300 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
15310 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
15320 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
15330 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
15340 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
15350 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
15360 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
15370 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
15380 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
15390 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
153a0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
153b0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
153c0 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
153d0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
153e0 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
153f0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
15400 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15420 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
15430 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
15440 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
15450 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
15460 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
15470 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
15480 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
15490 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
154a0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
154b0 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
154c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154d0 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
154e0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
154f0 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
15500 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
15510 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
15520 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15540 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
15550 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
15560 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
15570 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
15580 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
15590 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
155a0 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
155b0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
155c0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
155d0 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
155e0 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15600 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
15610 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
15620 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
15630 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
15640 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
15650 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
15660 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
15670 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
15680 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
15690 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
156a0 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
156b0 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
156c0 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
156d0 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
156e0 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
156f0 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
15700 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15710 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
15720 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
15730 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
15740 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15750 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
15760 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
15770 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
15780 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
15790 20 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 66   u32 n;..  if( f
157a0 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
157b0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
157c0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
157d0 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
157e0 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
157f0 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
15800 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
15810 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
15820 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
15830 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
15840 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
15850 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
15860 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
15870 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  i<0 ){.      if(
15880 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20   i<(-MAX_6BYTE) 
15890 29 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20  ) return 6;.    
158a0 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65    /* Previous te
158b0 73 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20  st prevents:  u 
158c0 3d 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38  = -(-92233720368
158d0 35 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20  54775808) */.   
158e0 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d     u = -i;.    }
158f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20  else{.      u = 
15900 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
15910 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20   u<=127 ){.     
15920 20 72 65 74 75 72 6e 20 28 28 69 26 31 29 3d 3d   return ((i&1)==
15930 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74  i && file_format
15940 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32 29 75 20  >=4) ? 8+(u32)u 
15950 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  : 1;.    }.    i
15960 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
15970 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
15980 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
15990 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
159a0 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
159b0 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
159c0 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
159d0 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
159e0 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
159f0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
15a00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
15a10 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15a20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pMem->db->malloc
15a30 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26  Failed || flags&
15a40 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
15a50 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  b) );.  assert( 
15a60 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20  pMem->n>=0 );.  
15a70 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e  n = (u32)pMem->n
15a80 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
15a90 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
15aa0 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  n += pMem->u.nZe
15ab0 72 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ro;.  }.  return
15ac0 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28   ((n*2) + 12 + (
15ad0 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21  (flags&MEM_Str)!
15ae0 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  =0));.}../*.** R
15af0 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
15b00 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
15b10 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
15b20 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
15b30 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73  l-type..*/.u32 s
15b40 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15b50 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69  TypeLen(u32 seri
15b60 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20  al_type){.  if( 
15b70 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
15b80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
15b90 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
15ba0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
15bb0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
15bc0 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c  Size[] = { 0, 1,
15bd0 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20   2, 3, 4, 6, 8, 
15be0 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b  8, 0, 0, 0, 0 };
15bf0 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a  .    return aSiz
15c00 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a  e[serial_type];.
15c10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
15c20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
15c30 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
15c40 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
15c50 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
15c60 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
15c70 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
15c80 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
15c90 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
15ca0 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
15cb0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
15cc0 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
15cd0 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
15ce0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
15cf0 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
15d00 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
15d10 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
15d20 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
15d30 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
15d40 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
15d50 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
15d60 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
15d70 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
15d80 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
15d90 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
15da0 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
15db0 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
15dc0 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
15dd0 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
15de0 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
15df0 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
15e00 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
15e10 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
15e20 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
15e30 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
15e40 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
15e50 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
15e60 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
15e70 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
15e80 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
15e90 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
15ea0 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
15eb0 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
15ec0 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
15ed0 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
15ee0 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
15ef0 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
15f00 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
15f10 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
15f20 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
15f30 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
15f40 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
15f50 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
15f60 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
15f70 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
15f80 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
15f90 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
15fa0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
15fb0 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
15fc0 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d  .**.** (2007-08-
15fd0 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56  30)  Frank van V
15fe0 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20  ugt has studied 
15ff0 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f  this problem clo
16000 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20  sely.** and has 
16010 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67  send his finding
16020 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20  s to the SQLite 
16030 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61  developers.  Fra
16040 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61  nk.** writes tha
16050 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72  t some Linux ker
16060 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74  nels offer float
16070 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61  ing point hardwa
16080 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20  re.** emulation 
16090 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33  that uses only 3
160a0 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20  2-bit mantissas 
160b0 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c  instead of a ful
160c0 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73  l .** 48-bits as
160d0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
160e0 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20   IEEE standard. 
160f0 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a   (This is the.**
16100 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54   CONFIG_FPE_FAST
16110 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e  FPE option.)  On
16120 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66   such systems, f
16130 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
16140 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62   byte swapping b
16150 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70  ecomes very comp
16160 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f  licated.  To avo
16170 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20  id problems,.** 
16180 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79  the necessary by
16190 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63  te swapping is c
161a0 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67  arried out using
161b0 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
161c0 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  r.** rather than
161d0 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e   a 64-bit float.
161e0 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20    Frank assures 
161f0 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  us that the code
16200 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66   here.** works f
16210 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65  or him.  We, the
16220 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76   developers, hav
16230 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65  e no way to inde
16240 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72  pendently.** ver
16250 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72  ify this, but Fr
16260 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f  ank seems to kno
16270 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c  w what he is tal
16280 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f  king about.** so
16290 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a   we trust him..*
162a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
162b0 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
162c0 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20  IT_FLOAT.static 
162d0 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36  u64 floatSwap(u6
162e0 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  4 in){.  union {
162f0 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
16300 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b  u32 i[2];.  } u;
16310 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72  .  u32 t;..  u.r
16320 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69   = in;.  t = u.i
16330 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20  [0];.  u.i[0] = 
16340 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d  u.i[1];.  u.i[1]
16350 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75   = t;.  return u
16360 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73  .r;.}.# define s
16370 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
16380 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61  oat(X)  X = floa
16390 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23  tSwap(X).#else.#
163a0 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
163b0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a  dEndianFloat(X).
163c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
163d0 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
163e0 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
163f0 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
16400 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
16410 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
16420 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
16430 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
16440 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
16450 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
16460 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
16470 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a  tes written..**.
16480 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61  ** nBuf is the a
16490 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c  mount of space l
164a0 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54  eft in buf[].  T
164b0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
164c0 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20  ponsible.** for 
164d0 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67  allocating enoug
164e0 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d  h space to buf[]
164f0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
16500 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75  ire field, exclu
16510 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  sive.** of the p
16520 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74  Mem->u.nZero byt
16530 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72  es for a MEM_Zer
16540 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52  o value..**.** R
16550 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
16560 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
16570 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
16580 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
16590 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
165a0 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
165b0 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
165c0 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
165d0 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
165e0 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
165f0 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
16600 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
16610 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
16620 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70  (u8 *buf, Mem *p
16630 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f  Mem, u32 serial_
16640 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e  type){.  u32 len
16650 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
16660 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
16670 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
16680 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
16690 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
166a0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69      u32 i;.    i
166b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
166c0 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
166d0 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
166e0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  zeof(pMem->u.r) 
166f0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
16700 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  &v, &pMem->u.r, 
16710 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
16720 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
16730 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
16740 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
16750 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
16760 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
16770 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16780 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
16790 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
167a0 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b  ( i>0 );.    do{
167b0 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20  .      buf[--i] 
167c0 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a  = (u8)(v&0xFF);.
167d0 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
167e0 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a     }while( i );.
167f0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
16800 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
16810 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
16820 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
16830 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
16840 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
16850 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
16860 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
16870 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
16880 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
16890 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
168a0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
168b0 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
168c0 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  em->n;.    memcp
168d0 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
168e0 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  len);.    return
168f0 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
16900 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
16910 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
16920 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e  turn 0;.}../* In
16930 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71  put "x" is a seq
16940 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65  uence of unsigne
16950 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  d characters tha
16960 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a  t represent a.**
16970 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
16980 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ger.  Return the
16990 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69   equivalent nati
169a0 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64  ve integer.*/.#d
169b0 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49  efine ONE_BYTE_I
169c0 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78  NT(x)    ((i8)(x
169d0 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57  )[0]).#define TW
169e0 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  O_BYTE_INT(x)   
169f0 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30   (256*(i8)((x)[0
16a00 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69  ])|(x)[1]).#defi
16a10 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  ne THREE_BYTE_IN
16a20 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38  T(x)  (65536*(i8
16a30 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
16a40 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64  ]<<8)|(x)[2]).#d
16a50 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
16a60 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29  UINT(x)  (((u32)
16a70 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29  (x)[0]<<24)|((x)
16a80 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
16a90 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65  <<8)|(x)[3]).#de
16aa0 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49  fine FOUR_BYTE_I
16ab0 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a  NT(x) (16777216*
16ac0 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78  (i8)((x)[0])|((x
16ad0 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32  )[1]<<16)|((x)[2
16ae0 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f  ]<<8)|(x)[3])../
16af0 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
16b00 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
16b10 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
16b20 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
16b30 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
16b40 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
16b50 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
16b60 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
16b70 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
16b80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
16b90 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
16ba0 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74  d as two separat
16bb0 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  e routines for p
16bc0 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
16bd0 68 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61  he few cases tha
16be0 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20  t require local 
16bf0 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72  variables are br
16c00 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20  oken out into a 
16c10 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74  separate.** rout
16c20 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d  ine so that in m
16c30 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76  ost cases the ov
16c40 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67  erhead of moving
16c50 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74   the stack point
16c60 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64  er.** is avoided
16c70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32  ..*/ .static u32
16c80 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
16c90 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f   serialGet(.  co
16ca0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
16cb0 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
16cc0 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
16cd0 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
16ce0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d00 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
16d10 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
16d20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d40 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
16d50 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
16d60 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d   */.){.  u64 x =
16d70 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
16d80 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20  buf);.  u32 y = 
16d90 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
16da0 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c  uf+4);.  x = (x<
16db0 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20  <32) + y;.  if( 
16dc0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
16dd0 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  {.    pMem->u.i 
16de0 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
16df0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
16e00 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74  EM_Int;.    test
16e10 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
16e20 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69  0 );.  }else{.#i
16e30 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
16e40 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
16e50 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
16e60 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f  ING_POINT).    /
16e70 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
16e80 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
16e90 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
16ea0 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
16eb0 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
16ec0 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
16ed0 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
16ee0 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
16ef0 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20  .    ** defined 
16f00 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
16f10 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
16f20 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
16f30 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  ed.    ** endian
16f40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  ..    */.    sta
16f50 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
16f60 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
16f70 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74  000)<<32;.    st
16f80 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c  atic const doubl
16f90 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20  e r1 = 1.0;.    
16fa0 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20  u64 t2 = t1;.   
16fb0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
16fc0 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61  Float(t2);.    a
16fd0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
16fe0 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
16ff0 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
17000 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
17010 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61   );.#endif.    a
17020 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29  ssert( sizeof(x)
17030 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d  ==8 && sizeof(pM
17040 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20  em->u.r)==8 );. 
17050 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
17060 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20  anFloat(x);.    
17070 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e  memcpy(&pMem->u.
17080 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
17090 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  );.    pMem->fla
170a0 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
170b0 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d  N(pMem->u.r) ? M
170c0 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
170d0 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  al;.  }.  return
170e0 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65   8;.}.u32 sqlite
170f0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a  3VdbeSerialGet(.
17100 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
17110 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
17120 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
17130 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
17140 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
17150 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
17160 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
17170 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
17180 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171a0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
171b0 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
171c0 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69  into */.){.  swi
171d0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
171e0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a   ){.    case 10:
171f0 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
17200 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
17210 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20  .    case 11:   
17220 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
17230 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
17240 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20    case 0: {  /* 
17250 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d  NULL */.      pM
17260 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
17270 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61  Null;.      brea
17280 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17290 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65  e 1: { /* 1-byte
172a0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
172b0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
172c0 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  .i = ONE_BYTE_IN
172d0 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
172e0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
172f0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
17300 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
17310 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
17320 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
17330 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
17340 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
17350 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
17360 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  u.i = TWO_BYTE_I
17370 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
17380 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
17390 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
173a0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
173b0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
173c0 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
173d0 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
173e0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
173f0 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
17400 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54  >u.i = THREE_BYT
17410 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
17420 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
17430 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
17440 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
17450 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
17460 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
17470 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
17480 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
17490 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
174a0 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
174b0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
174c0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
174d0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
174e0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
174f0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
17500 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
17510 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
17520 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
17530 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
17540 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
17550 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32  _BYTE_UINT(buf+2
17560 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
17570 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
17580 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
17590 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
175a0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
175b0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
175c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
175d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
175e0 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
175f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
17600 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
17610 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
17620 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
17630 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63  /* These use loc
17640 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f  al variables, so
17650 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65   do them in a se
17660 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20  parate routine. 
17670 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
17680 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20   having to move 
17690 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65  the frame pointe
176a0 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  r in the common 
176b0 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  case */.      re
176c0 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62  turn serialGet(b
176d0 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70  uf,serial_type,p
176e0 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
176f0 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
17700 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
17710 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
17720 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
17730 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69  pMem->u.i = seri
17740 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20  al_type-8;.     
17750 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
17760 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
17770 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
17780 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
17790 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
177a0 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20  u16 aFlag[] = { 
177b0 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68  MEM_Blob|MEM_Eph
177c0 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  em, MEM_Str|MEM_
177d0 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70  Ephem };.      p
177e0 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
177f0 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
17800 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  ->n = (serial_ty
17810 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
17820 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46  pMem->flags = aF
17830 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26  lag[serial_type&
17840 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1];.      return
17850 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a   pMem->n;.    }.
17860 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
17870 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  }./*.** This rou
17880 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
17890 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69  allocate suffici
178a0 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ent space for an
178b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
178c0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72  ** structure lar
178d0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20  ge enough to be 
178e0 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65  used with sqlite
178f0 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
17900 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69  k() if.** the fi
17910 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
17920 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79  a pointer to Key
17930 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
17940 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54  KeyInfo..**.** T
17950 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68  he space is eith
17960 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  er allocated usi
17970 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ng sqlite3DbMall
17980 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20  ocRaw() or from 
17990 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  within.** the un
179a0 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70  aligned buffer p
179b0 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65  assed via the se
179c0 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61  cond and third a
179d0 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d  rguments (presum
179e0 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70  ably.** stack sp
179f0 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72  ace). If the for
17a00 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65  mer, then *ppFre
17a10 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  e is set to a po
17a20 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c  inter that shoul
17a30 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c  d.** be eventual
17a40 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20  ly freed by the 
17a50 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
17a60 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72  ite3DbFree(). Or
17a70 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c  , if the .** all
17a80 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72  ocation comes fr
17a90 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a  om the pSpace/sz
17aa0 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70  Space buffer, *p
17ab0 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
17ac0 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72  NULL.** before r
17ad0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
17ae0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
17af0 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
17b00 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70  returned..*/.Unp
17b10 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
17b20 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
17b30 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b  ackedRecord(.  K
17b40 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
17b50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17b60 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
17b70 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
17b80 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20   char *pSpace,  
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ba0 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70   /* Unaligned sp
17bb0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  ace available */
17bc0 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20  .  int szSpace, 
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53     /* Size of pS
17bf0 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20  pace[] in bytes 
17c00 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72  */.  char **ppFr
17c10 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
17c20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c       /* OUT: Cal
17c30 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20  ler should free 
17c40 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  this pointer */.
17c50 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  ){.  UnpackedRec
17c60 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ord *p;         
17c70 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
17c80 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72   record to retur
17c90 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b  n */.  int nOff;
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cb0 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d         /* Increm
17cc0 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f  ent pSpace by nO
17cd0 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a  ff to align it *
17ce0 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17d10 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
17d20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20  for *p */..  /* 
17d30 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74  We want to shift
17d40 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70   the pointer pSp
17d50 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74  ace up such that
17d60 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c   it is 8-byte al
17d70 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73  igned..  ** Thus
17d80 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c  , we need to cal
17d90 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20  culate a value, 
17da0 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20  nOff, between 0 
17db0 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20  and 7, to shift 
17dc0 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66  .  ** it by.  If
17dd0 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61   pSpace is alrea
17de0 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  dy 8-byte aligne
17df0 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62  d, nOff should b
17e00 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e  e zero..  */.  n
17e10 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49  Off = (8 - (SQLI
17e20 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53  TE_PTR_TO_INT(pS
17e30 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b  pace) & 7)) & 7;
17e40 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
17e50 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
17e60 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65  dRecord)) + size
17e70 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66  of(Mem)*(pKeyInf
17e80 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20  o->nField+1);.  
17e90 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63  if( nByte>szSpac
17ea0 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20  e+nOff ){.    p 
17eb0 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
17ec0 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  d *)sqlite3DbMal
17ed0 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
17ee0 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >db, nByte);.   
17ef0 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72   *ppFree = (char
17f00 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70   *)p;.    if( !p
17f10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
17f20 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55  else{.    p = (U
17f30 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26  npackedRecord*)&
17f40 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20  pSpace[nOff];.  
17f50 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20    *ppFree = 0;. 
17f60 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   }..  p->aMem = 
17f70 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
17f80 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
17f90 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
17fa0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  ];.  assert( pKe
17fb0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
17fc0 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65  r!=0 );.  p->pKe
17fd0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
17fe0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
17ff0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
18000 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   + 1;.  return p
18010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
18020 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65   the nKey-byte e
18030 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63  ncoding of a rec
18040 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70  ord in pKey[], p
18050 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20  opulate the .** 
18060 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
18070 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
18080 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68  ed by the fourth
18090 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74   argument with t
180a0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
180b0 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65  f the decoded re
180c0 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  cord..*/ .void s
180d0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
180e0 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66  Unpack(.  KeyInf
180f0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
18100 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
18110 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64  about the record
18120 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74   format */.  int
18130 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
18140 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
18150 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
18160 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
18170 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
18180 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  The binary recor
18190 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
181a0 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a  ecord *p      /*
181b0 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73   Populate this s
181c0 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20  tructure before 
181d0 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b  returning. */.){
181e0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
181f0 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
18200 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
18210 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e  har *)pKey;.  in
18220 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b  t d; .  u32 idx;
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18240 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
18250 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72  t in aKey[] to r
18260 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31  ead from */.  u1
18270 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 u;            
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18290 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
182a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  ounter */.  u32 
182b0 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d  szHdr;.  Mem *pM
182c0 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20  em = p->aMem;.. 
182d0 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d   p->default_rc =
182e0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   0;.  assert( EI
182f0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
18300 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
18310 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
18320 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
18330 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
18340 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
18350 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65  <szHdr && d<=nKe
18360 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
18370 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
18380 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
18390 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
183a0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
183b0 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
183c0 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
183d0 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
183e0 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70  fo->db;.    /* p
183f0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20  Mem->flags = 0; 
18400 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  // sqlite3VdbeSe
18410 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73  rialGet() will s
18420 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a  et this for us *
18430 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61  /.    pMem->szMa
18440 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20  lloc = 0;.    d 
18450 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
18460 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d  rialGet(&aKey[d]
18470 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70  , serial_type, p
18480 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  Mem);.    pMem++
18490 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e  ;.    if( (++u)>
184a0 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65  =p->nField ) bre
184b0 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ak;.  }.  assert
184c0 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
184d0 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70  Field + 1 );.  p
184e0 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a  ->nField = u;.}.
184f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
18500 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
18510 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
18520 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  wo index or tabl
18530 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e  e record keys in
18540 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a   the same way.**
18550 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56   as the sqlite3V
18560 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
18570 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69  () routine. Unli
18580 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  ke VdbeRecordCom
18590 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20  pare(),.** this 
185a0 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
185b0 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72  lizes and compar
185c0 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20  es values using 
185d0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  the.** sqlite3Vd
185e0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e  beSerialGet() an
185f0 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  d sqlite3MemComp
18600 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  are() functions.
18610 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69   It is used.** i
18620 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
18630 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20  ments to ensure 
18640 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
18650 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71  ed code in.** sq
18660 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
18670 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73  ompare() returns
18680 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68   results with th
18690 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76  ese two primitiv
186a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
186b0 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73   true if the res
186c0 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
186d0 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  n is equivalent 
186e0 74 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  to desiredResult
186f0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
18700 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  e if there is a 
18710 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f  disagreement..*/
18720 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
18730 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
18740 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ug(.  int nKey1,
18750 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
18760 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
18770 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63  */.  const Unpac
18780 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
18790 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20  2, /* Right key 
187a0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64  */.  int desired
187b0 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
187c0 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e     /* Correct an
187d0 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  swer */.){.  u32
187e0 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
187f0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
18800 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
18810 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
18820 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
18830 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
18840 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
18850 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
18860 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
18870 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18880 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
18890 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
188a0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
188b0 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
188c0 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
188d0 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
188e0 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
188f0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18900 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  nfo;.  Mem mem1;
18910 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ..  pKeyInfo = p
18920 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
18930 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  .  if( pKeyInfo-
18940 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  >db==0 ) return 
18950 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20  1;.  mem1.enc = 
18960 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
18970 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
18980 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65  nfo->db;.  /* me
18990 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f  m1.flags = 0;  /
189a0 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  / Will be initia
189b0 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lized by sqlite3
189c0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
189d0 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  */.  VVA_ONLY( m
189e0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
189f0 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
18a00 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
18a10 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20  tatements */..  
18a20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79  /* Compilers may
18a30 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d   complain that m
18a40 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e  em1.u.i is poten
18a50 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c  tially uninitial
18a60 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f  ized..  ** We co
18a70 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  uld initialize i
18a80 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65  t, as shown here
18a90 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f  , to silence tho
18aa0 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20  se complaints.. 
18ab0 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c   ** But in fact,
18ac0 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e   mem1.u.i will n
18ad0 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65  ever actually be
18ae0 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69   used uninitiali
18af0 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a  zed, and doing .
18b00 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73    ** the unneces
18b10 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  sary initializat
18b20 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72  ion has a measur
18b30 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65  able negative pe
18b40 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69  rformance.  ** i
18b50 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69  mpact, since thi
18b60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
18b70 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e  ery high runner.
18b80 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f    And so, we cho
18b90 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f  ose.  ** to igno
18ba0 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  re the compiler 
18bb0 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61  warnings and lea
18bc0 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ve this variable
18bd0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
18be0 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e    */.  /*  mem1.
18bf0 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74  u.i = 0;  // not
18c00 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f   needed, here to
18c10 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65   silence compile
18c20 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a  r warning */.  .
18c30 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
18c40 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
18c50 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
18c60 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  r1;.  assert( pK
18c70 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
18c80 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
18c90 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  >=pPKey2->nField
18ca0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
18cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
18cc0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
18cd0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
18ce0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
18cf0 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
18d00 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c   idx1<=szHdr1 ||
18d10 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
18d20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72   do{.    u32 ser
18d30 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20  ial_type1;..    
18d40 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
18d50 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
18d60 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
18d70 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
18d80 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72    idx1 += getVar
18d90 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78  int32( aKey1+idx
18da0 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20  1, serial_type1 
18db0 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
18dc0 79 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  y that there is 
18dd0 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65  enough key space
18de0 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76   remaining to av
18df0 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66  oid.    ** a buf
18e00 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54  fer overread.  T
18e10 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79  he "d1+serial_ty
18e20 70 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73  pe1+2" subexpres
18e30 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  sion will.    **
18e40 20 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74   always be great
18e50 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
18e60 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   to the amount o
18e70 66 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73  f required key s
18e80 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65  pace..    ** Use
18e90 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74   that approximat
18ea0 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65  ion to avoid the
18eb0 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20   more expensive 
18ec0 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
18ed0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18ee0 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65  TypeLen() in the
18ef0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
18f00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b    */.    if( d1+
18f10 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28  serial_type1+2>(
18f20 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26  u32)nKey1.     &
18f30 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65  & d1+sqlite3Vdbe
18f40 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
18f50 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32  rial_type1)>(u32
18f60 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20  )nKey1 .    ){. 
18f70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18f80 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
18f90 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
18fa0 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
18fb0 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
18fc0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
18fd0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
18fe0 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
18ff0 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
19000 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
19010 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
19020 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
19030 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
19040 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e  >aMem[i], pKeyIn
19050 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20  fo->aColl[i]);. 
19060 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
19070 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
19080 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
19090 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
190a0 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
190b0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
190c0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
190d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
190e0 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65  ;  /* Invert the
190f0 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43   result for DESC
19100 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a   sort order. */.
19110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
19120 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45  to debugCompareE
19130 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  nd;.    }.    i+
19140 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  +;.  }while( idx
19150 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
19160 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Key2->nField );.
19170 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
19180 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
19190 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
191a0 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
191b0 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
191c0 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
191d0 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
191e0 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
191f0 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
19200 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
19210 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
19220 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
19230 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20  (&mem1)..  */.  
19240 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
19250 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
19260 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
19270 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
19280 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
19290 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
192a0 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
192b0 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
192c0 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
192d0 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
192e0 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
192f0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65    */.  rc = pPKe
19300 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
19310 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64  .debugCompareEnd
19320 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  :.  if( desiredR
19330 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d  esult==0 && rc==
19340 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
19350 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
19360 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65  t<0 && rc<0 ) re
19370 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
19380 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26  siredResult>0 &&
19390 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31   rc>0 ) return 1
193a0 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ;.  if( CORRUPT_
193b0 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  DB ) return 1;. 
193c0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
193d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
193e0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
193f0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
19400 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d  ../*.** Both *pM
19410 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63  em1 and *pMem2 c
19420 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61  ontain string va
19430 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68  lues. Compare th
19440 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
19450 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
19460 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ion sequence pCo
19470 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65  ll. As usual, re
19480 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
19490 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
194a0 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a  itive value if *
194b0 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
194c0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
194d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
194e0 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74   *pMem2, respect
194f0 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69  ively. Similar i
19500 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20  n spirit to "rc 
19510 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70  = (*pMem1) - (*p
19520 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74  Mem2);"..*/.stat
19530 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61  ic int vdbeCompa
19540 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63  reMemString(.  c
19550 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
19560 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
19570 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  em2,.  const Col
19580 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75  lSeq *pColl,.  u
19590 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20  8 *prcErr       
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
195b0 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  * If an OOM occu
195c0 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54  rs, set to SQLIT
195d0 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20  E_NOMEM */.){.  
195e0 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  if( pMem1->enc==
195f0 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
19600 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73    /* The strings
19610 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
19620 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f  the correct enco
19630 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a  ding.  Call the.
19640 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
19650 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65  on function dire
19660 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  ctly */.    retu
19670 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70  rn pColl->xCmp(p
19680 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d  Coll->pUser,pMem
19690 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d  1->n,pMem1->z,pM
196a0 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29  em2->n,pMem2->z)
196b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
196c0 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74  nt rc;.    const
196d0 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a   void *v1, *v2;.
196e0 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a      int n1, n2;.
196f0 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20      Mem c1;.    
19700 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69  Mem c2;.    sqli
19710 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
19720 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c1, pMem1->db, M
19730 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
19740 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
19750 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c  (&c2, pMem1->db,
19760 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
19770 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
19780 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70  allowCopy(&c1, p
19790 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem1, MEM_Ephem)
197a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
197b0 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
197c0 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f  &c2, pMem2, MEM_
197d0 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d  Ephem);.    v1 =
197e0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
197f0 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
19800 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c1, pColl->en
19810 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d  c);.    n1 = v1=
19820 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20  =0 ? 0 : c1.n;. 
19830 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56     v2 = sqlite3V
19840 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
19850 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43  3_value*)&c2, pC
19860 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e  oll->enc);.    n
19870 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20  2 = v2==0 ? 0 : 
19880 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70  c2.n;.    rc = p
19890 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
198a0 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c  ->pUser, n1, v1,
198b0 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73 71   n2, v2);.    sq
198c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
198d0 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71  ase(&c1);.    sq
198e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
198f0 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 69 66  ase(&c2);.    if
19900 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d  ( (v1==0 || v2==
19910 30 29 20 26 26 20 70 72 63 45 72 72 20 29 20 2a  0) && prcErr ) *
19920 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f  prcErr = SQLITE_
19930 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72  NOMEM;.    retur
19940 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  n rc;.  }.}../*.
19950 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62  ** Compare two b
19960 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  lobs.  Return ne
19970 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
19980 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
19990 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73   first.** is les
199a0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
199b0 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
199c0 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65  n the second, re
199d0 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49  spectively..** I
199e0 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20  f one blob is a 
199f0 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74  prefix of the ot
19a00 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68  her, then the sh
19a10 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73  orter is the les
19a20 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  sor..*/.static S
19a30 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
19a40 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  nt sqlite3BlobCo
19a50 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
19a60 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  *pB1, const Mem 
19a70 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 20 3d  *pB2){.  int c =
19a80 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20   memcmp(pB1->z, 
19a90 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70  pB2->z, pB1->n>p
19aa0 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a  B2->n ? pB2->n :
19ab0 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20   pB1->n);.  if( 
19ac0 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20  c ) return c;.  
19ad0 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d 20  return pB1->n - 
19ae0 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pB2->n;.}.../*.*
19af0 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61  * Compare the va
19b00 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62  lues contained b
19b10 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79  y the two memory
19b20 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e   cells, returnin
19b30 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a  g.** negative, z
19b40 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ero or positive 
19b50 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  if pMem1 is less
19b60 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
19b70 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74   or greater.** t
19b80 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69  han pMem2. Sorti
19b90 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c  ng order is NULL
19ba0 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77  's first, follow
19bb0 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69  ed by numbers (i
19bc0 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72  ntegers.** and r
19bd0 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d  eals) sorted num
19be0 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77  erically, follow
19bf0 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72  ed by text order
19c00 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74  ed by the collat
19c10 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
19c20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c  pColl and finall
19c30 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64  y blob's ordered
19c40 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a   by memcmp()..**
19c50 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c  .** Two NULL val
19c60 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
19c70 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73  ed equal by this
19c80 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
19c90 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  t sqlite3MemComp
19ca0 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
19cb0 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  Mem1, const Mem 
19cc0 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f  *pMem2, const Co
19cd0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
19ce0 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69   int f1, f2;.  i
19cf0 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  nt combined_flag
19d00 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31  s;..  f1 = pMem1
19d10 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20  ->flags;.  f2 = 
19d20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20  pMem2->flags;.  
19d30 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d  combined_flags =
19d40 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74   f1|f2;.  assert
19d50 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  ( (combined_flag
19d60 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
19d70 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20  =0 );. .  /* If 
19d80 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  one value is NUL
19d90 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  L, it is less th
19da0 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66  an the other. If
19db0 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a   both values.  *
19dc0 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75  * are NULL, retu
19dd0 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
19de0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
19df0 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
19e00 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e  return (f2&MEM_N
19e10 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e  ull) - (f1&MEM_N
19e20 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ull);.  }..  /* 
19e30 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
19e40 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  a number and the
19e50 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20 74   other is not, t
19e60 68 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  he number is les
19e70 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20  s..  ** If both 
19e80 61 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d  are numbers, com
19e90 70 61 72 65 20 61 73 20 72 65 61 6c 73 20 69 66  pare as reals if
19ea0 20 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c 20   one is a real, 
19eb0 6f 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a 20  or as integers. 
19ec0 20 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c 75   ** if both valu
19ed0 65 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e  es are integers.
19ee0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
19ef0 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f  ined_flags&(MEM_
19f00 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b  Int|MEM_Real) ){
19f10 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20  .    double r1, 
19f20 72 32 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20  r2;.    if( (f1 
19f30 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21  & f2 & MEM_Int)!
19f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
19f50 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65  pMem1->u.i < pMe
19f60 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
19f70 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
19f80 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d  Mem1->u.i > pMem
19f90 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
19fa0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
19fb0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
19fc0 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f1&MEM_Real)!=
19fd0 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 ){.      r1 = 
19fe0 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a 20 20 20 20  pMem1->u.r;.    
19ff0 7d 65 6c 73 65 20 69 66 28 20 28 66 31 26 4d 45  }else if( (f1&ME
1a000 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1a010 20 20 20 72 31 20 3d 20 28 64 6f 75 62 6c 65 29     r1 = (double)
1a020 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20 20  pMem1->u.i;.    
1a030 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1a040 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1a050 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61   if( (f2&MEM_Rea
1a060 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  l)!=0 ){.      r
1a070 32 20 3d 20 70 4d 65 6d 32 2d 3e 75 2e 72 3b 0a  2 = pMem2->u.r;.
1a080 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
1a090 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  2&MEM_Int)!=0 ){
1a0a0 0a 20 20 20 20 20 20 72 32 20 3d 20 28 64 6f 75  .      r2 = (dou
1a0b0 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b 0a  ble)pMem2->u.i;.
1a0c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a0d0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1a0e0 7d 0a 20 20 20 20 69 66 28 20 72 31 3c 72 32 20  }.    if( r1<r2 
1a0f0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1a100 20 69 66 28 20 72 31 3e 72 32 20 29 20 72 65 74   if( r1>r2 ) ret
1a110 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72  urn 1;.    retur
1a120 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
1a130 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
1a140 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
1a150 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c  other is a blob,
1a160 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c   the string is l
1a170 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74  ess..  ** If bot
1a180 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63  h are strings, c
1a190 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65  ompare using the
1a1a0 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
1a1b0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1a1c0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1a1d0 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
1a1e0 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72  f( (f1 & MEM_Str
1a1f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1a200 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1a210 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f    if( (f2 & MEM_
1a220 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1a230 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1a240 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1a250 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32  Mem1->enc==pMem2
1a260 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  ->enc );.    ass
1a270 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1a280 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  =SQLITE_UTF8 || 
1a290 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65  .            pMe
1a2a0 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1a2b0 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31  UTF16LE || pMem1
1a2c0 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1a2d0 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  F16BE );..    /*
1a2e0 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
1a2f0 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20  equence must be 
1a300 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20  defined at this 
1a310 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20  point, even if. 
1a320 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64     ** the user d
1a330 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61  eletes the colla
1a340 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66  tion sequence af
1a350 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f  ter the vdbe pro
1a360 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63  gram is.    ** c
1a370 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61  ompiled (this wa
1a380 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65  s not always the
1a390 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   case)..    */. 
1a3a0 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c     assert( !pCol
1a3b0 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l || pColl->xCmp
1a3c0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f   );..    if( pCo
1a3d0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
1a3e0 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65  rn vdbeCompareMe
1a3f0 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70  mString(pMem1, p
1a400 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b  Mem2, pColl, 0);
1a410 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66  .    }.    /* If
1a420 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
1a430 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68  was passed as th
1a440 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69  e collate functi
1a450 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  on, fall through
1a460 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62  .    ** to the b
1a470 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65  lob case and use
1a480 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20   memcmp().  */. 
1a490 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76   }. .  /* Both v
1a4a0 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c  alues must be bl
1a4b0 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73  obs.  Compare us
1a4c0 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  ing memcmp().  *
1a4d0 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
1a4e0 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d  e3BlobCompare(pM
1a4f0 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a  em1, pMem2);.}..
1a500 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
1a510 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1a520 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1a530 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79  n is a serial-ty
1a540 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65  pe that.** corre
1a550 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74  sponds to an int
1a560 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65  eger - all value
1a570 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
1a580 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20  9 inclusive .** 
1a590 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65  except 7. The se
1a5a0 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61  cond points to a
1a5b0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1a5c0 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ng an integer va
1a5d0 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65  lue.** serialize
1a5e0 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73  d according to s
1a5f0 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73  erial_type. This
1a600 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
1a610 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65  alizes.** and re
1a620 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e  turns the value.
1a630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76  .*/.static i64 v
1a640 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
1a650 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  nt(u32 serial_ty
1a660 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  pe, const u8 *aK
1a670 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20  ey){.  u32 y;.  
1a680 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1a690 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  DB || (serial_ty
1a6a0 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f  pe>=1 && serial_
1a6b0 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61  type<=9 && seria
1a6c0 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20  l_type!=7) );.  
1a6d0 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
1a6e0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
1a6f0 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20  0:.    case 1:. 
1a700 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1a710 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1a720 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f       return ONE_
1a730 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1a740 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20      case 2:.    
1a750 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1a760 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1a770 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54    return TWO_BYT
1a780 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1a790 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74   case 3:.      t
1a7a0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1a7b0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1a7c0 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45  eturn THREE_BYTE
1a7d0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1a7e0 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20  case 4: {.      
1a7f0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1a800 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1a810 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1a820 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1a830 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e  return (i64)*(in
1a840 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20  t*)&y;.    }.   
1a850 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20   case 5: {.     
1a860 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1a870 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1a880 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54   return FOUR_BYT
1a890 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1a8a0 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1a8b0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1a8c0 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  y);.    }.    ca
1a8d0 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36  se 6: {.      u6
1a8e0 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
1a8f0 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1a900 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1a910 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1a920 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1a930 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1a940 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65  Key+4);.      re
1a950 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a  turn (i64)*(i64*
1a960 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  )&x;.    }.  }..
1a970 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
1a980 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f  _type - 8);.}../
1a990 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a9a0 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  on compares the 
1a9b0 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f  two table rows o
1a9c0 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  r index records.
1a9d0 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
1a9e0 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
1a9f0 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72  nd pPKey2.  It r
1aa00 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76  eturns a negativ
1aa10 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
1aa20 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
1aa30 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  f key1 is less t
1aa40 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1aa50 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
1aa60 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b  n key2.  The {nK
1aa70 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20  ey1, pKey1} key 
1aa80 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a  must be a blob.*
1aa90 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
1aaa0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1aab0 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
1aac0 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
1aad0 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
1aae0 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
1aaf0 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
1ab00 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
1ab10 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
1ab20 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53  * If argument bS
1ab30 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
1ab40 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1ab50 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
1ab60 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65  as already.** de
1ab70 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1ab80 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1ab90 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  f the keys are e
1aba0 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31  qual..**.** Key1
1abb0 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74   and Key2 do not
1abc0 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e   have to contain
1abd0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1abe0 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61   of fields. If a
1abf0 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68  ll .** fields th
1ac00 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74  at appear in bot
1ac10 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  h keys are equal
1ac20 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64  , then pPKey2->d
1ac30 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a  efault_rc is .**
1ac40 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1ac50 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   If database cor
1ac60 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f  ruption is disco
1ac70 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79  vered, set pPKey
1ac80 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a  2->errCode to .*
1ac90 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
1aca0 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49   and return 0. I
1acb0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
1acc0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a  s encountered, .
1acd0 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  ** pPKey2->errCo
1ace0 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  de is set to SQL
1acf0 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69  ITE_NOMEM and, i
1ad00 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
1ad10 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d  , the.** malloc-
1ad20 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20  failed flag set 
1ad30 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
1ad40 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79  le (pPKey2->pKey
1ad50 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 73 74  Info->db)..*/.st
1ad60 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1ad70 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1ad80 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ip(.  int nKey1,
1ad90 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1ada0 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1adb0 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1adc0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20  ecord *pPKey2,  
1add0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1ade0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b  key */.  int bSk
1adf0 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ip              
1ae00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1ae10 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69  rue, skip the fi
1ae20 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  rst field */.){.
1ae30 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae50 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1ae60 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1ae70 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1ae80 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aea0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
1aeb0 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70  xt field to comp
1aec0 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  are */.  u32 szH
1aed0 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
1aee0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1aef0 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65   of record heade
1af00 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
1af10 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af30 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
1af40 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65  st type in heade
1af50 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
1af60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1af70 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1af80 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20   value */.  Mem 
1af90 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e  *pRhs = pPKey2->
1afa0 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e  aMem;       /* N
1afb0 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  ext field of pPK
1afc0 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  ey2 to compare *
1afd0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1afe0 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
1aff0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73  pKeyInfo;.  cons
1b000 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1b010 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1b020 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1b030 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d  pKey1;.  Mem mem
1b040 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69  1;..  /* If bSki
1b050 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  p is true, then 
1b060 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1b070 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65  lready determine
1b080 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1b090 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e  .  ** two elemen
1b0a0 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61  ts in the keys a
1b0b0 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68  re equal. Fix th
1b0c0 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20  e various stack 
1b0d0 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a  variables so.  *
1b0e0 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  * that this rout
1b0f0 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61  ine begins compa
1b100 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f  ring at the seco
1b110 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69  nd field. */.  i
1b120 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( bSkip ){.    
1b130 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31  u32 s1;.    idx1
1b140 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74   = 1 + getVarint
1b150 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31  32(&aKey1[1], s1
1b160 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20  );.    szHdr1 = 
1b170 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31  aKey1[0];.    d1
1b180 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69   = szHdr1 + sqli
1b190 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1b1a0 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20  eLen(s1);.    i 
1b1b0 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  = 1;.    pRhs++;
1b1c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
1b1d0 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
1b1e0 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
1b1f0 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1b200 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e  ;.    if( d1>(un
1b210 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20  signed)nKey1 ){ 
1b220 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
1b230 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1b240 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1b250 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1b260 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e  ;  /* Corruption
1b270 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20   */.    }.    i 
1b280 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f  = 0;.  }..  VVA_
1b290 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1b2a0 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1b2b0 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1b2c0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b2d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1b2e0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1b2f0 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70  nField+pPKey2->p
1b300 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1b310 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  >=pPKey2->nField
1b320 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52   .       || CORR
1b330 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
1b340 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1b350 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1b360 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1b370 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1b380 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20  o->nField>0 );. 
1b390 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
1b3a0 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
1b3b0 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
1b3c0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1b3d0 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  ;..    /* RHS is
1b3e0 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20   an integer */. 
1b3f0 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61     if( pRhs->fla
1b400 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
1b410 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1b420 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1b430 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b440 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1b450 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1b460 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
1b470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1b480 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1b490 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
1b4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b4b0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1b4c0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1b4d0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==7 ){.        d
1b4e0 6f 75 62 6c 65 20 72 68 73 20 3d 20 28 64 6f 75  ouble rhs = (dou
1b4f0 62 6c 65 29 70 52 68 73 2d 3e 75 2e 69 3b 0a 20  ble)pRhs->u.i;. 
1b500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b510 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1b520 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1b530 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  ype, &mem1);.   
1b540 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e       if( mem1.u.
1b550 72 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  r<rhs ){.       
1b560 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1b570 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65      }else if( me
1b580 6d 31 2e 75 2e 72 3e 72 68 73 20 29 7b 0a 20 20  m1.u.r>rhs ){.  
1b590 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1b5a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b5b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b5c0 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65  i64 lhs = vdbeRe
1b5d0 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65  cordDecodeInt(se
1b5e0 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79  rial_type, &aKey
1b5f0 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  1[d1]);.        
1b600 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  i64 rhs = pRhs->
1b610 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  u.i;.        if(
1b620 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
1b630 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1b640 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1b650 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
1b660 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1b670 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b680 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1b690 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20  HS is real */.  
1b6a0 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1b6b0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
1b6c0 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  l ){.      seria
1b6d0 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1b6e0 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  dx1];.      if( 
1b6f0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
1b700 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b710 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1b720 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1b730 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1b740 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1b750 73 65 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62  se{.        doub
1b760 6c 65 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75  le rhs = pRhs->u
1b770 2e 72 3b 0a 20 20 20 20 20 20 20 20 64 6f 75 62  .r;.        doub
1b780 6c 65 20 6c 68 73 3b 0a 20 20 20 20 20 20 20 20  le lhs;.        
1b790 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b7a0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1b7b0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1b7c0 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  em1);.        if
1b7d0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1b7e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68   ){.          lh
1b7f0 73 20 3d 20 6d 65 6d 31 2e 75 2e 72 3b 0a 20 20  s = mem1.u.r;.  
1b800 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b810 20 20 20 20 20 20 20 6c 68 73 20 3d 20 28 64 6f         lhs = (do
1b820 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20  uble)mem1.u.i;. 
1b830 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b840 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
1b850 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1b860 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1b870 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
1b880 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
1b890 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1b8a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1b8b0 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69  /* RHS is a stri
1b8c0 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ng */.    else i
1b8d0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1b8e0 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
1b8f0 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1b900 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
1b910 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
1b920 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1b930 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1b940 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1b950 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20  pe<12 ){.       
1b960 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1b970 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
1b980 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1b990 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b9a0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1b9b0 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20  .        mem1.n 
1b9c0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
1b9d0 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
1b9e0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1b9f0 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e  mem1.n)==(unsign
1ba00 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1ba10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1ba20 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e  1+mem1.n+1)==(un
1ba30 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1ba40 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1ba50 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67  mem1.n) > (unsig
1ba60 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1ba70 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1ba80 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1ba90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1baa0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1bab0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1bac0 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1bad0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1bae0 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
1baf0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  ->aColl[i] ){.  
1bb00 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63          mem1.enc
1bb10 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1bb20 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1bb30 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1bb40 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  db;.          me
1bb50 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m1.flags = MEM_S
1bb60 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  tr;.          me
1bb70 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61  m1.z = (char*)&a
1bb80 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20  Key1[d1];.      
1bb90 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
1bba0 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65               &me
1bbc0 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e  m1, pRhs, pKeyIn
1bbd0 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70  fo->aColl[i], &p
1bbe0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20  PKey2->errCode. 
1bbf0 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1bc00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bc10 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1bc20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73  MIN(mem1.n, pRhs
1bc30 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1bc40 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1bc50 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1bc60 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1bc70 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1bc80 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73   = mem1.n - pRhs
1bc90 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ->n; .        }.
1bca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1bcb0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62     /* RHS is a b
1bcc0 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  lob */.    else 
1bcd0 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1bce0 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  & MEM_Blob ){.  
1bcf0 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1bd00 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1bd10 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1bd20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1bd30 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1bd40 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1bd50 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69  type<12 || (seri
1bd60 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1bd70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1bd80 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1bd90 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74  .        int nSt
1bda0 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1bdb0 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1bdc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1bdd0 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e  1+nStr)==(unsign
1bde0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1bdf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1be00 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69  1+nStr+1)==(unsi
1be10 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1be20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53        if( (d1+nS
1be30 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  tr) > (unsigned)
1be40 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1be50 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1be60 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1be70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1be80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1be90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bea0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1beb0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1bec0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1bed0 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20  Cmp = MIN(nStr, 
1bee0 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1bef0 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1bf00 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1bf10 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1bf20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1bf30 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52  ) rc = nStr - pR
1bf40 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d  hs->n;.        }
1bf50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1bf60 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75      /* RHS is nu
1bf70 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a  ll */.    else{.
1bf80 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1bf90 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1bfa0 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72  .      rc = (ser
1bfb0 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20  ial_type!=0);.  
1bfc0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
1bfd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1bfe0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1bff0 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1c000 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20     rc = -rc;.   
1c010 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1c020 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1c030 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1c040 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1c050 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
1c060 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1c070 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1c080 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1c090 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
1c0a0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
1c0b0 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  +;.    pRhs++;. 
1c0c0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1c0d0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1c0e0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
1c0f0 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
1c100 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
1c110 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68  ial_type);.  }wh
1c120 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67  ile( idx1<(unsig
1c130 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c  ned)szHdr1 && i<
1c140 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26  pPKey2->nField &
1c150 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29  & d1<=(unsigned)
1c160 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e  nKey1 );..  /* N
1c170 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1c180 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1c190 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1c1a0 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1c1b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1c1c0 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1c1d0 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1c1e0 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1c1f0 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1c200 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1c210 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1c220 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1c230 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c240 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1c250 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1c260 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1c270 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  one or both of t
1c280 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1c290 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1c2a0 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1c2b0 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1c2c0 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1c2d0 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1c2e0 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1c2f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43    */.  assert( C
1c300 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20  ORRUPT_DB .     
1c310 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43    || vdbeRecordC
1c320 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1c330 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1c340 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  , pPKey2->defaul
1c350 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c  t_rc) .       ||
1c360 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1c370 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
1c380 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32  .  return pPKey2
1c390 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a  ->default_rc;.}.
1c3a0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
1c3b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
1c3c0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1c3d0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
1c3e0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1c3f0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c400 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 20  *pPKey2         
1c410 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1c420 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 64 62  .){.  return vdb
1c430 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
1c440 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
1c450 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b  ey1, pPKey2, 0);
1c460 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1c470 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
1c480 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
1c490 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
1c4a0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
1c4b0 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
1c4c0 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
1c4d0 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65  PKey2 is an inte
1c4e0 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65  ger, and (b) the
1c4f0 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61   .** size-of-hea
1c500 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68  der varint at th
1c510 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
1c520 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
1c530 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74   a single.** byt
1c540 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20  e (i.e. is less 
1c550 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a  than 128)..**.**
1c560 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72   To avoid concer
1c570 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20  ns about buffer 
1c580 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20  overreads, this 
1c590 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
1c5a0 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d  used.** on schem
1c5b0 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78  as where the max
1c5c0 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65  imum valid heade
1c5d0 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74  r size is 63 byt
1c5e0 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73  es or less..*/.s
1c5f0 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1c600 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a  cordCompareInt(.
1c610 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1c620 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1c630 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1c640 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c650 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
1c660 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
1c670 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
1c680 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38  ey = &((const u8
1c690 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74  *)pKey1)[*(const
1c6a0 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33   u8*)pKey1 & 0x3
1c6b0 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  F];.  int serial
1c6c0 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20  _type = ((const 
1c6d0 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20  u8*)pKey1)[1];. 
1c6e0 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20   int res;.  u32 
1c6f0 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36  y;.  u64 x;.  i6
1c700 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d  4 v = pPKey2->aM
1c710 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34  em[0].u.i;.  i64
1c720 20 6c 68 73 3b 0a 0a 20 20 61 73 73 65 72 74 28   lhs;..  assert(
1c730 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d   (*(u8*)pKey1)<=
1c740 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f  0x3F || CORRUPT_
1c750 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  DB );.  switch( 
1c760 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1c770 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
1c780 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
1c790 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
1c7a0 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  hs = ONE_BYTE_IN
1c7b0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1c7c0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1c7d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c7e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
1c7f0 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
1c800 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1c810 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42       lhs = TWO_B
1c820 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1c830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1c840 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1c850 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c860 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
1c870 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c880 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1c890 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1c8a0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1c8b0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1c8c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c8d0 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
1c8e0 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
1c8f0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1c900 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1c910 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1c920 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28     lhs = (i64)*(
1c930 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74  int*)&y;.      t
1c940 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1c950 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c960 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1c970 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
1c980 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1c990 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f       lhs = FOUR_
1c9a0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1c9b0 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1c9c0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1c9d0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1c9e0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1c9f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ca00 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
1ca10 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
1ca20 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1ca30 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45     x = FOUR_BYTE
1ca40 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1ca50 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1ca60 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1ca70 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c  aKey+4);.      l
1ca80 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  hs = *(i64*)&x;.
1ca90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1caa0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1cab0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1cac0 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c  case 8: .      l
1cad0 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  hs = 0;.      br
1cae0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a  eak;.    case 9:
1caf0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a  .      lhs = 1;.
1cb00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
1cb10 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63    /* This case c
1cb20 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20  ould be removed 
1cb30 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
1cb40 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1cb50 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  running.    ** t
1cb60 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64  his code. Includ
1cb70 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63  ing it causes gc
1cb80 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  c to generate a 
1cb90 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20  faster switch . 
1cba0 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
1cbb0 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65  (since the range
1cbc0 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65   of switch targe
1cbd0 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74  ts now starts at
1cbe0 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a   zero and.    **
1cbf0 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20   is contiguous) 
1cc00 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  but does not cau
1cc10 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65  se any duplicate
1cc20 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65   code to be gene
1cc30 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73  rated.    ** (as
1cc40 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65   gcc is clever e
1cc50 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65  nough to combine
1cc60 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61   the two like ca
1cc70 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20  ses). Other .   
1cc80 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69   ** compilers mi
1cc90 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20  ght be similar. 
1cca0 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a   */ .    case 0:
1ccb0 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72   case 7:.      r
1ccc0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1ccd0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1cce0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1ccf0 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  ey2);..    defau
1cd00 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
1cd10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1cd20 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1cd30 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
1cd40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68  .  }..  if( v>lh
1cd50 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
1cd60 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c  PKey2->r1;.  }el
1cd70 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a  se if( v<lhs ){.
1cd80 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1cd90 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r2;.  }else if
1cda0 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
1cdb0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >1 ){.    /* The
1cdc0 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1cdd0 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
1cde0 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65  e equal. Compare
1cdf0 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20   the trailing . 
1ce00 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a     ** fields.  *
1ce10 2f 0a 20 20 20 20 72 65 73 20 3d 20 76 64 62 65  /.    res = vdbe
1ce20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1ce30 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
1ce40 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
1ce50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ce60 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
1ce70 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
1ce80 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74   are equal and t
1ce90 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69  here are no trai
1cea0 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ling.    ** fiel
1ceb0 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79  ds. Return pPKey
1cec0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e  2->default_rc in
1ced0 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
1cee0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1cef0 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 7d  >default_rc;.  }
1cf00 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
1cf10 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1cf20 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1cf30 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b   pPKey2, res) );
1cf40 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
1cf50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1cf60 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1cf70 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1cf80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1cf90 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1cfa0 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1cfb0 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
1cfc0 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  y2 is a string, 
1cfd0 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72  that (b) the fir
1cfe0 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73  st field.** uses
1cff0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1d000 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61  equence BINARY a
1d010 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20  nd (c) that the 
1d020 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1d030 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65  arint .** at the
1d040 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
1d050 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
1d060 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
1d070 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1d080 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1d090 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ring(.  int nKey
1d0a0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1d0b0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1d0c0 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1d0d0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
1d0e0 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1d0f0 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
1d100 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  u8 *aKey1 = (con
1d110 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20  st u8*)pKey1;.  
1d120 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  int serial_type;
1d130 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 67  .  int res;..  g
1d140 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1d150 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  1[1], serial_typ
1d160 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e);.  if( serial
1d170 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
1d180 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
1d190 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
1d1a0 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d  /nKey1) is a num
1d1b0 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f  ber or a null */
1d1c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73  .  }else if( !(s
1d1d0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1d1e0 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d  1) ){ .    res =
1d1f0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20   pPKey2->r2;    
1d200 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
1d210 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  1) is a blob */.
1d220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1d230 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e   nCmp;.    int n
1d240 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48  Str;.    int szH
1d250 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a  dr = aKey1[0];..
1d260 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69      nStr = (seri
1d270 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b  al_type-12) / 2;
1d280 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20  .    if( (szHdr 
1d290 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20  + nStr) > nKey1 
1d2a0 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d  ){.      pPKey2-
1d2b0 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1d2c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1d2d0 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
1d2e0 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70   0;    /* Corrup
1d2f0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
1d300 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50    nCmp = MIN( pP
1d310 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c  Key2->aMem[0].n,
1d320 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73   nStr );.    res
1d330 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1d340 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d  [szHdr], pPKey2-
1d350 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70  >aMem[0].z, nCmp
1d360 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d  );..    if( res=
1d370 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  =0 ){.      res 
1d380 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d  = nStr - pPKey2-
1d390 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20  >aMem[0].n;.    
1d3a0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
1d3b0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65          if( pPKe
1d3c0 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
1d3d0 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
1d3e0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1d3f0 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
1d400 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1d410 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
1d420 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  e{.          res
1d430 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1d440 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  lt_rc;.        }
1d450 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d460 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
1d470 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1d480 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r2;.      }else{
1d490 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
1d4a0 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20  PKey2->r1;.     
1d4b0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
1d4c0 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
1d4d0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
1d4e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d4f0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1d500 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  >r1;.    }.  }..
1d510 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
1d520 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1d530 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1d540 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20  PKey2, res).    
1d550 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
1d560 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79  .       || pPKey
1d570 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  2->pKeyInfo->db-
1d580 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
1d590 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
1d5a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d5b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
1d5c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1d5d0 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70  rdCompare() comp
1d5e0 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a  atible function.
1d5f0 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
1d600 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c  comparing serial
1d610 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20  ized records to 
1d620 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63  the unpacked rec
1d630 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ord passed.** as
1d640 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
1d650 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d  nt..*/.RecordCom
1d660 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65  pare sqlite3Vdbe
1d670 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61  FindCompare(Unpa
1d680 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a  ckedRecord *p){.
1d690 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72    /* varintRecor
1d6a0 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
1d6b0 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  d varintRecordCo
1d6c0 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f  mpareString() bo
1d6d0 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74  th assume.  ** t
1d6e0 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
1d6f0 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68  header varint th
1d700 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
1d710 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72   start of each r
1d720 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20  ecord.  ** fits 
1d730 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
1d740 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72   (i.e. is 127 or
1d750 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65   less). varintRe
1d760 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
1d770 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d  .  ** also assum
1d780 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61  es that it is sa
1d790 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61  fe to overread a
1d7a0 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65   buffer by at le
1d7b0 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61  ast the .  ** ma
1d7c0 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c  ximum possible l
1d7d0 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  egal header size
1d7e0 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42   plus 8 bytes. B
1d7f0 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a  ecause there is.
1d800 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
1d810 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37  to be at least 7
1d820 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20  4 (but not 136) 
1d830 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
1d840 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a   following each.
1d850 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73    ** buffer pass
1d860 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f  ed to varintReco
1d870 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74  rdCompareInt() t
1d880 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e  his makes it con
1d890 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  venient to.  ** 
1d8a0 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f  limit the size o
1d8b0 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20  f the header to 
1d8c0 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65  64 bytes in case
1d8d0 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  s where the firs
1d8e0 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20  t field.  ** is 
1d8f0 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a  an integer..  **
1d900 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73  .  ** The easies
1d910 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65  t way to enforce
1d920 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74   this limit is t
1d930 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20  o consider only 
1d940 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a  records with.  *
1d950 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c  * 13 fields or l
1d960 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73  ess. If the firs
1d970 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e  t field is an in
1d980 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d  teger, the maxim
1d990 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65  um legal.  ** he
1d9a0 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32  ader size is (12
1d9b0 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65  *5 + 1 + 1) byte
1d9c0 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  s.  */.  if( (p-
1d9d0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1d9e0 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  d + p->pKeyInfo-
1d9f0 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b  >nXField)<=13 ){
1da00 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
1da10 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67   p->aMem[0].flag
1da20 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b  s;.    if( p->pK
1da30 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1da40 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70  er[0] ){.      p
1da50 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->r1 = 1;.      
1da60 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r2 = -1;.    
1da70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
1da80 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  r1 = -1;.      p
1da90 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ->r2 = 1;.    }.
1daa0 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
1dab0 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20   MEM_Int) ){.   
1dac0 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
1dad0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a  cordCompareInt;.
1dae0 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
1daf0 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
1db00 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Real );.    test
1db10 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
1db20 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65  M_Null );.    te
1db30 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
1db40 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
1db50 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45  if( (flags & (ME
1db60 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c  M_Real|MEM_Null|
1db70 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26  MEM_Blob))==0 &&
1db80 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   p->pKeyInfo->aC
1db90 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  oll[0]==0 ){.   
1dba0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
1dbb0 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20   & MEM_Str );.  
1dbc0 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
1dbd0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1dbe0 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ng;.    }.  }.. 
1dbf0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1dc00 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1dc10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  ;.}../*.** pCur 
1dc20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
1dc30 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
1dc40 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
1dc50 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
1dc60 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
1dc70 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
1dc80 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
1dc90 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
1dca0 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
1dcb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
1dcc0 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
1dcd0 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
1dce0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1dcf0 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
1dd00 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
1dd10 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
1dd20 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
1dd30 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
1dd40 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
1dd50 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
1dd60 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
1dd70 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
1dd80 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
1dd90 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
1dda0 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
1ddb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1ddc0 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
1ddd0 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
1dde0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
1ddf0 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
1de00 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
1de10 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
1de20 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
1de30 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
1de40 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
1de50 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
1de60 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
1de70 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
1de80 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
1de90 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
1dea0 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69  x entry.  Only i
1deb0 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f  ndices entries o
1dec0 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  f less.  ** than
1ded0 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72   2GiB are suppor
1dee0 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72  t - anything lar
1def0 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62  ge must be datab
1df00 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1df10 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74    ** Any corrupt
1df20 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
1df30 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  in sqlite3BtreeP
1df40 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74  arseCellPtr(), t
1df50 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74  hough, so.  ** t
1df60 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66  his code can saf
1df70 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20  ely assume that 
1df80 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62  nCellKey is 32-b
1df90 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73  its  .  */.  ass
1dfa0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1dfb0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
1dfc0 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e  Cur) );.  VVA_ON
1dfd0 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33  LY(rc =) sqlite3
1dfe0 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
1dff0 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
1e000 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1e010 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a  ITE_OK );     /*
1e020 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
1e030 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
1e040 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
1e050 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c    assert( (nCell
1e060 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58  Key & SQLITE_MAX
1e070 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c  _U32)==(u64)nCel
1e080 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  lKey );..  /* Re
1e090 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65  ad in the comple
1e0a0 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  te content of th
1e0b0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f  e index entry */
1e0c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
1e0d0 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
1e0e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1e0f0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
1e100 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
1e110 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
1e120 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1e130 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1e140 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
1e150 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
1e160 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
1e170 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
1e180 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
1e190 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
1e1a0 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
1e1b0 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
1e1c0 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
1e1d0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a   if( unlikely(sz
1e1e0 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a  Hdr<3 || (int)sz
1e1f0 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20  Hdr>m.n) ){.    
1e200 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
1e210 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
1e220 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69    /* The last fi
1e230 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  eld of the index
1e240 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
1e250 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49  teger - the ROWI
1e260 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  D..  ** Verify t
1e270 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  hat the last ent
1e280 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  ry really is an 
1e290 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76  integer. */.  (v
1e2a0 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
1e2b0 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
1e2c0 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
1e2d0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1e2e0 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65  Rowid==1 );.  te
1e2f0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1e300 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61  d==2 );.  testca
1e310 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33  se( typeRowid==3
1e320 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1e330 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a  typeRowid==4 );.
1e340 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1e350 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65  Rowid==5 );.  te
1e360 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1e370 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61  d==6 );.  testca
1e380 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38  se( typeRowid==8
1e390 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1e3a0 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a  typeRowid==9 );.
1e3b0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74    if( unlikely(t
1e3c0 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79  ypeRowid<1 || ty
1e3d0 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70  peRowid>9 || typ
1e3e0 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20  eRowid==7) ){.  
1e3f0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
1e400 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
1e410 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
1e420 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1e430 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
1e440 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
1e450 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
1e460 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
1e470 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
1e480 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
1e490 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
1e4a0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1e4b0 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
1e4c0 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
1e4d0 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
1e4e0 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
1e4f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1e500 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
1e510 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
1e520 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
1e530 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
1e540 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
1e550 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1e560 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1e570 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
1e580 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
1e590 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1e5a0 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
1e5b0 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
1e5c0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
1e5d0 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
1e5e0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1e5f0 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
1e600 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
1e610 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
1e620 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  szMalloc!=0 );. 
1e630 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1e640 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
1e650 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e660 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
1e670 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
1e680 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
1e690 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
1e6a0 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
1e6b0 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
1e6c0 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
1e6d0 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
1e6e0 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
1e6f0 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
1e700 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
1e710 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1e720 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
1e730 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
1e740 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
1e750 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
1e760 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1e770 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
1e780 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
1e790 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
1e7a0 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
1e7b0 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
1e7c0 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
1e7d0 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
1e7e0 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
1e7f0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1e800 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
1e810 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
1e820 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
1e830 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
1e840 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
1e850 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
1e860 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
1e870 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
1e880 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
1e890 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e8a0 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
1e8b0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1e8c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e8d0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1e8e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1e8f0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1e900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e910 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1e920 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
1e930 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
1e940 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
1e950 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70  ed,       /* Unp
1e960 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
1e970 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72   key */.  int *r
1e980 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
1e990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1e9a0 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
1e9b0 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
1e9c0 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
1e9d0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
1e9e0 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
1e9f0 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
1ea00 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
1ea10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1ea20 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
1ea30 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f  (pCur) );.  VVA_
1ea40 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
1ea50 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
1ea60 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
1ea70 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
1ea80 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f  QLITE_OK );    /
1ea90 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73  * pCur is always
1eaa0 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a   valid so KeySiz
1eab0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  e cannot fail */
1eac0 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77  .  /* nCellKey w
1ead0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65  ill always be be
1eae0 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66  tween 0 and 0xff
1eaf0 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f  ffffff because o
1eb00 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74  f the way.  ** t
1eb10 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65  hat btreeParseCe
1eb20 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69  llPtr() and sqli
1eb30 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
1eb40 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
1eb50 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b   */.  if( nCellK
1eb60 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
1eb70 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  y>0x7fffffff ){.
1eb80 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
1eb90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1eba0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ebb0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  }.  sqlite3VdbeM
1ebc0 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
1ebd0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1ebe0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
1ebf0 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
1ec00 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
1ec10 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
1ec20 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1ec30 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
1ec40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1ec50 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
1ec60 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
1ec70 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1ec80 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
1ec90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1eca0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1ecb0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
1ecc0 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
1ecd0 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
1ece0 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
1ecf0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
1ed00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1ed10 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
1ed20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
1ed30 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
1ed40 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
1ed50 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
1ed60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1ed70 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
1ed80 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
1ed90 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
1eda0 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
1edb0 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
1edc0 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
1edd0 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
1ede0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
1edf0 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
1ee00 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
1ee10 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
1ee20 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
1ee30 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
1ee40 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
1ee50 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
1ee60 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
1ee70 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1ee80 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ee90 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
1eea0 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
1eeb0 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
1eec0 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
1eed0 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
1eee0 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
1eef0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
1ef00 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
1ef10 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
1ef20 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
1ef30 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
1ef40 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
1ef50 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
1ef60 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
1ef70 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
1ef80 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
1ef90 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
1efa0 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
1efb0 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
1efc0 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
1efd0 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
1efe0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
1eff0 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
1f000 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
1f010 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
1f020 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
1f030 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
1f040 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
1f050 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
1f060 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
1f070 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
1f080 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1f090 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
1f0a0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
1f0b0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
1f0c0 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
1f0d0 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
1f0e0 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
1f0f0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1f100 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
1f110 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
1f120 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
1f130 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
1f140 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
1f150 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
1f160 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
1f170 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
1f180 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
1f190 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
1f1a0 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
1f1b0 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
1f1c0 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
1f1d0 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
1f1e0 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
1f1f0 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
1f200 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
1f210 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
1f220 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1f230 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
1f240 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
1f250 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
1f260 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
1f270 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
1f280 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
1f290 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
1f2a0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
1f2b0 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
1f2c0 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
1f2d0 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
1f2e0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
1f2f0 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
1f300 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1f310 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
1f320 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
1f330 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
1f340 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f350 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
1f360 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
1f370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f380 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
1f390 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
1f3a0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
1f3b0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1f3c0 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
1f3d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1f3e0 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1f3f0 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
1f400 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
1f410 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
1f420 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
1f430 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
1f440 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
1f450 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
1f460 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
1f470 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
1f480 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
1f490 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1f4a0 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
1f4b0 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
1f4c0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
1f4d0 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
1f4e0 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
1f4f0 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
1f500 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
1f510 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
1f520 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
1f530 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
1f540 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1f550 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
1f560 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
1f570 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
1f580 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
1f590 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
1f5a0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
1f5b0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1f5c0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
1f5d0 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
1f5e0 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
1f5f0 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
1f600 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1f610 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
1f620 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
1f630 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
1f640 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
1f650 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
1f660 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1f670 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
1f680 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
1f690 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
1f6a0 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
1f6b0 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
1f6c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1f6d0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
1f6e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
1f6f0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
1f700 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1f710 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1f720 41 42 4c 45 20 2a 2f 0a                          ABLE */.