/ Hex Artifact Content
Login

Artifact 8d101333912e33ed36201898d839cd560d8e87f4:


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 69 66 28 20 70  UALTABLE.  if( p
cdc0: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20  Cx->pVtabCursor 
cdd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
cde0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
cdf0: 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70  bCursor = pCx->p
ce00: 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20  VtabCursor;.    
ce10: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
ce20: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20  dule *pModule = 
ce30: 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
ce40: 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
ce50: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
ce60: 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c   = 1;.    pModul
ce70: 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43  e->xClose(pVtabC
ce80: 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69  ursor);.    p->i
ce90: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b  nVtabMethod = 0;
cea0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
ceb0: 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61  *.** Copy the va
cec0: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
ced0: 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72  he VdbeFrame str
cee0: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64  ucture to its Vd
cef0: 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75  be. This.** is u
cf00: 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  sed, for example
cf10: 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72  , when a trigger
cf20: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
cf30: 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72  halted to restor
cf40: 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  e.** control to 
cf50: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
cf60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cf70: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
cf80: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61  (VdbeFrame *pFra
cf90: 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  me){.  Vdbe *v =
cfa0: 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d   pFrame->v;.  v-
cfb0: 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72  >aOnceFlag = pFr
cfc0: 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a  ame->aOnceFlag;.
cfd0: 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    v->nOnceFlag =
cfe0: 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c   pFrame->nOnceFl
cff0: 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70  ag;.  v->aOp = p
d000: 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d  Frame->aOp;.  v-
d010: 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  >nOp = pFrame->n
d020: 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20  Op;.  v->aMem = 
d030: 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20  pFrame->aMem;.  
d040: 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->nMem = pFrame
d050: 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43  ->nMem;.  v->apC
d060: 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43  sr = pFrame->apC
d070: 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72  sr;.  v->nCursor
d080: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73   = pFrame->nCurs
d090: 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73  or;.  v->db->las
d0a0: 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d  tRowid = pFrame-
d0b0: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d  >lastRowid;.  v-
d0c0: 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
d0d0: 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65  e->nChange;.  re
d0e0: 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b  turn pFrame->pc;
d0f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
d100: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a  all cursors..**.
d110: 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20  ** Also release 
d120: 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  any dynamic memo
d130: 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56  ry held by the V
d140: 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d  M in the Vdbe.aM
d150: 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65  em memory .** ce
d160: 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69  ll array. This i
d170: 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
d180: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  he memory cell a
d190: 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  rray may contain
d1a0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
d1b0: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
d1c0: 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20  s, which may in 
d1d0: 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69  turn contain poi
d1e0: 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  nters to.** open
d1f0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
d200: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
d210: 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
d220: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  ){.  if( p->pFra
d230: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
d240: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20  ame *pFrame;.   
d250: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
d260: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
d270: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
d280: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
d290: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d2a0: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
d2b0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ame);.  }.  p->p
d2c0: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  Frame = 0;.  p->
d2d0: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  nFrame = 0;..  i
d2e0: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
d2f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
d300: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
d310: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
d320: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
d330: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
d340: 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
d350: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d360: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
d370: 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
d380: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
d390: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d3a0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
d3b0: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
d3c0: 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d  rray(&p->aMem[1]
d3d0: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
d3e0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c    while( p->pDel
d3f0: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
d400: 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70  eFrame *pDel = p
d410: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20  ->pDelFrame;.   
d420: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20   p->pDelFrame = 
d430: 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  pDel->pParent;. 
d440: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
d450: 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  ameDelete(pDel);
d460: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
d470: 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c  e any auxdata al
d480: 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62  locations made b
d490: 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 73 71  y the VM */.  sq
d4a0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
d4b0: 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29  uxData(p, -1, 0)
d4c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
d4d0: 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a  AuxData==0 );.}.
d4e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
d4f0: 74 68 65 20 56 4d 20 61 66 74 65 72 20 61 20 73  the VM after a s
d500: 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74  ingle run..*/.st
d510: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
d520: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  p(Vdbe *p){.  sq
d530: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
d540: 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b;..#ifdef SQLIT
d550: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65  E_DEBUG.  /* Exe
d560: 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
d570: 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
d580: 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65  re that the Vdbe
d590: 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20  .apCsr[] and .  
d5a0: 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61  ** Vdbe.aMem[] a
d5b0: 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61  rrays have alrea
d5c0: 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20  dy been cleaned 
d5d0: 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  up.  */.  int i;
d5e0: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
d5f0: 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e  ) for(i=0; i<p->
d600: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
d610: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
d620: 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]==0 );.  if( p-
d630: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72  >aMem ){.    for
d640: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
d650: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
d660: 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d  ->aMem[i].flags=
d670: 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29  =MEM_Undefined )
d680: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
d690: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d6a0: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
d6b0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
d6c0: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
d6d0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
d6e0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
d6f0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
d700: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
d710: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
d720: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
d730: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
d740: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
d750: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
d760: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
d770: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
d780: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
d790: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
d7a0: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
d7b0: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
d7c0: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
d7d0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
d7e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
d7f0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
d800: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
d810: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
d820: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
d830: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
d840: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
d850: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
d860: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
d870: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
d880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
d890: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
d8a0: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
d8b0: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
d8c0: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
d8d0: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
d8e0: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
d8f0: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
d900: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
d910: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
d920: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
d930: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
d940: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
d950: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
d960: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
d970: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
d980: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
d990: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
d9a0: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
d9b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
d9c0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
d9d0: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
d9e0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
d9f0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
da00: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
da10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
da20: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
da30: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
da40: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
da50: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
da60: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
da70: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
da80: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
da90: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
daa0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
dab0: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
dac0: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
dad0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
dae0: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
daf0: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
db00: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
db10: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
db20: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
db30: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
db40: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
db50: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
db60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
db70: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
db80: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
dbb0: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
dbc0: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbe0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
dbf0: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
dc00: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
dc30: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
dc40: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
dc50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
dc60: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
dc70: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
dc80: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
dc90: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
dca0: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
dcc0: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
dcd0: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
dce0: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
dcf0: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
dd00: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
dd10: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
dd20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
dd30: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
dd40: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
dd50: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
dd60: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
dd70: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
dd80: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
dd90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
dda0: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  M;.  }.  assert(
ddb0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
ddc0: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
ddd0: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
dde0: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
ddf0: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
de00: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
de10: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
de20: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
de30: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
de40: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
de50: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
de60: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
de70: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
de80: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
de90: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
dea0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
deb0: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
dec0: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
ded0: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
dee0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
def0: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
df00: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
df10: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
df20: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
df30: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
df40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
df50: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
df60: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
df70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
df80: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
df90: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
dfa0: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
dfb0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
dfc0: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
dfd0: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
dfe0: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
dff0: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
e000: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
e010: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e020: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
e030: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
e040: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
e050: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
e060: 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
e070: 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
e080: 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
e090: 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
e0a0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
e0b0: 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
e0c0: 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
e0d0: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
e0e0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
e0f0: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
e100: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
e110: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
e120: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
e130: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
e140: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
e150: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
e160: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
e170: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
e180: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
e190: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
e1a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
e1b0: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
e1c0: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
e1d0: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
e1e0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
e1f0: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
e200: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
e210: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
e220: 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a  tabSync(db, p);.
e230: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
e240: 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
e250: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
e260: 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
e270: 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
e280: 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
e290: 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
e2a0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
e2b0: 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
e2c0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
e2d0: 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
e2e0: 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
e2f0: 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
e300: 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
e310: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
e320: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
e330: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
e340: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
e350: 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
e360: 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
e370: 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
e380: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
e390: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
e3a0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
e3b0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e3c0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e3d0: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
e3e0: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
e3f0: 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  ){.      needXco
e400: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
e410: 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e  if( i!=1 ) nTran
e420: 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s++;.      sqlit
e430: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
e440: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
e450: 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
e460: 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42  iveLock(sqlite3B
e470: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
e480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
e490: 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
e4a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
e4b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e4c0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e4d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e4e0: 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
e4f0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
e500: 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
e510: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
e520: 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
e530: 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
e540: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
e550: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
e560: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
e570: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
e580: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
e590: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
e5a0: 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
e5b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e5c0: 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
e5d0: 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
e5e0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
e5f0: 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
e600: 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
e610: 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
e620: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
e630: 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
e640: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
e650: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
e660: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
e670: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
e680: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
e690: 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
e6a0: 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
e6b0: 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
e6c0: 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
e6d0: 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
e6e0: 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c  y: or a temp fil
e6f0: 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61  e.  In .  ** tha
e700: 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74  t case we do not
e710: 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
e720: 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
e730: 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a  ts, so use the .
e740: 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65    ** simple case
e750: 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   then too..  */.
e760: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
e770: 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
e780: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
e790: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
e7a0: 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  ).   || nTrans<=
e7b0: 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  1.  ){.    for(i
e7c0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
e7d0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
e7e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
e7f0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e800: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
e810: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
e820: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
e830: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
e840: 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
e850: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
e860: 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
e870: 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
e880: 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
e890: 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
e8a0: 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
e8b0: 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
e8c0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
e8d0: 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
e8e0: 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
e8f0: 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
e900: 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
e910: 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
e920: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
e930: 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
e940: 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
e950: 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
e960: 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
e970: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
e980: 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
e990: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
e9a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e9b0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
e9c0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
e9d0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
e9e0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
e9f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
ea00: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
ea10: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
ea20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
ea30: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
ea40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ea50: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
ea60: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
ea70: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
ea80: 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
ea90: 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
eaa0: 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
eab0: 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
eac0: 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
ead0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
eae0: 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
eaf0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
eb00: 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
eb10: 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  d atomically..  
eb20: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
eb30: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
eb40: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
eb50: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
eb60: 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
eb70: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
eb80: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
eb90: 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
eba0: 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
ebb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
ebc0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
ebd0: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
ebe0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
ebf0: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
ec00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ec10: 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
ec20: 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
ec30: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
ec40: 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79  s;.    int retry
ec50: 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  Count = 0;.    i
ec60: 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20  nt nMainFile;.. 
ec70: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
ec80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ec90: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  le name */.    n
eca0: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
ecb0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e  e3Strlen30(zMain
ecc0: 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74  File);.    zMast
ecd0: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
ece0: 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58  ntf(db, "%s-mjXX
ecf0: 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e  XXXX9XXz", zMain
ed00: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  File);.    if( z
ed10: 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75  Master==0 ) retu
ed20: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
ed30: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
ed40: 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
ed50: 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
ed60: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
ed70: 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
ed80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
ed90: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
eda0: 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
edb0: 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
edc0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
edd0: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
ede0: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
edf0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ee00: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ee10: 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
ee20: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
ee30: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
ee40: 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
ee50: 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
ee60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ee70: 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
ee80: 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
ee90: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
eea0: 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
eeb0: 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
eec0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
eed0: 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
eee0: 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
eef0: 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
ef20: 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
ef30: 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
ef40: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
ef50: 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
ef60: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
ef70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
ef80: 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
ef90: 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
efa0: 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
efb0: 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
efc0: 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
efd0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
efe0: 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
eff0: 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
f000: 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
f010: 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
f020: 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
f030: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
f040: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
f050: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
f060: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
f070: 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
f080: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
f090: 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
f0a0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f0b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f0c0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
f0d0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
f0e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f0f0: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
f100: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
f110: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
f120: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
f130: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
f140: 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
f150: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
f160: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
f170: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
f180: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
f190: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
f1a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f1b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
f1c0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
f1d0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
f1e0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
f1f0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
f200: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
f210: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
f220: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
f230: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
f240: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f250: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
f260: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
f270: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
f280: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
f290: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f2a0: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
f2b0: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
f2c0: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
f2d0: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
f2e0: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
f2f0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
f300: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
f310: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
f320: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
f330: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
f340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
f350: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
f360: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
f370: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
f380: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
f390: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
f3a0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
f3b0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
f3c0: 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
f3d0: 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
f3e0: 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
f3f0: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
f400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
f410: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
f420: 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
f430: 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
f440: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
f450: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
f460: 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
f470: 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
f480: 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
f490: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
f4a0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
f4b0: 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
f4c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f4d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f4e0: 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
f4f0: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
f500: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
f510: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
f520: 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
f530: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
f540: 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
f550: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f560: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
f570: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
f580: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
f590: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
f5a0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
f5b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
f5c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f5d0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
f5e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f5f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f600: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
f610: 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
f620: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
f630: 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
f640: 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
f650: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
f660: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
f670: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
f680: 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a    if( needSync .
f690: 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69       && 0==(sqli
f6a0: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
f6b0: 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
f6c0: 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
f6d0: 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
f6e0: 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
f6f0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
f700: 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
f710: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
f720: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
f730: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
f740: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
f750: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
f760: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
f770: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
f780: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
f790: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
f7a0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
f7b0: 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
f7c0: 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
f7d0: 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
f7e0: 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
f7f0: 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
f800: 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
f810: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
f820: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
f830: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
f840: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
f850: 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
f860: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
f870: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f880: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
f890: 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
f8a0: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
f8b0: 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
f8c0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
f8d0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
f8e0: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
f8f0: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
f900: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
f910: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
f920: 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
f930: 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
f940: 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
f950: 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
f960: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
f970: 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
f980: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
f990: 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
f9a0: 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
f9b0: 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
f9c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
f9d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
f9e0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
f9f0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
fa00: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
fa10: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
fa20: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
fa30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
fa40: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
fa50: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
fa60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
fa70: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
fa80: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
fa90: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
faa0: 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28  _BUSY );.    if(
fab0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fac0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
fad0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
fae0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
faf0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
fb00: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
fb10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
fb20: 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
fb30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
fb40: 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
fb50: 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
fb60: 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
fb70: 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
fb80: 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
fb90: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
fba0: 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
fbb0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
fbc0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
fbd0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
fbe0: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
fbf0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
fc00: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
fc10: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
fc20: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
fc30: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
fc40: 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
fc50: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
fc60: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
fc70: 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
fc80: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
fc90: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
fca0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
fcb0: 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
fcc0: 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
fcd0: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
fce0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
fcf0: 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
fd00: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
fd10: 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
fd20: 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
fd30: 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
fd40: 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
fd50: 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
fd60: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
fd70: 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
fd80: 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
fd90: 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
fda0: 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
fdb0: 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
fdc0: 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
fdd0: 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
fde0: 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
fdf0: 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
fe00: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
fe10: 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
fe20: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
fe30: 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oc();.    for(i=
fe40: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
fe50: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
fe60: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
fe70: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
fe80: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
fe90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
fea0: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
feb0: 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
fec0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
fed0: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
fee0: 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
fef0: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
ff00: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
ff10: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
ff20: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
ff30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
ff40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
ff50: 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
ff60: 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69  qlite3.nVdbeActi
ff70: 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  ve count variabl
ff80: 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
ff90: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
ffa0: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
ffb0: 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
ffc0: 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
ffd0: 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
ffe0: 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
fff0: 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
10000 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
10010 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
10020 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
10030 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
10040 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
10050 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
10060 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
10070 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
10080 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
10090 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
100a0 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
100b0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
100c0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
100d0 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
100e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
100f0 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  te = 0;.  int nR
10100 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ead = 0;.  p = d
10110 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
10120 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
10130 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
10140 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  y((sqlite3_stmt*
10150 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  )p) ){.      cnt
10160 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
10170 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
10180 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Write++;.      i
10190 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
101a0 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d  ) nRead++;.    }
101b0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
101c0 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
101d0 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41   cnt==db->nVdbeA
101e0 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72  ctive );.  asser
101f0 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e  t( nWrite==db->n
10200 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61  VdbeWrite );.  a
10210 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62  ssert( nRead==db
10220 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d  ->nVdbeRead );.}
10230 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
10240 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
10250 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
10260 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
10270 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
10280 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
10290 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
102a0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
102b0 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
102c0 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
102d0 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
102e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
102f0 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
10300 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
10310 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10320 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
10330 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
10340 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
10350 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
10360 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
10370 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
10380 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10390 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
103a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
103b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
103c0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
103d0 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
103e0 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
103f0 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
10400 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
10410 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
10420 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
10430 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
10440 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
10450 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
10460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
10470 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   If p->iStatemen
10480 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
10490 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n zero, then thi
104a0 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20  s Vdbe opened a 
104b0 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
104c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
104d0 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
104e0 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79  d here. The only
104f0 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20   exception.  ** 
10500 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72  is that an IO er
10510 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63  ror may have occ
10520 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61  urred, causing a
10530 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
10540 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68  back..  ** In th
10550 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74  is case (db->nSt
10560 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64  atement==0), and
10570 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
10580 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20  g to do..  */.  
10590 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  if( db->nStateme
105a0 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
105b0 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ent ){.    int i
105c0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
105d0 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  iSavepoint = p->
105e0 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20  iStatement-1;.. 
105f0 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d     assert( eOp==
10600 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10610 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
10620 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
10630 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
10640 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
10650 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53     assert( p->iS
10660 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
10670 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
10680 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
10690 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
106a0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
106b0 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
106c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74  ITE_OK;.      Bt
106d0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
106e0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
106f0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
10700 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
10710 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
10730 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
10740 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
10750 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10760 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
10770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10780 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
10790 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
107a0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
107b0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
107c0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
107d0 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
107e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
107f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10810 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
10820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10830 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74     }.    db->nSt
10840 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70  atement--;.    p
10850 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
10860 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
10870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10880 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
10890 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
108a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
108b0 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
108c0 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
108d0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
108e0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
108f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
10900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10910 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
10920 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
10930 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
10940 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
10950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10960 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
10970 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10980 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
10990 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
109a0 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20  estore the .    
109b0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
109c0 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
109d0 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20  straint counter 
109e0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
109f0 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a  had when .    **
10a00 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
10a10 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
10a20 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  pened.  */.    i
10a30 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
10a40 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
10a50 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
10a60 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
10a70 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64  DefCons;.      d
10a80 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
10a90 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
10aa0 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  fImmCons;.    }.
10ab0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10ac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
10ad0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
10ae0 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
10af0 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
10b00 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
10b10 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
10b20 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
10b30 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
10b40 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
10b50 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
10b60 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
10b70 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
10b80 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
10b90 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
10ba0 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
10bb0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
10bc0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
10bd0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
10be0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
10bf0 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
10c00 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
10c10 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
10c20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
10c30 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
10c40 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
10c50 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
10c60 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72  IGNKEY.** and wr
10c70 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
10c80 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
10c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
10ca0 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
10cb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
10cc0 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
10cd0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
10ce0 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
10cf0 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
10d00 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
10d10 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
10d20 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  & (db->nDeferred
10d30 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72  Cons+db->nDeferr
10d40 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20  edImmCons)>0) . 
10d50 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20    || (!deferred 
10d60 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
10d70 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  int>0) .  ){.   
10d80 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
10d90 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
10da0 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72  GNKEY;.    p->er
10db0 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
10dc0 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
10dd0 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
10de0 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52  ErrMsg, db, "FOR
10df0 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
10e00 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
10e10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10e20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
10e30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10e40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
10e50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10e60 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
10e70 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
10e80 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
10e90 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
10ea0 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
10eb0 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
10ec0 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
10ed0 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
10ee0 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
10ef0 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
10f00 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
10f10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10f20 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
10f30 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
10f40 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
10f50 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
10f60 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
10f70 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
10f80 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
10f90 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
10fa0 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
10fb0 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
10fc0 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
10fd0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
10fe0 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
10ff0 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
11000 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
11010 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
11020 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
11030 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
11040 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
11050 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
11060 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
11070 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
11080 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
11090 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
110a0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
110b0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
110c0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
110d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
110e0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
110f0 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
11100 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
11110 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
11120 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
11130 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
11140 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
11150 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
11160 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
11170 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
11180 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
11190 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
111a0 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
111b0 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
111c0 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
111d0 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
111e0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
111f0 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
11200 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
11210 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
11220 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
11230 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
11240 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
11250 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
11260 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
11270 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
11280 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
11290 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
112a0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
112b0 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
112c0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
112d0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
112e0 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
112f0 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
11300 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
11310 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
11320 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
11330 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11340 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  ..  */..  if( p-
11350 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
11360 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
11370 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11380 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63   }.  if( p->aOnc
11390 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70  eFlag ) memset(p
113a0 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20  ->aOnceFlag, 0, 
113b0 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20  p->nOnceFlag);. 
113c0 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
113d0 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  (p);.  if( p->ma
113e0 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
113f0 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
11400 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11410 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
11420 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
11430 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
11440 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
11450 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
11460 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66  er started or if
11470 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74   the.  ** SQL st
11480 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  atement does not
11490 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61   read or write a
114a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
114b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
114c0 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64  =0 && p->bIsRead
114d0 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  er ){.    int mr
114e0 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
114f0 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
11500 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74  p->rc */.    int
11510 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
11520 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65  0;.    int isSpe
11530 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
11540 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
11550 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69  true if a 'speci
11560 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  al' error */..  
11570 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
11580 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
11590 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
115a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74    sqlite3VdbeEnt
115b0 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
115c0 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
115d0 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
115e0 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
115f0 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
11600 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
11610 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
11620 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
11630 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11650 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
11660 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
11670 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
11680 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
11690 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
116a0 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
116b0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74   read-only and t
116c0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
116d0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
116e0 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  T, .      ** no 
116f0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65  rollback is nece
11700 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65  ssary. Otherwise
11710 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76  , at least a sav
11720 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
11730 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
11740 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
11750 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
11760 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20  database to a . 
11770 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65       ** consiste
11780 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
11790 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  **.      ** Even
117a0 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
117b0 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  t is read-only, 
117c0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
117d0 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20  to perform.     
117e0 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20   ** a statement 
117f0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  or transaction r
11800 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
11810 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  n. If the error 
11820 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
11830 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
11840 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   to the journal,
11850 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20   sub-journal or 
11860 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
11870 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f  * file as part o
11880 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66  f an effort to f
11890 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61  ree up cache spa
118a0 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e  ce (see function
118b0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53  .      ** pagerS
118c0 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72  tress() in pager
118d0 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  .c), the rollbac
118e0 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  k is required to
118f0 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20   restore .      
11900 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
11910 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  a consistent sta
11920 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
11930 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
11940 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
11950 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
11960 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63          if( (mrc
11970 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
11980 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
11990 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74  LL) && p->usesSt
119a0 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  mtJournal ){.   
119b0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
119c0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
119d0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
119e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
119f0 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
11a00 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
11a10 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
11a20 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
11a30 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
11a40 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
11a50 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
11a60 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
11a70 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
11a80 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
11a90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11aa0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
11ab0 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
11ac0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
11ad0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
11ae0 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
11af0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
11b00 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
11b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11b20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
11b30 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74  eck for immediat
11b40 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69  e foreign key vi
11b50 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20  olations. */.   
11b60 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
11b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11b80 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
11b90 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  k(p, 0);.    }. 
11ba0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
11bb0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
11bc0 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73   is set and this
11bd0 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74   is the only act
11be0 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20  ive writer .    
11bf0 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64  ** VM, then we d
11c00 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69  o either a commi
11c10 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  t or rollback of
11c20 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
11c30 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a  nsaction. .    *
11c40 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54  *.    ** Note: T
11c50 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72  his block also r
11c60 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68  uns if one of th
11c70 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
11c80 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a   handled .    **
11c90 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72   above has occur
11ca0 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  red. .    */.   
11cb0 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61   if( !sqlite3Vta
11cc0 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20  bInSync(db) .   
11cd0 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d    && db->autoCom
11ce0 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d  mit .     && db-
11cf0 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d  >nVdbeWrite==(p-
11d00 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20  >readOnly==0) . 
11d10 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
11d20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11d30 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
11d40 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
11d50 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
11d60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11d70 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
11d80 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20  kFk(p, 1);.     
11d90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11db0 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72    if( NEVER(p->r
11dc0 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
11dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11de0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
11df0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11e00 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
11e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11e20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11e30 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
11e40 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d  GNKEY;.        }
11e50 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20  else{ .         
11e60 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d   /* The auto-com
11e70 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
11e80 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  , the vdbe progr
11e90 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75  am was successfu
11ea0 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
11eb0 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
11ec0 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  IL' constraint a
11ed0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
11ee0 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
11ef0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  .          ** ke
11f00 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
11f10 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61   hold up the tra
11f20 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d  nsaction. This m
11f30 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
11f40 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72           ** is r
11f50 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
11f60 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
11f70 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20  ommit(db, p);.  
11f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11f90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
11fa0 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e  USY && p->readOn
11fb0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
11fc0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
11fd0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
11fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
11ff0 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
12000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12010 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12020 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
12030 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
12040 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
12050 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20  ITE_OK);.       
12060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12070 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
12080 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
12090 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
120a0 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  ImmCons = 0;.   
120b0 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
120c0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65   &= ~SQLITE_Defe
120d0 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20  rFKs;.          
120e0 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
120f0 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
12100 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12120 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
12130 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
12140 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
12150 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
12160 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
12170 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
12180 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
12190 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
121a0 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
121b0 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
121c0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
121d0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
121e0 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20  _RELEASE;.      
121f0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
12200 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
12210 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  rt ){.        eS
12220 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
12230 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
12240 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12250 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
12260 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
12270 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
12280 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
12290 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
122a0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
122b0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
122c0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
122d0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
122e0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20  eStatementOp is 
122f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
12300 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
12310 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a  action needs to.
12320 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74      ** be commit
12330 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
12340 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ck. Call sqlite3
12350 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
12360 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64  nt() to.    ** d
12370 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70  o so. If this op
12380 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
12390 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
123a0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
123b0 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  ent.    ** error
123c0 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
123d0 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e  OK or SQLITE_CON
123e0 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72  STRAINT, then pr
123f0 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  omote the.    **
12400 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
12410 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  nt error code.. 
12420 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
12430 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
12440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12450 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
12460 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
12470 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
12480 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  c ){.        if(
12490 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
124a0 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66  K || (p->rc&0xff
124b0 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
124c0 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
124d0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
124e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
124f0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
12500 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
12510 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
12520 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12530 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
12540 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
12550 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
12560 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12570 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
12580 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
12590 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
125a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
125b0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
125c0 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
125d0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
125e0 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
125f0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
12600 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
12610 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
12620 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
12630 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
12640 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
12650 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
12660 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
12670 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
12680 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
12690 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
126a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
126b0 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
126c0 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
126d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
126e0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
126f0 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
12700 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
12710 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
12720 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
12730 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
12740 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
12750 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ve(p);.  }..  /*
12760 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
12770 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
12780 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
12790 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
127a0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
127b0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
127c0 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20  nVdbeActive--;. 
127d0 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
127e0 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57  nly ) db->nVdbeW
127f0 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  rite--;.    if( 
12800 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64  p->bIsReader ) d
12810 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a  b->nVdbeRead--;.
12820 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12830 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d  nVdbeActive>=db-
12840 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20  >nVdbeRead );.  
12850 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
12860 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64  dbeRead>=db->nVd
12870 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61  beWrite );.    a
12880 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
12890 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a  Write>=0 );.  }.
128a0 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
128b0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
128c0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
128d0 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
128e0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
128f0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
12900 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12910 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
12920 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
12930 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
12940 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
12950 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
12960 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
12970 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
12980 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
12990 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
129a0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
129b0 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
129c0 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
129d0 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
129e0 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
129f0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
12a00 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
12a10 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
12a20 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
12a30 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
12a40 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
12a50 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
12a60 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
12a70 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
12a80 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
12a90 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
12aa0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
12ab0 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
12ac0 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
12ad0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
12ae0 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
12af0 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
12b00 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
12b10 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
12b20 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
12b30 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
12b40 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
12b50 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
12b60 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
12b70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12b80 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
12b90 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
12ba0 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
12bb0 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
12bc0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
12bd0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
12be0 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
12bf0 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
12c00 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
12c10 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
12c20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
12c30 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
12c40 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
12c50 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12c60 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
12c70 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
12c80 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
12c90 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
12ca0 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
12cb0 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
12cc0 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
12cd0 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
12ce0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
12cf0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
12d00 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
12d10 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
12d20 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46  {.    u8 mallocF
12d30 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
12d40 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71  ocFailed;.    sq
12d50 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
12d60 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66  Malloc();.    if
12d70 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20  ( db->pErr==0 ) 
12d80 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74  db->pErr = sqlit
12d90 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
12da0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
12db0 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
12dc0 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
12dd0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
12de0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
12df0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
12e00 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
12e10 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
12e20 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c  led = mallocFail
12e30 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43  ed;.    db->errC
12e40 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73  ode = rc;.  }els
12e50 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
12e60 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d  ror(db, rc);.  }
12e70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12e80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
12e90 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a  NABLE_SQLLOG./*.
12ea0 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f  ** If an SQLITE_
12eb0 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f  CONFIG_SQLLOG ho
12ec0 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ok is registered
12ed0 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20   and the VM has 
12ee0 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e  been run, .** in
12ef0 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  voke it..*/.stat
12f00 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f  ic void vdbeInvo
12f10 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76  keSqllog(Vdbe *v
12f20 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
12f30 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
12f40 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53  llog && v->rc==S
12f50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a  QLITE_OK && v->z
12f60 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20  Sql && v->pc>=0 
12f70 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78  ){.    char *zEx
12f80 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33  panded = sqlite3
12f90 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c  VdbeExpandSql(v,
12fa0 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61   v->zSql);.    a
12fb0 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e  ssert( v->db->in
12fc0 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
12fd0 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20    if( zExpanded 
12fe0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12ff0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
13000 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20  llog(.          
13010 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
13020 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
13030 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
13040 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 1.      );.   
13050 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13060 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65  (v->db, zExpande
13070 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  d);.    }.  }.}.
13080 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
13090 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
130a0 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
130b0 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
130c0 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
130d0 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
130e0 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
130f0 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
13100 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
13110 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
13120 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
13130 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
13140 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
13150 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
13160 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
13170 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
13180 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
13190 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
131a0 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
131b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
131c0 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
131d0 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
131e0 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
131f0 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
13200 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
13210 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
13220 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
13230 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
13240 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
13250 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
13260 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
13270 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
13280 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
13290 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
132a0 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
132b0 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
132c0 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
132d0 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
132e0 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
132f0 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
13300 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
13310 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
13320 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
13330 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
13340 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
13350 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
13360 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
13370 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
13380 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
13390 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
133a0 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
133b0 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
133c0 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
133d0 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
133e0 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
133f0 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
13400 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
13410 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
13420 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
13430 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
13440 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
13450 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
13460 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
13470 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13480 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
13490 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
134a0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
134b0 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
134c0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
134d0 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  f( p->runOnlyOnc
134e0 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  e ) p->expired =
134f0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
13500 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
13510 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
13520 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
13530 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
13540 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
13550 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
13560 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
13570 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
13580 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
13590 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
135a0 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
135b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
135c0 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
135d0 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
135e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
135f0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e  rWithMsg(db, p->
13600 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f  rc, p->zErrMsg ?
13610 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45   "%s" : 0, p->zE
13620 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
13630 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
13640 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
13650 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
13660 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
13670 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
13680 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
13690 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
136a0 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
136b0 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
136c0 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
136d0 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
136e0 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
136f0 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
13700 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
13710 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
13720 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
13730 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
13740 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
13750 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
13760 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
13770 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
13780 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
13790 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
137a0 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
137b0 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
137c0 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
137d0 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
137e0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c  .        char c,
137f0 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
13800 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
13810 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  - ");.        fo
13820 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a  r(i=0; (c = p->z
13830 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  Sql[i])!=0; i++)
13840 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13850 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc=='\n' ) fprin
13860 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
13870 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63            putc(c
13880 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  , out);.        
13890 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20    pc = c;.      
138a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
138b0 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc!='\n' ) fprin
138c0 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
138d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
138e0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
138f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
13900 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar zHdr[100];.  
13910 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
13920 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48  printf(sizeof(zH
13930 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20  dr), zHdr, "%6u 
13940 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a  %12llu %8llu ",.
13950 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
13960 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
13970 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
13980 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
13990 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
139a0 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
139b0 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
139c0 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
139d0 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
139e0 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64  f(out, "%s", zHd
139f0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
13a00 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
13a10 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
13a20 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
13a30 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
13a40 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13a50 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d    p->iCurrentTim
13a60 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = 0;.  p->magi
13a70 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
13a80 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
13a90 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
13aa0 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
13ab0 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
13ac0 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
13ad0 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
13ae0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
13af0 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
13b00 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
13b10 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
13b20 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
13b30 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
13b40 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
13b50 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
13b60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13b70 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
13b80 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
13b90 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
13ba0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
13bb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13bc0 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
13bd0 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
13be0 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
13bf0 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
13c00 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
13c10 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
13c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72  .}../*.** If par
13c30 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65  ameter iOp is le
13c40 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
13c50 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  en invoke the de
13c60 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20  structor for.** 
13c70 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61  all auxiliary da
13c80 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72  ta pointers curr
13c90 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20  ently cached by 
13ca0 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
13cb0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
13cc0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  gument..**.** Or
13cd0 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61  , if iOp is grea
13ce0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
13cf0 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  l to zero, then 
13d00 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
13d10 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  s.** only invoke
13d20 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69  d for those auxi
13d30 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
13d40 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74  ers created by t
13d50 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63  he user .** func
13d60 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20  tion invoked by 
13d70 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  the OP_Function 
13d80 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75  opcode at instru
13d90 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a  ction iOp of .**
13da0 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f   VM pVdbe, and o
13db0 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a  nly then if:.**.
13dc0 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f  **    * the asso
13dd0 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  ciated function 
13de0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
13df0 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28   32nd or later (
13e00 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20  counting.**     
13e10 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
13e20 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  ght), or.**.**  
13e30 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f    * the correspo
13e40 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67  nding bit in arg
13e50 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c  ument mask is cl
13e60 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66  ear (where the f
13e70 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e  irst.**      fun
13e80 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
13e90 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62  corresponds to b
13ea0 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76  it 0 etc.)..*/.v
13eb0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
13ec0 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
13ed0 65 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f  e *pVdbe, int iO
13ee0 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
13ef0 41 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26  AuxData **pp = &
13f00 70 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b  pVdbe->pAuxData;
13f10 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b  .  while( *pp ){
13f20 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41  .    AuxData *pA
13f30 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66  ux = *pp;.    if
13f40 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c  ( (iOp<0).     |
13f50 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f  | (pAux->iOp==iO
13f60 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67  p && (pAux->iArg
13f70 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20  >31 || !(mask & 
13f80 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e  MASKBIT32(pAux->
13f90 69 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a  iArg)))).    ){.
13fa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13fb0 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29  pAux->iArg==31 )
13fc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  ;.      if( pAux
13fd0 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
13fe0 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
13ff0 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
14000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
14010 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b  p = pAux->pNext;
14020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
14030 46 72 65 65 28 70 56 64 62 65 2d 3e 64 62 2c 20  Free(pVdbe->db, 
14040 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
14050 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
14060 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
14070 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
14080 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
14090 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
140a0 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
140b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
140c0 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
140d0 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
140e0 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
140f0 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
14100 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
14110 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
14120 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
14130 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
14140 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
14150 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
14160 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
14170 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
14180 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
14190 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
141a0 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
141b0 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
141c0 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
141d0 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
141e0 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
141f0 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
14200 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
14210 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Next;.  int i;. 
14220 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
14230 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
14240 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
14250 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
14260 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65  nVar);.  release
14270 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
14280 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
14290 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
142a0 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
142b0 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
142c0 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
142d0 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
142e0 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
142f0 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
14300 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
14310 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
14320 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
14330 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e    }.  for(i=p->n
14340 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  zVar-1; i>=0; i-
14350 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  -) sqlite3DbFree
14360 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d  (db, p->azVar[i]
14370 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41  );.  vdbeFreeOpA
14380 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c  rray(db, p->aOp,
14390 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69   p->nOp);.  sqli
143a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
143b0 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  >aColName);.  sq
143c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
143d0 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69  p->zSql);.  sqli
143e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
143f0 3e 70 46 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pFree);.}../*.*
14400 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
14410 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
14420 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
14430 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  te(Vdbe *p){.  s
14440 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
14450 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
14460 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
14470 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
14480 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
14490 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
144a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
144b0 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70  learObject(db, p
144c0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
144d0 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
144e0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
144f0 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
14500 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
14510 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
14520 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
14530 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
14540 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
14550 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
14560 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
14570 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
14580 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
14590 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
145a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
145b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
145c0 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70  rsor "p" has a p
145d0 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72  ending seek oper
145e0 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e  ation that has n
145f0 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63  ot yet been.** c
14600 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65  arried out.  See
14610 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77  k the cursor now
14620 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  .  If an error o
14630 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a  ccurs, return.**
14640 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
14650 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
14660 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
14670 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
14680 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
14690 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
146a0 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
146b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
146c0 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  T.  extern int s
146d0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
146e0 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  unt;.#endif.  as
146f0 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65  sert( p->deferre
14700 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73  dMoveto );.  ass
14710 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
14720 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
14730 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
14740 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  cked(p->pCursor,
14750 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
14760 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
14770 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14780 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d   rc;.  if( res!=
14790 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
147a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
147b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
147c0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61  ST.  sqlite3_sea
147d0 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
147e0 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65  dif.  p->deferre
147f0 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70  dMoveto = 0;.  p
14800 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
14810 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72  CACHE_STALE;.  r
14820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68  .}../*.** Someth
14840 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75  ing has moved cu
14850 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20  rsor "p" out of 
14860 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68  place.  Maybe th
14870 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20  e row it was.** 
14880 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64  pointed to was d
14890 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
148a0 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61  under it.  Or ma
148b0 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77 61  ybe the btree wa
148c0 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e  s.** rebalanced.
148d0 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20 63    Whatever the c
148e0 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73  ause, try to res
148f0 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65 20  tore "p" to the 
14900 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73  place it.** is s
14910 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f  upposed to be po
14920 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20  inting.  If the 
14930 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64 20  row was deleted 
14940 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
14950 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65  he.** cursor, se
14960 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  t the cursor to 
14970 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20  point to a NULL 
14980 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
14990 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
149a0 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75  NE handleMovedCu
149b0 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20  rsor(VdbeCursor 
149c0 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66  *p){.  int isDif
149d0 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20  ferentRow, rc;. 
149e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 75 72   assert( p->pCur
149f0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
14a00 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
14a10 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
14a20 2d 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ->pCursor) );.  
14a30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
14a40 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70  eCursorRestore(p
14a50 2d 3e 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69  ->pCursor, &isDi
14a60 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70  fferentRow);.  p
14a70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
14a80 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69  CACHE_STALE;.  i
14a90 66 28 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f  f( isDifferentRo
14aa0 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d  w ) p->nullRow =
14ab0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   1;.  return rc;
14ac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
14ad0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
14ae0 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
14af0 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65  id.  Restore the
14b00 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65   cursor.** if ne
14b10 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61  ed be.  Return a
14b20 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f  ny I/O error fro
14b30 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70  m the restore op
14b40 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  eration..*/.int 
14b50 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
14b60 72 52 65 73 74 6f 72 65 28 56 64 62 65 43 75 72  rRestore(VdbeCur
14b70 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 73  sor *p){.  if( s
14b80 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
14b90 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75  rHasMoved(p->pCu
14ba0 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74  rsor) ){.    ret
14bb0 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  urn handleMovedC
14bc0 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20  ursor(p);.  }.  
14bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14be0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
14bf0 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  sure the cursor 
14c00 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65  p is ready to re
14c10 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
14c20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a  row to which it.
14c30 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69  ** was last posi
14c40 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20  tioned.  Return 
14c50 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
14c60 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72   an OOM fault or
14c70 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72   I/O error.** pr
14c80 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70  events us from p
14c90 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63  ositioning the c
14ca0 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72  ursor to its cor
14cb0 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rect position..*
14cc0 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f  *.** If a MoveTo
14cd0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65   operation is pe
14ce0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76  nding on the giv
14cf0 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  en cursor, then 
14d00 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54  do that.** MoveT
14d10 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f  o now.  If no mo
14d20 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63  ve is pending, c
14d30 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
14d40 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a  he row has been.
14d50 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  ** deleted out f
14d60 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
14d70 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68  rsor and if it h
14d80 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77  as, mark the row
14d90 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f   as.** a NULL ro
14da0 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  w..**.** If the 
14db0 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
14dc0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
14dd0 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e  e correct row an
14de0 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a  d that row has.*
14df0 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74  * not been delet
14e00 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
14e10 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68  r the cursor, th
14e20 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
14e30 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
14e40 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
14e50 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43  rsorMoveto(VdbeC
14e60 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28  ursor *p){.  if(
14e70 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
14e80 74 6f 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  to ){.    return
14e90 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
14ea0 6f 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20  oveto(p);.  }.  
14eb0 69 66 28 20 70 2d 3e 70 43 75 72 73 6f 72 20 26  if( p->pCursor &
14ec0 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  & sqlite3BtreeCu
14ed0 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
14ee0 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
14ef0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
14f00 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
14f10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14f20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
14f30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
14f40 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
14f50 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
14f60 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
14f70 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
14f80 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
14f90 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
14fa0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14fb0 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
14fc0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
14fd0 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
14fe0 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
14ff0 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
15000 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
15010 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
15020 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
15030 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
15040 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
15050 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
15060 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
15070 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
15080 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
15090 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
150a0 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
150b0 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
150c0 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
150d0 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
150e0 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
150f0 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
15100 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
15110 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
15120 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
15130 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
15140 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
15150 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
15160 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
15170 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
15180 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
15190 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
151a0 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
151b0 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
151c0 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
151d0 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
151e0 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
151f0 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
15200 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eparately..**.**
15210 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
15220 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
15230 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
15240 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
15250 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
15260 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
15270 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
15280 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
15290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
152a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
152b0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
152c0 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
152f0 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
15300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15310 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
15320 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
15330 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
15340 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
15350 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
15360 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15380 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
15390 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
153a0 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
153c0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
153d0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
153e0 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
153f0 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
15400 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
15410 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
15440 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
15450 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
15460 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
15470 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
15480 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
154b0 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
154c0 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154e0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
154f0 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
15500 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
15510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15520 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
15530 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
15540 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
15550 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
15560 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
15570 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
15580 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
15590 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
155a0 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
155b0 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
155c0 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
155d0 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
155e0 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
155f0 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
15600 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
15610 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
15620 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
15630 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
15640 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
15650 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
15660 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
15670 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
15680 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
15690 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69  ile_format){.  i
156a0 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
156b0 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b  >flags;.  u32 n;
156c0 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ..  if( flags&ME
156d0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
156e0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
156f0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
15700 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
15710 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
15720 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
15730 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
15740 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
15750 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
15760 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
15770 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
15780 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
15790 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  .    if( i<0 ){.
157a0 20 20 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41        if( i<(-MA
157b0 58 5f 36 42 59 54 45 29 20 29 20 72 65 74 75 72  X_6BYTE) ) retur
157c0 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72  n 6;.      /* Pr
157d0 65 76 69 6f 75 73 20 74 65 73 74 20 70 72 65 76  evious test prev
157e0 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32  ents:  u = -(-92
157f0 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
15800 38 29 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20  8) */.      u = 
15810 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -i;.    }else{. 
15820 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20       u = i;.    
15830 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  }.    if( u<=127
15840 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15850 20 28 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69   ((i&1)==i && fi
15860 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20  le_format>=4) ? 
15870 38 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20  8+(u32)u : 1;.  
15880 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33    }.    if( u<=3
15890 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b  2767 ) return 2;
158a0 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38  .    if( u<=8388
158b0 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a  607 ) return 3;.
158c0 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
158d0 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34  83647 ) return 4
158e0 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  ;.    if( u<=MAX
158f0 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20  _6BYTE ) return 
15900 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  5;.    return 6;
15910 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
15920 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
15930 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
15940 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
15950 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15960 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
15970 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
15980 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
15990 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
159a0 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
159b0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
159c0 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
159d0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
159e0 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
159f0 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
15a00 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
15a10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
15a20 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
15a30 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
15a40 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
15a50 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
15a60 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
15a70 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
15a80 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
15a90 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
15aa0 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
15ab0 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
15ac0 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
15ad0 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
15ae0 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20  onst u8 aSize[] 
15af0 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20  = { 0, 1, 2, 3, 
15b00 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30  4, 6, 8, 8, 0, 0
15b10 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65  , 0, 0 };.    re
15b20 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61  turn aSize[seria
15b30 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a  l_type];.  }.}..
15b40 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
15b50 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
15b60 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
15b70 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
15b80 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
15b90 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
15ba0 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
15bb0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
15bc0 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
15bd0 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
15be0 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
15bf0 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
15c00 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
15c10 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
15c20 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
15c30 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
15c40 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
15c50 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
15c60 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
15c70 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
15c80 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
15c90 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
15ca0 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
15cb0 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
15cc0 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
15cd0 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
15ce0 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
15cf0 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
15d00 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
15d10 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
15d20 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
15d30 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
15d40 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
15d50 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
15d60 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
15d70 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
15d80 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
15d90 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
15da0 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
15db0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
15dc0 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
15dd0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
15de0 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
15df0 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
15e00 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
15e10 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
15e20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
15e30 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
15e40 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
15e50 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
15e60 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
15e70 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
15e80 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
15e90 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
15ea0 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
15eb0 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
15ec0 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
15ed0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
15ee0 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   correct..**.** 
15ef0 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72  (2007-08-30)  Fr
15f00 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73  ank van Vugt has
15f10 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72   studied this pr
15f20 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a  oblem closely.**
15f30 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69   and has send hi
15f40 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68  s findings to th
15f50 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70  e SQLite develop
15f60 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77  ers.  Frank.** w
15f70 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20  rites that some 
15f80 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66  Linux kernels of
15f90 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  fer floating poi
15fa0 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65  nt hardware.** e
15fb0 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73  mulation that us
15fc0 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d  es only 32-bit m
15fd0 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64  antissas instead
15fe0 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34   of a full .** 4
15ff0 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72  8-bits as requir
16000 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73  ed by the IEEE s
16010 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20  tandard.  (This 
16020 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47  is the.** CONFIG
16030 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74  _FPE_FASTFPE opt
16040 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73  ion.)  On such s
16050 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67  ystems, floating
16060 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73   point.** byte s
16070 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20  wapping becomes 
16080 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64  very complicated
16090 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62  .  To avoid prob
160a0 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63  lems,.** the nec
160b0 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70  essary byte swap
160c0 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20  ping is carried 
160d0 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62  out using a 64-b
160e0 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61  it integer.** ra
160f0 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62  ther than a 64-b
16100 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b  it float.  Frank
16110 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74   assures us that
16120 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a   the code here.*
16130 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e  * works for him.
16140 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f    We, the develo
16150 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61  pers, have no wa
16160 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74  y to independent
16170 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69  ly.** verify thi
16180 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65  s, but Frank see
16190 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20  ms to know what 
161a0 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62  he is talking ab
161b0 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75  out.** so we tru
161c0 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65  st him..*/.#ifde
161d0 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
161e0 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
161f0 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f  T.static u64 flo
16200 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a  atSwap(u64 in){.
16210 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36    union {.    u6
16220 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32  4 r;.    u32 i[2
16230 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  ];.  } u;.  u32 
16240 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a  t;..  u.r = in;.
16250 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20    t = u.i[0];.  
16260 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b  u.i[0] = u.i[1];
16270 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20  .  u.i[1] = t;. 
16280 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23   return u.r;.}.#
16290 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
162a0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20  dEndianFloat(X) 
162b0 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58   X = floatSwap(X
162c0 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
162d0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
162e0 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a  Float(X).#endif.
162f0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
16300 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
16310 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
16320 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
16330 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
16340 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
16350 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
16360 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
16370 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
16380 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
16390 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
163a0 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66  tten..**.** nBuf
163b0 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   is the amount o
163c0 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  f space left in 
163d0 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c  buf[].  The call
163e0 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
163f0 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74  e.** for allocat
16400 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ing enough space
16410 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c   to buf[] to hol
16420 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
16430 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  ld, exclusive.**
16440 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e   of the pMem->u.
16450 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20  nZero bytes for 
16460 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65  a MEM_Zero value
16470 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
16480 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
16490 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  es actually writ
164a0 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  ten into buf[]. 
164b0 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
164c0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a  f bytes in the z
164d0 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20  ero-filled tail 
164e0 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
164f0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
16500 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65  only.** if those
16510 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f   bytes were zero
16520 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20  ed in buf[]..*/ 
16530 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
16540 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75  SerialPut(u8 *bu
16550 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33  f, Mem *pMem, u3
16560 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
16570 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
16580 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
16590 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
165a0 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
165b0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
165c0 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
165d0 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
165e0 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
165f0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
16600 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
16610 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20  em->u.r) );.    
16620 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
16630 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28  em->u.r, sizeof(
16640 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d  v));.      swapM
16650 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
16660 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
16670 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75       v = pMem->u
16680 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  .i;.    }.    le
16690 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56  n = i = sqlite3V
166a0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
166b0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
166c0 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
166d0 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
166e0 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28  buf[--i] = (u8)(
166f0 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
16700 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69   >>= 8;.    }whi
16710 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74  le( i );.    ret
16720 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
16730 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
16740 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
16750 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
16760 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
16770 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
16780 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
16790 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
167a0 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
167b0 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
167c0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
167d0 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
167e0 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
167f0 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
16800 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
16810 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
16820 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
16830 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
16840 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
16850 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
16860 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
16870 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
16880 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
16890 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
168a0 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
168b0 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
168c0 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
168d0 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
168e0 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
168f0 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
16900 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
16910 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
16920 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
16930 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
16940 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
16950 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
16960 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
16970 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
16980 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
16990 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
169a0 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
169b0 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
169c0 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
169d0 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
169e0 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
169f0 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
16a00 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
16a10 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
16a20 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
16a30 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
16a40 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
16a50 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
16a60 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
16a70 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
16a80 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
16a90 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16aa0 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
16ab0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
16ac0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
16ad0 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
16ae0 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
16af0 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
16b00 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
16b10 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
16b20 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
16b30 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
16b40 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
16b50 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
16b60 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
16b70 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
16b80 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
16b90 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
16ba0 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45  tatic u32 SQLITE
16bb0 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c  _NOINLINE serial
16bc0 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
16bd0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
16be0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
16bf0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
16c00 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
16c10 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
16c20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
16c30 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
16c40 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
16c50 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
16c60 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
16c70 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
16c80 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
16c90 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
16ca0 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
16cb0 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
16cc0 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
16cd0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
16ce0 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
16cf0 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 70  type==6 ){.    p
16d00 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
16d10 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  *)&x;.    pMem->
16d20 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
16d30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
16d40 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
16d50 7d 65 6c 73 65 7b 0a 23 69 66 20 21 64 65 66 69  }else{.#if !defi
16d60 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
16d70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
16d80 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
16d90 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
16da0 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
16db0 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
16dc0 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
16dd0 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
16de0 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
16df0 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
16e00 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
16e10 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
16e20 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
16e30 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
16e40 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
16e50 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
16e60 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
16e70 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
16e80 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
16e90 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
16ea0 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
16eb0 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
16ec0 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
16ed0 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
16ee0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
16ef0 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
16f00 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
16f10 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
16f20 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
16f30 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
16f40 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
16f50 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
16f60 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
16f70 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
16f80 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
16f90 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
16fa0 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
16fb0 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
16fc0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
16fd0 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
16fe0 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  >u.r) ? MEM_Null
16ff0 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
17000 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
17010 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
17020 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
17030 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17040 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
17050 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
17060 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
17070 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
17080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
17090 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
170a0 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
170b0 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
170c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
170d0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
170e0 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
170f0 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
17100 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
17110 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
17120 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
17130 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
17140 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
17150 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
17160 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
17170 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f  0: {  /* NULL */
17180 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
17190 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
171a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
171b0 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  }.    case 1: { 
171c0 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
171d0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
171e0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e    pMem->u.i = ON
171f0 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
17200 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
17210 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
17220 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
17230 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
17240 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
17250 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
17260 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
17270 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
17280 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
17290 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  WO_BYTE_INT(buf)
172a0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
172b0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
172c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
172d0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
172e0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
172f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
17300 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
17310 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
17320 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
17330 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62  THREE_BYTE_INT(b
17340 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
17350 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
17360 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17370 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
17380 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b  .      return 3;
17390 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
173a0 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
173b0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
173c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
173d0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54   = FOUR_BYTE_INT
173e0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
173f0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
17400 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
17410 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
17420 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17430 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
17440 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
17450 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
17460 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
17470 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55  .i = FOUR_BYTE_U
17480 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28  INT(buf+2) + (((
17490 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
174a0 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
174b0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
174c0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
174d0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
174e0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
174f0 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
17500 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
17510 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
17520 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
17530 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
17540 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
17550 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  */.      /* Thes
17560 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69  e use local vari
17570 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65  ables, so do the
17580 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20  m in a separate 
17590 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
175a0 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67   to avoid having
175b0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61   to move the fra
175c0 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  me pointer in th
175d0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
175e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65  .      return se
175f0 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69  rialGet(buf,seri
17600 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20  al_type,pMem);. 
17610 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
17620 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
17630 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
17640 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
17650 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
17660 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
17670 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
17680 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
17690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
176a0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
176b0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74  lt: {.      stat
176c0 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c  ic const u16 aFl
176d0 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f  ag[] = { MEM_Blo
176e0 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d  b|MEM_Ephem, MEM
176f0 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d  _Str|MEM_Ephem }
17700 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
17710 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20  = (char *)buf;. 
17720 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28       pMem->n = (
17730 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
17740 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  2;.      pMem->f
17750 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72  lags = aFlag[ser
17760 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20  ial_type&1];.   
17770 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e     return pMem->
17780 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
17790 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a  eturn 0;.}./*.**
177a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
177b0 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
177c0 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
177d0 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b  ce for an Unpack
177e0 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75  edRecord.** stru
177f0 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75  cture large enou
17800 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  gh to be used wi
17810 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  th sqlite3VdbeRe
17820 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a  cordUnpack() if.
17830 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
17840 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
17850 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74  er to KeyInfo st
17860 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f  ructure pKeyInfo
17870 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63  ..**.** The spac
17880 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f  e is either allo
17890 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  cated using sqli
178a0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29  te3DbMallocRaw()
178b0 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a   or from within.
178c0 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64  ** the unaligned
178d0 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76   buffer passed v
178e0 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e  ia the second an
178f0 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  d third argument
17900 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a  s (presumably.**
17910 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49   stack space). I
17920 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68  f the former, th
17930 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65  en *ppFree is se
17940 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  t to a pointer t
17950 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
17960 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
17970 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
17980 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
17990 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68  ree(). Or, if th
179a0 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  e .** allocation
179b0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   comes from the 
179c0 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62  pSpace/szSpace b
179d0 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69  uffer, *ppFree i
179e0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
179f0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
17a00 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  g..**.** If an O
17a10 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
17a20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
17a30 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65  d..*/.UnpackedRe
17a40 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62  cord *sqlite3Vdb
17a50 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
17a60 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20  cord(.  KeyInfo 
17a70 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
17a80 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72          /* Descr
17a90 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65  iption of the re
17aa0 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cord */.  char *
17ab0 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  pSpace,         
17ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61            /* Una
17ad0 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61  ligned space ava
17ae0 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  ilable */.  int 
17af0 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  szSpace,        
17b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17b10 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20  ize of pSpace[] 
17b20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
17b30 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20  ar **ppFree     
17b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17b50 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f   OUT: Caller sho
17b60 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70 6f  uld free this po
17b70 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e  inter */.){.  Un
17b80 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b  packedRecord *p;
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17ba0 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   Unpacked record
17bb0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
17bc0 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20  int nOff;       
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70  /* Increment pSp
17bf0 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61  ace by nOff to a
17c00 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74  lign it */.  int
17c10 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c30 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
17c40 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20  required for *p 
17c50 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74  */..  /* We want
17c60 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f   to shift the po
17c70 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20  inter pSpace up 
17c80 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20  such that it is 
17c90 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a  8-byte aligned..
17ca0 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65    ** Thus, we ne
17cb0 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  ed to calculate 
17cc0 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62  a value, nOff, b
17cd0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20  etween 0 and 7, 
17ce0 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69  to shift .  ** i
17cf0 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65  t by.  If pSpace
17d00 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79   is already 8-by
17d10 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66  te aligned, nOff
17d20 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e   should be zero.
17d30 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28  .  */.  nOff = (
17d40 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f  8 - (SQLITE_PTR_
17d50 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26  TO_INT(pSpace) &
17d60 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74   7)) & 7;.  nByt
17d70 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
17d80 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
17d90 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29  )) + sizeof(Mem)
17da0 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  *(pKeyInfo->nFie
17db0 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79  ld+1);.  if( nBy
17dc0 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20  te>szSpace+nOff 
17dd0 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61  ){.    p = (Unpa
17de0 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c  ckedRecord *)sql
17df0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
17e00 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42  pKeyInfo->db, nB
17e10 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65  yte);.    *ppFre
17e20 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20  e = (char *)p;. 
17e30 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75     if( !p ) retu
17e40 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
17e50 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
17e60 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b  Record*)&pSpace[
17e70 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72  nOff];.    *ppFr
17e80 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  ee = 0;.  }..  p
17e90 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  ->aMem = (Mem*)&
17ea0 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
17eb0 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
17ec0 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
17ed0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
17ee0 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
17ef0 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
17f00 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
17f10 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
17f20 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
17f30 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
17f40 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b  .** Given the nK
17f50 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67  ey-byte encoding
17f60 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20   of a record in 
17f70 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65  pKey[], populate
17f80 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65   the .** Unpacke
17f90 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
17fa0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
17fb0 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
17fc0 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63  nt with the.** c
17fd0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
17fe0 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a  ecoded record..*
17ff0 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  / .void sqlite3V
18000 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
18010 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
18020 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
18030 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
18040 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
18050 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18070 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
18080 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
18090 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
180a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
180b0 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
180c0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
180d0 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  p      /* Popula
180e0 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72  te this structur
180f0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
18100 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ng. */.){.  cons
18110 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
18120 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
18130 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
18140 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20  Key;.  int d; . 
18150 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20   u32 idx;       
18160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18170 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b   /* Offset in aK
18180 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f  ey[] to read fro
18190 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20  m */.  u16 u;   
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181b0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
181c0 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
181d0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  */.  u32 szHdr;.
181e0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
181f0 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66  >aMem;..  p->def
18200 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61  ault_rc = 0;.  a
18210 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
18220 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
18230 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  ) );.  idx = get
18240 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
18250 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
18260 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
18270 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
18280 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
18290 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
182a0 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
182b0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
182c0 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
182d0 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
182e0 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
182f0 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
18300 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
18310 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c  .    /* pMem->fl
18320 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69  ags = 0; // sqli
18330 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
18340 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73  () will set this
18350 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70   for us */.    p
18360 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  Mem->szMalloc = 
18370 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69  0;.    d += sqli
18380 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
18390 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61  (&aKey[d], seria
183a0 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20  l_type, pMem);. 
183b0 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69     pMem++;.    i
183c0 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69  f( (++u)>=p->nFi
183d0 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  eld ) break;.  }
183e0 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b  .  assert( u<=pK
183f0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
18400 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c   1 );.  p->nFiel
18410 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51  d = u;.}..#if SQ
18420 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
18430 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
18440 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65  ompares two inde
18450 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72  x or table recor
18460 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61  d keys in the sa
18470 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65  me way.** as the
18480 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
18490 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74  rdCompare() rout
184a0 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65  ine. Unlike Vdbe
184b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c  RecordCompare(),
184c0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
184d0 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61  n deserializes a
184e0 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75  nd compares valu
184f0 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  es using the.** 
18500 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18510 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  lGet() and sqlit
18520 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66  e3MemCompare() f
18530 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20  unctions. It is 
18540 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72  used.** in asser
18550 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
18560 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
18570 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65  e optimized code
18580 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64   in.** sqlite3Vd
18590 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
185a0 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74  ) returns result
185b0 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f  s with these two
185c0 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a   primitives..**.
185d0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
185e0 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  f the result of 
185f0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71  comparison is eq
18600 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69  uivalent to desi
18610 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65  redResult..** Re
18620 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68  turn false if th
18630 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65  ere is a disagre
18640 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
18650 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
18660 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69  ompareDebug(.  i
18670 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
18680 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
18690 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f  Left key */.  co
186a0 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  nst UnpackedReco
186b0 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52  rd *pPKey2, /* R
186c0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
186d0 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20  t desiredResult 
186e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
186f0 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f  orrect answer */
18700 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
18710 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
18720 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
18730 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
18740 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
18750 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  1;          /* O
18760 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
18770 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
18780 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
18790 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
187a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
187b0 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  tes in header */
187c0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
187d0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
187e0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
187f0 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
18800 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
18810 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e  *)pKey1;.  KeyIn
18820 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
18830 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65  Mem mem1;..  pKe
18840 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
18850 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pKeyInfo;.  if( 
18860 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20  pKeyInfo->db==0 
18870 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
18880 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
18890 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
188a0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
188b0 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67  ;.  /* mem1.flag
188c0 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20  s = 0;  // Will 
188d0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  be initialized b
188e0 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  y sqlite3VdbeSer
188f0 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56  ialGet() */.  VV
18900 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d  A_ONLY( mem1.szM
18910 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
18920 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
18930 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
18940 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ts */..  /* Comp
18950 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61  ilers may compla
18960 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69  in that mem1.u.i
18970 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20   is potentially 
18980 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
18990 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69   ** We could ini
189a0 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73  tialize it, as s
189b0 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69  hown here, to si
189c0 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70  lence those comp
189d0 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74  laints..  ** But
189e0 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75   in fact, mem1.u
189f0 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63  .i will never ac
18a00 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75  tually be used u
18a10 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e  ninitialized, an
18a20 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68  d doing .  ** th
18a30 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e  e unnecessary in
18a40 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73  itialization has
18a50 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65   a measurable ne
18a60 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e  gative performan
18a70 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20  ce.  ** impact, 
18a80 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69  since this routi
18a90 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67  ne is a very hig
18aa0 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73  h runner.  And s
18ab0 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a  o, we choose.  *
18ac0 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  * to ignore the 
18ad0 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
18ae0 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73  s and leave this
18af0 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74   variable uninit
18b00 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
18b10 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30  /*  mem1.u.i = 0
18b20 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64  ;  // not needed
18b30 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63  , here to silenc
18b40 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
18b50 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20  ng */.  .  idx1 
18b60 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
18b70 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
18b80 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61  d1 = szHdr1;.  a
18b90 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
18ba0 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f  >nField+pKeyInfo
18bb0 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
18bc0 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52  2->nField || COR
18bd0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
18be0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
18bf0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
18c00 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
18c10 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
18c20 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
18c30 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
18c40 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
18c50 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
18c60 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
18c70 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
18c80 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
18c90 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
18ca0 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
18cb0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
18cc0 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
18cd0 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20  al_type1 );..   
18ce0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
18cf0 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
18d00 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e  key space remain
18d10 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20  ing to avoid.   
18d20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65   ** a buffer ove
18d30 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b  rread.  The "d1+
18d40 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20  serial_type1+2" 
18d50 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69  subexpression wi
18d60 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  ll.    ** always
18d70 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
18d80 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
18d90 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69   amount of requi
18da0 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20  red key space.. 
18db0 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61     ** Use that a
18dc0 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20  pproximation to 
18dd0 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65  avoid the more e
18de0 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f  xpensive call to
18df0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  .    ** sqlite3V
18e00 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
18e10 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  () in the common
18e20 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
18e30 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f    if( d1+serial_
18e40 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65  type1+2>(u32)nKe
18e50 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71  y1.     && d1+sq
18e60 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
18e70 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
18e80 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20  pe1)>(u32)nKey1 
18e90 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
18ea0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
18eb0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
18ec0 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
18ed0 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
18ee0 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
18ef0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
18f00 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
18f10 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20  ype1, &mem1);.. 
18f20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
18f30 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
18f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
18f50 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
18f60 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69   &pPKey2->aMem[i
18f70 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ], pKeyInfo->aCo
18f80 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ll[i]);.    if( 
18f90 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  rc!=0 ){.      a
18fa0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
18fb0 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
18fc0 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
18fd0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b   */.      if( pK
18fe0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
18ff0 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
19000 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49   rc = -rc;  /* I
19010 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
19020 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f   for DESC sort o
19030 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  rder. */.      }
19040 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75  .      goto debu
19050 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20  gCompareEnd;.   
19060 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77   }.    i++;.  }w
19070 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
19080 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
19090 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e  Field );..  /* N
190a0 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
190b0 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
190c0 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
190d0 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
190e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
190f0 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
19100 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
19110 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
19120 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
19130 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
19140 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
19150 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
19160 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
19170 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
19180 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
19190 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
191a0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
191b0 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
191c0 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
191d0 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
191e0 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
191f0 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
19200 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
19210 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
19220 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  rc = pPKey2->def
19230 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43  ault_rc;..debugC
19240 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28  ompareEnd:.  if(
19250 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d   desiredResult==
19260 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74  0 && rc==0 ) ret
19270 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
19280 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20  iredResult<0 && 
19290 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc<0 ) return 1;
192a0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
192b0 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29  sult>0 && rc>0 )
192c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
192d0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
192e0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b  turn 1;.  if( pK
192f0 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
19300 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
19310 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
19320 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19330 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64   Both *pMem1 and
19340 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20   *pMem2 contain 
19350 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43  string values. C
19360 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76  ompare the two v
19370 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74  alues.** using t
19380 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
19390 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20  uence pColl. As 
193a0 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20  usual, return a 
193b0 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a  negative , zero.
193c0 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76  ** or positive v
193d0 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69  alue if *pMem1 i
193e0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
193f0 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72  al to or greater
19400 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32   than .** *pMem2
19410 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
19420 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69  Similar in spiri
19430 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65  t to "rc = (*pMe
19440 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22  m1) - (*pMem2);"
19450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19460 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
19470 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65  ring(.  const Me
19480 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73  m *pMem1,.  cons
19490 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20  t Mem *pMem2,.  
194a0 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70  const CollSeq *p
194b0 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45  Coll,.  u8 *prcE
194c0 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
194d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
194e0 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74   OOM occurs, set
194f0 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
19500 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65   */.){.  if( pMe
19510 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e  m1->enc==pColl->
19520 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  enc ){.    /* Th
19530 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c  e strings are al
19540 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72  ready in the cor
19550 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20  rect encoding.  
19560 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a  Call the.     **
19570 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
19580 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f  tion directly */
19590 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  .    return pCol
195a0 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
195b0 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d  User,pMem1->n,pM
195c0 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c  em1->z,pMem2->n,
195d0 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c  pMem2->z);.  }el
195e0 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  se{.    int rc;.
195f0 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
19600 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74  v1, *v2;.    int
19610 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d   n1, n2;.    Mem
19620 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b   c1;.    Mem c2;
19630 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19640 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65  MemInit(&c1, pMe
19650 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  m1->db, MEM_Null
19660 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19670 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70  beMemInit(&c2, p
19680 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
19690 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
196a0 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
196b0 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d  py(&c1, pMem1, M
196c0 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73  EM_Ephem);.    s
196d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
196e0 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d  llowCopy(&c2, pM
196f0 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em2, MEM_Ephem);
19700 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65  .    v1 = sqlite
19710 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
19720 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20  te3_value*)&c1, 
19730 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
19740 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20   n1 = v1==0 ? 0 
19750 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d  : c1.n;.    v2 =
19760 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
19770 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
19780 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c2, pColl->en
19790 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d  c);.    n2 = v2=
197a0 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20  =0 ? 0 : c2.n;. 
197b0 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78     rc = pColl->x
197c0 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
197d0 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32  , n1, v1, n2, v2
197e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
197f0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31  beMemRelease(&c1
19800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19810 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32  beMemRelease(&c2
19820 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d  );.    if( (v1==
19830 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20 70  0 || v2==0) && p
19840 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20  rcErr ) *prcErr 
19850 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
19860 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19870 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70   }.}../*.** Comp
19880 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20  are two blobs.  
19890 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c  Return negative,
198a0 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
198b0 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  ve if the first.
198c0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  ** is less than,
198d0 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
198e0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73  eater than the s
198f0 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76  econd, respectiv
19900 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62  ely..** If one b
19910 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69 78 20  lob is a prefix 
19920 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68  of the other, th
19930 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20 69  en the shorter i
19940 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f  s the lessor..*/
19950 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
19960 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69  OINLINE int sqli
19970 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63  te3BlobCompare(c
19980 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63  onst Mem *pB1, c
19990 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a  onst Mem *pB2){.
199a0 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70    int c = memcmp
199b0 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c  (pB1->z, pB2->z,
199c0 20 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f   pB1->n>pB2->n ?
199d0 20 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e   pB2->n : pB1->n
199e0 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65 74  );.  if( c ) ret
199f0 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20  urn c;.  return 
19a00 70 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b  pB1->n - pB2->n;
19a10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  .}.../*.** Compa
19a20 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f  re the values co
19a30 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74  ntained by the t
19a40 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c  wo memory cells,
19a50 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65   returning.** ne
19a60 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20  gative, zero or 
19a70 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d  positive if pMem
19a80 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
19a90 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
19aa0 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65  ater.** than pMe
19ab0 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65  m2. Sorting orde
19ac0 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73  r is NULL's firs
19ad0 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e  t, followed by n
19ae0 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73  umbers (integers
19af0 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73  .** and reals) s
19b00 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c  orted numericall
19b10 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  y, followed by t
19b20 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74  ext ordered by t
19b30 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  he collating.** 
19b40 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61  sequence pColl a
19b50 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27  nd finally blob'
19b60 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d  s ordered by mem
19b70 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  cmp()..**.** Two
19b80 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
19b90 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61   considered equa
19ba0 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  l by this functi
19bb0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
19bc0 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e  e3MemCompare(con
19bd0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63  st Mem *pMem1, c
19be0 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c  onst Mem *pMem2,
19bf0 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
19c00 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31  pColl){.  int f1
19c10 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62  , f2;.  int comb
19c20 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66  ined_flags;..  f
19c30 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73  1 = pMem1->flags
19c40 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e  ;.  f2 = pMem2->
19c50 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65  flags;.  combine
19c60 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b  d_flags = f1|f2;
19c70 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62  .  assert( (comb
19c80 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d  ined_flags & MEM
19c90 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20  _RowSet)==0 );. 
19ca0 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
19cb0 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69  ue is NULL, it i
19cc0 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
19cd0 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76  other. If both v
19ce0 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e  alues.  ** are N
19cf0 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  ULL, return 0.. 
19d00 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
19d10 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  ed_flags&MEM_Nul
19d20 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
19d30 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20  (f2&MEM_Null) - 
19d40 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  (f1&MEM_Null);. 
19d50 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20   }..  /* If one 
19d60 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6d 62 65  value is a numbe
19d70 72 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  r and the other 
19d80 69 73 20 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62  is not, the numb
19d90 65 72 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a  er is less..  **
19da0 20 49 66 20 62 6f 74 68 20 61 72 65 20 6e 75 6d   If both are num
19db0 62 65 72 73 2c 20 63 6f 6d 70 61 72 65 20 61 73  bers, compare as
19dc0 20 72 65 61 6c 73 20 69 66 20 6f 6e 65 20 69 73   reals if one is
19dd0 20 61 20 72 65 61 6c 2c 20 6f 72 20 61 73 20 69   a real, or as i
19de0 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 69 66 20  ntegers.  ** if 
19df0 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 20  both values are 
19e00 69 6e 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20  integers..  */. 
19e10 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
19e20 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  ags&(MEM_Int|MEM
19e30 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 64 6f  _Real) ){.    do
19e40 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20  uble r1, r2;.   
19e50 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20   if( (f1 & f2 & 
19e60 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
19e70 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
19e80 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69  u.i < pMem2->u.i
19e90 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
19ea0 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
19eb0 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i > pMem2->u.i 
19ec0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
19ed0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
19ee0 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45  }.    if( (f1&ME
19ef0 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
19f00 20 20 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e      r1 = pMem1->
19f10 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  u.r;.    }else i
19f20 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21  f( (f1&MEM_Int)!
19f30 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d  =0 ){.      r1 =
19f40 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 31 2d 3e   (double)pMem1->
19f50 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  u.i;.    }else{.
19f60 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
19f70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
19f80 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  2&MEM_Real)!=0 )
19f90 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 70 4d 65  {.      r2 = pMe
19fa0 6d 32 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c  m2->u.r;.    }el
19fb0 73 65 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49  se if( (f2&MEM_I
19fc0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
19fd0 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65  r2 = (double)pMe
19fe0 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c  m2->u.i;.    }el
19ff0 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
1a000 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   -1;.    }.    i
1a010 66 28 20 72 31 3c 72 32 20 29 20 72 65 74 75 72  f( r1<r2 ) retur
1a020 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 72 31  n -1;.    if( r1
1a030 3e 72 32 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  >r2 ) return 1;.
1a040 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a050 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  }..  /* If one v
1a060 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
1a070 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69   and the other i
1a080 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74  s a blob, the st
1a090 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20  ring is less..  
1a0a0 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73  ** If both are s
1a0b0 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20  trings, compare 
1a0c0 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
1a0d0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  ing functions.. 
1a0e0 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1a0f0 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72  ed_flags&MEM_Str
1a100 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20   ){.    if( (f1 
1a110 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1a120 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1a130 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1a140 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f2 & MEM_Str)==0
1a150 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a160 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
1a170 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1a180 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 29  nc==pMem2->enc )
1a190 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
1a1a0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1a1b0 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20  _UTF8 || .      
1a1c0 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63        pMem1->enc
1a1d0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
1a1e0 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d   || pMem1->enc==
1a1f0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
1a200 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1a210 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1a220 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
1a230 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
1a240 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74  even if.    ** t
1a250 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20  he user deletes 
1a260 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1a270 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65  quence after the
1a280 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73   vdbe program is
1a290 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  .    ** compiled
1a2a0 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61   (this was not a
1a2b0 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e  lways the case).
1a2c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1a2d0 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43  rt( !pColl || pC
1a2e0 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20  oll->xCmp );..  
1a2f0 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1a300 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
1a310 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1a320 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70  (pMem1, pMem2, p
1a330 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Coll, 0);.    }.
1a340 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c      /* If a NULL
1a350 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73   pointer was pas
1a360 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61  sed as the colla
1a370 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c  te function, fal
1a380 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a  l through.    **
1a390 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73   to the blob cas
1a3a0 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70  e and use memcmp
1a3b0 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20  ().  */.  }. .  
1a3c0 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d  /* Both values m
1a3d0 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43  ust be blobs.  C
1a3e0 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d  ompare using mem
1a3f0 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74  cmp().  */.  ret
1a400 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  urn sqlite3BlobC
1a410 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d  ompare(pMem1, pM
1a420 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  em2);.}.../*.** 
1a430 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1a440 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
1a450 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1a460 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74  serial-type that
1a470 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  .** corresponds 
1a480 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  to an integer - 
1a490 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65  all values betwe
1a4a0 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75  en 1 and 9 inclu
1a4b0 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20  sive .** except 
1a4c0 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f  7. The second po
1a4d0 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
1a4e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69   containing an i
1a4f0 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20  nteger value.** 
1a500 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72  serialized accor
1a510 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74  ding to serial_t
1a520 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ype. This functi
1a530 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a  on deserializes.
1a540 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74  ** and returns t
1a550 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  he value..*/.sta
1a560 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f  tic i64 vdbeReco
1a570 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20  rdDecodeInt(u32 
1a580 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e  serial_type, con
1a590 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20  st u8 *aKey){.  
1a5a0 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28  u32 y;.  assert(
1a5b0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28   CORRUPT_DB || (
1a5c0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26  serial_type>=1 &
1a5d0 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39  & serial_type<=9
1a5e0 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21   && serial_type!
1a5f0 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =7) );.  switch(
1a600 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1a610 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20      case 0:.    
1a620 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65  case 1:.      te
1a630 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1a640 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1a650 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  turn ONE_BYTE_IN
1a660 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1a670 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 2:.      testc
1a680 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1a690 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1a6a0 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  n TWO_BYTE_INT(a
1a6b0 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33  Key);.    case 3
1a6c0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1a6d0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1a6e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1a6f0 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
1a700 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a  ey);.    case 4:
1a710 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1a720 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1a730 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  );.      y = FOU
1a740 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1a750 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a760 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
1a770 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1a780 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1a790 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1a7a0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a7b0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1a7c0 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
1a7d0 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1a7e0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1a7f0 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
1a800 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46  .      u64 x = F
1a810 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1a820 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1a830 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1a840 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  0 );.      x = (
1a850 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
1a860 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
1a870 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1a880 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20  64)*(i64*)&x;.  
1a890 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1a8a0 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  n (serial_type -
1a8b0 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   8);.}../*.** Th
1a8c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
1a8d0 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
1a8e0 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
1a8f0 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
1a900 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
1a910 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
1a920 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
1a930 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
1a940 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1a950 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
1a960 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1a970 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
1a980 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
1a990 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
1a9a0 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
1a9b0 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
1a9c0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
1a9d0 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
1a9e0 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65  f the VDBE.  The
1a9f0 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d   pPKey2.** key m
1aa00 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20  ust be a parsed 
1aa10 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61  key such as obta
1aa20 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
1aa30 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63  ite3VdbeParseRec
1aa40 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ord..**.** If ar
1aa50 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20  gument bSkip is 
1aa60 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20  non-zero, it is 
1aa70 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1aa80 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1aa90 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ady.** determine
1aaa0 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1aab0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b   fields of the k
1aac0 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a  eys are equal..*
1aad0 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65  *.** Key1 and Ke
1aae0 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  y2 do not have t
1aaf0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  o contain the sa
1ab00 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  me number of fie
1ab10 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20  lds. If all .** 
1ab20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65  fields that appe
1ab30 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20  ar in both keys 
1ab40 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
1ab50 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1ab60 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  rc is .** return
1ab70 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  ed..**.** If dat
1ab80 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1ab90 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20   is discovered, 
1aba0 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  set pPKey2->errC
1abb0 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  ode to .** SQLIT
1abc0 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65  E_CORRUPT and re
1abd0 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f  turn 0. If an OO
1abe0 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
1abf0 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65  ntered, .** pPKe
1ac00 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73  y2->errCode is s
1ac10 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1ac20 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73  EM and, if it is
1ac30 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a   not NULL, the.*
1ac40 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20  * malloc-failed 
1ac50 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61  flag set on data
1ac60 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b  base handle (pPK
1ac70 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
1ac80 62 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  b)..*/.static in
1ac90 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
1aca0 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69  areWithSkip(.  i
1acb0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1acc0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f  void *pKey1,   /
1acd0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1ace0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1acf0 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20  pPKey2,         
1ad00 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1ad10 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20    int bSkip     
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad30 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b    /* If true, sk
1ad40 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65  ip the first fie
1ad50 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  ld */.){.  u32 d
1ad60 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1ad70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1ad80 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1ad90 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1ada0 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
1adb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1adc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1add0 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c  dex of next fiel
1ade0 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  d to compare */.
1adf0 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae10 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
1ae20 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79  ord header in by
1ae30 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  tes */.  u32 idx
1ae40 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1ae50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1ae60 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65  et of first type
1ae70 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1ae80 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aea0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1aeb0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d  */.  Mem *pRhs =
1aec0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20   pPKey2->aMem;  
1aed0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65       /* Next fie
1aee0 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20  ld of pPKey2 to 
1aef0 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79  compare */.  Key
1af00 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
1af10 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1af20 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  o;.  const unsig
1af30 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1af40 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1af50 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1af60 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f    Mem mem1;..  /
1af70 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72  * If bSkip is tr
1af80 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ue, then the cal
1af90 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1afa0 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1afb0 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
1afc0 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1afd0 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
1afe0 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f  l. Fix the vario
1aff0 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  us stack variabl
1b000 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  es so.  ** that 
1b010 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67  this routine beg
1b020 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74  ins comparing at
1b030 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c   the second fiel
1b040 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69  d. */.  if( bSki
1b050 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b  p ){.    u32 s1;
1b060 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20  .    idx1 = 1 + 
1b070 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1b080 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20  y1[1], s1);.    
1b090 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30  szHdr1 = aKey1[0
1b0a0 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  ];.    d1 = szHd
1b0b0 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65  r1 + sqlite3Vdbe
1b0c0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31  SerialTypeLen(s1
1b0d0 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20  );.    i = 1;.  
1b0e0 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73    pRhs++;.  }els
1b0f0 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65  e{.    idx1 = ge
1b100 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1b110 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31   szHdr1);.    d1
1b120 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69   = szHdr1;.    i
1b130 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29  f( d1>(unsigned)
1b140 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20  nKey1 ){ .      
1b150 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1b160 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1b170 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1b180 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
1b190 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1b1a0 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20   }.    i = 0;.  
1b1b0 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  }..  VVA_ONLY( m
1b1c0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
1b1d0 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
1b1e0 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
1b1f0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61  tatements */.  a
1b200 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1b210 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1b220 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1b230 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
1b240 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20  2->nField .     
1b250 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
1b260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
1b270 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ey2->pKeyInfo->a
1b280 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
1b290 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1b2a0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
1b2b0 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
1b2c0 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c  ( idx1<=szHdr1 |
1b2d0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1b2e0 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65    do{.    u32 se
1b2f0 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1b300 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74  /* RHS is an int
1b310 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  eger */.    if( 
1b320 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1b330 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  M_Int ){.      s
1b340 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1b350 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1b360 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1b370 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1b380 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1b390 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20 20  pe>=12 ){.      
1b3a0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1b3b0 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1b3c0 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
1b3d0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1b3e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1b3f0 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1b400 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
1b410 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 70 52 68  hs = (double)pRh
1b420 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20  s->u.i;.        
1b430 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b440 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1b450 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1b460 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  em1);.        if
1b470 28 20 6d 65 6d 31 2e 75 2e 72 3c 72 68 73 20 29  ( mem1.u.r<rhs )
1b480 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1b490 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1b4a0 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e  se if( mem1.u.r>
1b4b0 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1b4c0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1b4d0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1b4e0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73  .        i64 lhs
1b4f0 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63   = vdbeRecordDec
1b500 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79  odeInt(serial_ty
1b510 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b  pe, &aKey1[d1]);
1b520 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73  .        i64 rhs
1b530 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20   = pRhs->u.i;.  
1b540 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68        if( lhs<rh
1b550 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1b560 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1b570 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68  }else if( lhs>rh
1b580 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1b590 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1b5a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b5b0 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72  .    /* RHS is r
1b5c0 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  eal */.    else 
1b5d0 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1b5e0 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
1b5f0 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1b600 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1b610 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1b620 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
1b630 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1b640 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1b650 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
1b660 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1b670 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b680 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20       double rhs 
1b690 3d 20 70 52 68 73 2d 3e 75 2e 72 3b 0a 20 20 20  = pRhs->u.r;.   
1b6a0 20 20 20 20 20 64 6f 75 62 6c 65 20 6c 68 73 3b       double lhs;
1b6b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b6c0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1b6d0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1b6e0 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20  _type, &mem1);. 
1b6f0 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61         if( seria
1b700 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1b710 20 20 20 20 20 20 20 6c 68 73 20 3d 20 6d 65 6d         lhs = mem
1b720 31 2e 75 2e 72 3b 0a 20 20 20 20 20 20 20 20 7d  1.u.r;.        }
1b730 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1b740 6c 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 6d 65  lhs = (double)me
1b750 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20  m1.u.i;.        
1b760 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68  }.        if( lh
1b770 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  s<rhs ){.       
1b780 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1b790 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68      }else if( lh
1b7a0 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  s>rhs ){.       
1b7b0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1b7c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b7d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1b7e0 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20  is a string */. 
1b7f0 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1b800 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
1b810 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61  r ){.      getVa
1b820 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
1b830 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
1b840 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1b850 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1b860 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1b870 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29  serial_type<12 )
1b880 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1b890 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1b8a0 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65  f( !(serial_type
1b8b0 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20   & 0x01) ){.    
1b8c0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1b8d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b8e0 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69    mem1.n = (seri
1b8f0 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
1b900 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  2;.        testc
1b910 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29  ase( (d1+mem1.n)
1b920 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1b930 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
1b940 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
1b950 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  n+1)==(unsigned)
1b960 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1b970 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29   if( (d1+mem1.n)
1b980 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65   > (unsigned)nKe
1b990 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y1 ){.          
1b9a0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1b9b0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1b9c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1b9d0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b9f0 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1ba00 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1ba10 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1ba20 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [i] ){.         
1ba30 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
1ba40 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20  Info->enc;.     
1ba50 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70       mem1.db = p
1ba60 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
1ba70 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67         mem1.flag
1ba80 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20  s = MEM_Str;.   
1ba90 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20         mem1.z = 
1baa0 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31  (char*)&aKey1[d1
1bab0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ];.          rc 
1bac0 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  = vdbeCompareMem
1bad0 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20  String(.        
1bae0 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68        &mem1, pRh
1baf0 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  s, pKeyInfo->aCo
1bb00 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e  ll[i], &pPKey2->
1bb10 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20  errCode.        
1bb20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c    );.        }el
1bb30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1bb40 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d  t nCmp = MIN(mem
1bb50 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  1.n, pRhs->n);. 
1bb60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
1bb70 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
1bb80 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
1bb90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1bba0 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31  c==0 ) rc = mem1
1bbb0 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20  .n - pRhs->n; . 
1bbc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1bbd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1bbe0 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  HS is a blob */.
1bbf0 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1bc00 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  s->flags & MEM_B
1bc10 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74  lob ){.      get
1bc20 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1bc30 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
1bc40 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
1bc50 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1bc60 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1bc70 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1bc80 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
1bc90 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20   & 0x01) ){.    
1bca0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1bcb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bcc0 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65    int nStr = (se
1bcd0 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
1bce0 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
1bcf0 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29  tcase( (d1+nStr)
1bd00 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1bd10 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
1bd20 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b  tcase( (d1+nStr+
1bd30 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  1)==(unsigned)nK
1bd40 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ey1 );.        i
1bd50 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28  f( (d1+nStr) > (
1bd60 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1bd70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  {.          pPKe
1bd80 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1bd90 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1bda0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1bdb0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1bdc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1bdd0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
1bde0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bdf0 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d      int nCmp = M
1be00 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e  IN(nStr, pRhs->n
1be10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1be20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
1be30 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43  d1], pRhs->z, nC
1be40 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  mp);.          i
1be50 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
1be60 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a  nStr - pRhs->n;.
1be70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1be80 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1be90 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20  RHS is null */. 
1bea0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73     else{.      s
1beb0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1bec0 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1bed0 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  rc = (serial_typ
1bee0 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e!=0);.    }..  
1bef0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1bf00 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
1bf10 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
1bf20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1bf30 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -rc;.      }.  
1bf40 20 20 20 20 61 73 73 65 72 74 28 20 76 64 62 65      assert( vdbe
1bf50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1bf60 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1bf70 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a   pPKey2, rc) );.
1bf80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
1bf90 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1bfa0 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
1bfb0 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
1bfc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1bfd0 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  }..    i++;.    
1bfe0 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b  pRhs++;.    d1 +
1bff0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1c000 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
1c010 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78  l_type);.    idx
1c020 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69  1 += sqlite3Vari
1c030 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  ntLen(serial_typ
1c040 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64  e);.  }while( id
1c050 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48  x1<(unsigned)szH
1c060 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
1c070 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28  >nField && d1<=(
1c080 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1c090 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72  ;..  /* No memor
1c0a0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
1c0b0 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d  ever used on mem
1c0c0 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75  1.  Prove this u
1c0d0 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f  sing.  ** the fo
1c0e0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
1c0f0 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74  .  If the assert
1c100 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64  () fails, it ind
1c110 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65  icates a.  ** me
1c120 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20  mory leak and a 
1c130 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  need to call sql
1c140 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1c150 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20  se(&mem1).  */. 
1c160 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1c170 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20  Malloc==0 );..  
1c180 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65  /* rc==0 here me
1c190 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20  ans that one or 
1c1a0 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73  both of the keys
1c1b0 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
1c1c0 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
1c1d0 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
1c1e0 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
1c1f0 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
1c200 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
1c210 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
1c220 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1c230 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64  DB .       || vd
1c240 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1c250 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1c260 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79  1, pPKey2, pPKey
1c270 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a  2->default_rc) .
1c280 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e         || pKeyIn
1c290 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
1c2a0 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75  iled.  );.  retu
1c2b0 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
1c2c0 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  lt_rc;.}.int sql
1c2d0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1c2e0 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
1c2f0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1c300 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1c310 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1c320 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1c330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
1c340 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72  ht key */.){.  r
1c350 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64  eturn vdbeRecord
1c360 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
1c370 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1c380 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  Key2, 0);.}.../*
1c390 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1c3a0 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
1c3b0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
1c3c0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1c3d0 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
1c3e0 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
1c3f0 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
1c400 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e  s an integer, an
1c410 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69  d (b) the .** si
1c420 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
1c430 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  int at the start
1c440 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
1c450 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
1c460 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e  le.** byte (i.e.
1c470 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32   is less than 12
1c480 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  8)..**.** To avo
1c490 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75  id concerns abou
1c4a0 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  t buffer overrea
1c4b0 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ds, this routine
1c4c0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a   is only used.**
1c4d0 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72   on schemas wher
1c4e0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  e the maximum va
1c4f0 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20  lid header size 
1c500 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c  is 63 bytes or l
1c510 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
1c520 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1c530 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e  pareInt(.  int n
1c540 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1c550 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1c560 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1c570 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1c580 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1c590 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
1c5a0 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28  st u8 *aKey = &(
1c5b0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1c5c0 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  )[*(const u8*)pK
1c5d0 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69  ey1 & 0x3F];.  i
1c5e0 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  nt serial_type =
1c5f0 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65   ((const u8*)pKe
1c600 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65  y1)[1];.  int re
1c610 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36  s;.  u32 y;.  u6
1c620 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70  4 x;.  i64 v = p
1c630 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75  PKey2->aMem[0].u
1c640 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a  .i;.  i64 lhs;..
1c650 20 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a    assert( (*(u8*
1c660 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c  )pKey1)<=0x3F ||
1c670 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1c680 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
1c690 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
1c6a0 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
1c6b0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c6c0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e  /.      lhs = ON
1c6d0 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1c6e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c6f0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1c700 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c710 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
1c720 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1c730 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1c740 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  s = TWO_BYTE_INT
1c750 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1c760 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1c770 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c780 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
1c790 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
1c7a0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1c7b0 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f      lhs = THREE_
1c7c0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1c7d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c7e0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1c7f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c800 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
1c810 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1c820 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20  er */.      y = 
1c830 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1c840 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  Key);.      lhs 
1c850 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  = (i64)*(int*)&y
1c860 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c870 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1c880 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c890 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
1c8a0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1c8b0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1c8c0 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  s = FOUR_BYTE_UI
1c8d0 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28  NT(aKey+2) + (((
1c8e0 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
1c8f0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1c900 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c910 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1c920 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c930 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62  case 6: { /* 8-b
1c940 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1c950 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20  er */.      x = 
1c960 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1c970 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  Key);.      x = 
1c980 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42  (x<<32) | FOUR_B
1c990 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29  YTE_UINT(aKey+4)
1c9a0 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28  ;.      lhs = *(
1c9b0 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74  i64*)&x;.      t
1c9c0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1c9d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c9e0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
1c9f0 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b   .      lhs = 0;
1ca00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ca10 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20    case 9:.      
1ca20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  lhs = 1;.      b
1ca30 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  reak;..    /* Th
1ca40 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65  is case could be
1ca50 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74   removed without
1ca60 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65   changing the re
1ca70 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67  sults of running
1ca80 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  .    ** this cod
1ca90 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20  e. Including it 
1caa0 63 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65  causes gcc to ge
1cab0 6e 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20  nerate a faster 
1cac0 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73  switch .    ** s
1cad0 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20  tatement (since 
1cae0 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69  the range of swi
1caf0 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20  tch targets now 
1cb00 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61  starts at zero a
1cb10 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e  nd.    ** is con
1cb20 74 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65  tiguous) but doe
1cb30 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
1cb40 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74  duplicate code t
1cb50 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20  o be generated. 
1cb60 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73     ** (as gcc is
1cb70 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74   clever enough t
1cb80 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77  o combine the tw
1cb90 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f  o like cases). O
1cba0 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d  ther .    ** com
1cbb0 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20  pilers might be 
1cbc0 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20  similar.  */ .  
1cbd0 20 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37    case 0: case 7
1cbe0 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
1cbf0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1cc00 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
1cc10 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a  Key1, pPKey2);..
1cc20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1cc30 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1cc40 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1cc50 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
1cc60 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20   pPKey2);.  }.. 
1cc70 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20   if( v>lhs ){.  
1cc80 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1cc90 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r1;.  }else if( 
1cca0 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v<lhs ){.    res
1ccb0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
1ccc0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79   }else if( pPKey
1ccd0 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
1cce0 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
1ccf0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
1cd00 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
1cd10 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72  . Compare the tr
1cd20 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66  ailing .    ** f
1cd30 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72  ields.  */.    r
1cd40 65 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 43  es = vdbeRecordC
1cd50 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
1cd60 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1cd70 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  ey2, 1);.  }else
1cd80 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
1cd90 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
1cda0 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71   two keys are eq
1cdb0 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72  ual and there ar
1cdc0 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20  e no trailing.  
1cdd0 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74    ** fields. Ret
1cde0 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
1cdf0 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63  ult_rc in this c
1ce00 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20  ase. */.    res 
1ce10 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
1ce20 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  t_rc;.  }..  ass
1ce30 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
1ce40 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1ce50 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1ce60 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75  , res) );.  retu
1ce70 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
1ce80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ce90 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
1cea0 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
1ceb0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1cec0 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61  re() .** that (a
1ced0 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
1cee0 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61  d of pPKey2 is a
1cef0 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62   string, that (b
1cf00 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
1cf10 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f  d.** uses the co
1cf20 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1cf30 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20   BINARY and (c) 
1cf40 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
1cf50 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a  -header varint .
1cf60 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ** at the start 
1cf70 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  of (pKey1/nKey1)
1cf80 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
1cf90 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  e byte..*/.stati
1cfa0 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1cfb0 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20  CompareString(. 
1cfc0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1cfd0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1cfe0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1cff0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1d000 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
1d010 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
1d020 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
1d030 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29  y1 = (const u8*)
1d040 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72  pKey1;.  int ser
1d050 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20  ial_type;.  int 
1d060 72 65 73 3b 0a 0a 20 20 67 65 74 56 61 72 69 6e  res;..  getVarin
1d070 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
1d080 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69  erial_type);.  i
1d090 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1d0a0 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  2 ){.    res = p
1d0b0 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20  PKey2->r1;      
1d0c0 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
1d0d0 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20   is a number or 
1d0e0 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73  a null */.  }els
1d0f0 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1d100 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a  ype & 0x01) ){ .
1d110 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1d120 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r2;      /* (p
1d130 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
1d140 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65   blob */.  }else
1d150 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a  {.    int nCmp;.
1d160 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20      int nStr;.  
1d170 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b    int szHdr = aK
1d180 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74  ey1[0];..    nSt
1d190 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1d1a0 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66  -12) / 2;.    if
1d1b0 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29  ( (szHdr + nStr)
1d1c0 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20   > nKey1 ){.    
1d1d0 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1d1e0 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1d1f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1d200 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d210 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1d220 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20  .    }.    nCmp 
1d230 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61  = MIN( pPKey2->a
1d240 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29  Mem[0].n, nStr )
1d250 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63  ;.    res = memc
1d260 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d  mp(&aKey1[szHdr]
1d270 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  , pPKey2->aMem[0
1d280 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20  ].z, nCmp);..   
1d290 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
1d2a0 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20       res = nStr 
1d2b0 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  - pPKey2->aMem[0
1d2c0 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ].n;.      if( r
1d2d0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
1d2e0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
1d2f0 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  eld>1 ){.       
1d300 20 20 20 72 65 73 20 3d 20 76 64 62 65 52 65 63     res = vdbeRec
1d310 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1d320 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
1d330 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20   pPKey2, 1);.   
1d340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d350 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1d360 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1d370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d380 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
1d390 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
1d3a0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20   pPKey2->r2;.   
1d3b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d3c0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1d3d0 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r1;.      }.    
1d3e0 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
1d3f0 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
1d400 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d  PKey2->r2;.    }
1d410 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20  else{.      res 
1d420 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1d430 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1d440 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1d450 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1d460 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1d470 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43  res).       || C
1d480 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20  ORRUPT_DB.      
1d490 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79   || pPKey2->pKey
1d4a0 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1d4b0 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65  Failed.  );.  re
1d4c0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1d4d0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1d4e0 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
1d4f0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1d500 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20  re() compatible 
1d510 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74  function.** suit
1d520 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69  able for compari
1d530 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65  ng serialized re
1d540 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70  cords to the unp
1d550 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73  acked record pas
1d560 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e  sed.** as the on
1d570 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
1d580 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71  RecordCompare sq
1d590 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
1d5a0 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63  pare(UnpackedRec
1d5b0 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61  ord *p){.  /* va
1d5c0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
1d5d0 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e  eInt() and varin
1d5e0 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  tRecordCompareSt
1d5f0 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75  ring() both assu
1d600 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  me.  ** that the
1d610 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
1d620 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75  varint that occu
1d630 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  rs at the start 
1d640 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20  of each record. 
1d650 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69   ** fits in a si
1d660 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20  ngle byte (i.e. 
1d670 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e  is 127 or less).
1d680 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
1d690 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61  pareInt().  ** a
1d6a0 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
1d6b0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f   it is safe to o
1d6c0 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72  verread a buffer
1d6d0 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65   by at least the
1d6e0 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70   .  ** maximum p
1d6f0 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65  ossible legal he
1d700 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38  ader size plus 8
1d710 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20   bytes. Because 
1d720 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75  there is.  ** gu
1d730 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1d740 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20  t least 74 (but 
1d750 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f  not 136) bytes o
1d760 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77  f padding follow
1d770 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75  ing each.  ** bu
1d780 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76  ffer passed to v
1d790 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
1d7a0 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b  reInt() this mak
1d7b0 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74  es it convenient
1d7c0 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74   to.  ** limit t
1d7d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
1d7e0 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65  eader to 64 byte
1d7f0 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65  s in cases where
1d800 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1d810 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65  .  ** is an inte
1d820 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ger..  **.  ** T
1d830 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74  he easiest way t
1d840 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c  o enforce this l
1d850 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69  imit is to consi
1d860 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73  der only records
1d870 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69   with.  ** 13 fi
1d880 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66  elds or less. If
1d890 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1d8a0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
1d8b0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  the maximum lega
1d8c0 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69  l.  ** header si
1d8d0 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20  ze is (12*5 + 1 
1d8e0 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a  + 1) bytes.  */.
1d8f0 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e    if( (p->pKeyIn
1d900 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e  fo->nField + p->
1d910 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1d920 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e  d)<=13 ){.    in
1d930 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65  t flags = p->aMe
1d940 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20  m[0].flags;.    
1d950 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  if( p->pKeyInfo-
1d960 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29  >aSortOrder[0] )
1d970 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20  {.      p->r1 = 
1d980 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
1d990 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
1d9a0 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31        p->r1 = -1
1d9b0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
1d9c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1d9d0 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e   (flags & MEM_In
1d9e0 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
1d9f0 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
1da00 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20  pareInt;.    }. 
1da10 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
1da20 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b  gs & MEM_Real );
1da30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
1da40 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
1da50 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1da60 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f   flags & MEM_Blo
1da70 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  b );.    if( (fl
1da80 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c  ags & (MEM_Real|
1da90 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f  MEM_Null|MEM_Blo
1daa0 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65  b))==0 && p->pKe
1dab0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d  yInfo->aColl[0]=
1dac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1dad0 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  rt( flags & MEM_
1dae0 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74  Str );.      ret
1daf0 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
1db00 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20  mpareString;.   
1db10 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1db20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1db30 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a  rdCompare;.}../*
1db40 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20  .** pCur points 
1db50 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
1db60 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  y created using 
1db70 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1db80 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61  d opcode..** Rea
1db90 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65  d the rowid (the
1dba0 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74   last field in t
1dbb0 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73  he record) and s
1dbc0 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
1dbd0 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  d..** Return SQL
1dbe0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
1dbf0 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
1dc00 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
1dc10 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  erwise..**.** pC
1dc20 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e  ur might be poin
1dc30 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74  ting to text obt
1dc40 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72  ained from a cor
1dc50 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
1dc60 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f  le..** So the co
1dc70 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntent cannot be 
1dc80 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70  trusted.  Do app
1dc90 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20  ropriate checks 
1dca0 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a  on the content..
1dcb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1dcc0 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74  beIdxRowid(sqlit
1dcd0 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72  e3 *db, BtCursor
1dce0 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
1dcf0 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
1dd00 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
1dd10 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
1dd20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1dd30 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
1dd40 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
1dd50 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
1dd60 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
1dd70 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
1dd80 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
1dd90 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
1dda0 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a   Mem m, v;..  /*
1ddb0 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
1ddc0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
1ddd0 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
1dde0 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
1ddf0 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
1de00 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
1de10 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
1de20 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
1de30 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e  ruption..  ** An
1de40 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  y corruption is 
1de50 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69  detected in sqli
1de60 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
1de70 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20  lPtr(), though, 
1de80 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  so.  ** this cod
1de90 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73  e can safely ass
1dea0 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65  ume that nCellKe
1deb0 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20  y is 32-bits  . 
1dec0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
1ded0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1dee0 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
1def0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
1df00 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
1df10 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
1df20 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
1df30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1df40 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69  );     /* pCur i
1df50 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
1df60 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
1df70 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72   fail */.  asser
1df80 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
1df90 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
1dfa0 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
1dfb0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
1dfc0 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
1dfd0 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
1dfe0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
1dff0 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1e000 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
1e010 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
1e020 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
1e030 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
1e040 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
1e050 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1e060 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
1e070 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
1e080 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
1e090 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
1e0a0 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
1e0b0 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
1e0c0 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
1e0d0 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
1e0e0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
1e0f0 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
1e100 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
1e110 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
1e120 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
1e130 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
1e140 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
1e150 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
1e160 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
1e170 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
1e180 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
1e190 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1e1a0 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
1e1b0 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
1e1c0 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
1e1d0 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
1e1e0 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
1e1f0 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
1e200 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1e210 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
1e220 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
1e230 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1e240 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
1e250 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1e260 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
1e270 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1e280 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
1e290 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
1e2a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1e2b0 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
1e2c0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1e2d0 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
1e2e0 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
1e2f0 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
1e300 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
1e310 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
1e320 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
1e330 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
1e340 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
1e350 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1e360 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65  typeRowid);.  te
1e370 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e  stcase( (u32)m.n
1e380 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  ==szHdr+lenRowid
1e390 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
1e3a0 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64  ly((u32)m.n<szHd
1e3b0 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20  r+lenRowid) ){. 
1e3c0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
1e3d0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
1e3e0 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68  }..  /* Fetch th
1e3f0 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68  e integer off th
1e400 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
1e410 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
1e420 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1e430 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
1e440 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
1e450 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
1e460 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
1e470 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1e480 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
1e490 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e4a0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
1e4b0 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  if database corr
1e4c0 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
1e4d0 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62  ed after m has b
1e4e0 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  een.  ** allocat
1e4f0 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20  ed.  Free the m 
1e500 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
1e510 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e520 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63  . */.idx_rowid_c
1e530 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73  orruption:.  tes
1e540 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f  tcase( m.szMallo
1e550 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c!=0 );.  sqlite
1e560 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1e570 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
1e580 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e590 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  T;.}../*.** Comp
1e5a0 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74  are the key of t
1e5b0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
1e5c0 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73  hat cursor pC is
1e5d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61   pointing to aga
1e5e0 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
1e5f0 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63  string in pUnpac
1e600 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ked.  Write into
1e610 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
1e620 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
1e630 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1e640 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
1e650 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1e660 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
1e670 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65  er than pUnpacke
1e680 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
1e690 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
1e6a0 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64  .**.** pUnpacked
1e6b0 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
1e6c0 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
1e6d0 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
1e6e0 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
1e6f0 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
1e700 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
1e710 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
1e720 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
1e730 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
1e740 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65  red as well.  He
1e750 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  nce, this routin
1e760 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20  e only compares 
1e770 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a  the prefixes .**
1e780 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69   of the keys pri
1e790 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20  or to the final 
1e7a0 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65  rowid, not the e
1e7b0 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  ntire key..*/.in
1e7c0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
1e7d0 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71  KeyCompare(.  sq
1e7e0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e800 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1e810 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43  ction */.  VdbeC
1e820 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20  ursor *pC,      
1e830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e840 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d  he cursor to com
1e850 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
1e860 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1e870 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20   *pUnpacked,    
1e880 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76     /* Unpacked v
1e890 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f  ersion of key */
1e8a0 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1e8d0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75   comparison resu
1e8e0 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  lt here */.){.  
1e8f0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
1e900 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
1e910 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
1e920 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65  C->pCursor;.  Me
1e930 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  m m;..  assert( 
1e940 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1e950 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
1e960 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63  );.  VVA_ONLY(rc
1e970 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65   =) sqlite3Btree
1e980 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
1e990 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65  CellKey);.  asse
1e9a0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
1e9b0 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20  K );    /* pCur 
1e9c0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
1e9d0 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f  so KeySize canno
1e9e0 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e  t fail */.  /* n
1e9f0 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77  CellKey will alw
1ea00 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30  ays be between 0
1ea10 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20   and 0xffffffff 
1ea20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
1ea30 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72  ay.  ** that btr
1ea40 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
1ea50 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56   and sqlite3GetV
1ea60 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d  arint32() are im
1ea70 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69  plemented */.  i
1ea80 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c  f( nCellKey<=0 |
1ea90 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66  | nCellKey>0x7ff
1eaa0 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65  fffff ){.    *re
1eab0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
1eac0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1ead0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
1eae0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1eaf0 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63  &m, db, 0);.  rc
1eb00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
1eb10 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70  mFromBtree(pC->p
1eb20 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29  Cursor, 0, (u32)
1eb30 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
1eb40 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1eb50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1eb60 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
1eb70 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1eb80 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e  re(m.n, m.z, pUn
1eb90 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74  packed);.  sqlit
1eba0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1ebb0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
1ebc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1ebd0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ebe0 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
1ebf0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
1ec00 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
1ec10 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
1ec20 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
1ec30 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1ec40 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
1ec50 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
1ec60 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
1ec70 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
1ec80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ec90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
1eca0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62  ->mutex) );.  db
1ecb0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61  ->nChange = nCha
1ecc0 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61  nge;.  db->nTota
1ecd0 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  lChange += nChan
1ece0 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ge;.}../*.** Set
1ecf0 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76   a flag in the v
1ed00 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  dbe to update th
1ed10 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1ed20 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61   when it is fina
1ed30 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65  lised.** or rese
1ed40 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1ed50 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
1ed60 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76  es(Vdbe *v){.  v
1ed70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20  ->changeCntOn = 
1ed80 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
1ed90 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20   every prepared 
1eda0 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69  statement associ
1edb0 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
1edc0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
1edd0 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a  ** as expired..*
1ede0 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20  *.** An expired 
1edf0 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20  statement means 
1ee00 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69  that recompilati
1ee10 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  on of the statem
1ee20 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d  ent is.** recomm
1ee30 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73  end.  Statements
1ee40 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69   expire when thi
1ee50 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20  ngs happen that 
1ee60 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72  make their.** pr
1ee70 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e  ograms obsolete.
1ee80 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d    Removing user-
1ee90 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
1eea0 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  s or collating.*
1eeb0 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20  * sequences, or 
1eec0 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68  changing an auth
1eed0 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69  orization functi
1eee0 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73  on are the types
1eef0 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68   of.** things th
1ef00 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64  at make prepared
1ef10 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f   statements obso
1ef20 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lete..*/.void sq
1ef30 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
1ef40 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71  redStatements(sq
1ef50 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
1ef60 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d  be *p;.  for(p =
1ef70 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70   db->pVdbe; p; p
1ef80 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1ef90 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
1efa0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
1efb0 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  urn the database
1efc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1efd0 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71   the Vdbe..*/.sq
1efe0 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64  lite3 *sqlite3Vd
1eff0 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20  beDb(Vdbe *v){. 
1f000 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d   return v->db;.}
1f010 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1f020 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
1f030 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
1f040 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
1f050 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
1f060 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
1f070 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
1f080 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
1f090 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
1f0a0 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
1f0b0 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
1f0c0 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
1f0d0 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
1f0e0 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
1f0f0 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
1f100 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
1f110 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1f120 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
1f130 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
1f140 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
1f150 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
1f160 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
1f170 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
1f180 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
1f190 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
1f1a0 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
1f1b0 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
1f1c0 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
1f1d0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1f1e0 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
1f1f0 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
1f200 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e    if( 0==(pMem->
1f210 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
1f220 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1f230 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d  e3_value *pRet =
1f240 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
1f250 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69  (v->db);.      i
1f260 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
1f270 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1f280 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65  mCopy((Mem *)pRe
1f290 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  t, pMem);.      
1f2a0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70    sqlite3ValueAp
1f2b0 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74  plyAffinity(pRet
1f2c0 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54  , aff, SQLITE_UT
1f2d0 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  F8);.      }.   
1f2e0 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a     return pRet;.
1f2f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1f300 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
1f310 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72  onfigure SQL var
1f320 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68  iable iVar so th
1f330 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77  at binding a new
1f340 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67   value to it sig
1f350 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  nals.** to sqlit
1f360 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20  e3_reoptimize() 
1f370 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e  that re-preparin
1f380 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
1f390 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
1f3a0 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20   a better query 
1f3b0 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  plan..*/.void sq
1f3c0 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
1f3d0 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ask(Vdbe *v, int
1f3e0 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74   iVar){.  assert
1f3f0 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
1f400 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20  ( iVar>32 ){.   
1f410 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78   v->expmask = 0x
1f420 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73  ffffffff;.  }els
1f430 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  e{.    v->expmas
1f440 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20  k |= ((u32)1 << 
1f450 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d  (iVar-1));.  }.}
1f460 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1f470 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1f480 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  LE./*.** Transfe
1f490 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  r error message 
1f4a0 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c  text from an sql
1f4b0 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73  ite3_vtab.zErrMs
1f4c0 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
1f4d0 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
1f4e0 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1f4f0 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61  3_malloc) into a
1f500 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74   Vdbe.zErrMsg (t
1f510 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
1f520 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
1f530 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
1f540 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20  alloc)..*/.void 
1f550 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
1f560 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c  tErrmsg(Vdbe *p,
1f570 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
1f580 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  Vtab){.  sqlite3
1f590 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
1f5a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1f5b0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
1f5c0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71   p->zErrMsg = sq
1f5d0 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
1f5e0 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
1f5f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1f600 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
1f610 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
1f620 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  Msg = 0;.}.#endi
1f630 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1f640 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
1f650 0a                                               .