/ Hex Artifact Content
Login

Artifact eda1c639cec26e648de92ae61e703a4f6f857504e799c355e6e48b8ad2166f71:


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 6f 70  ./*.** Add an op
1810: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1820: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1830: 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20  with a P4_INT64 
1840: 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  type..*/.int sql
1850: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75  ite3VdbeAddOp4Du
1860: 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p8(.  Vdbe *p,  
1870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1880: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
1890: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
18a0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
18b0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
18c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
18d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18e0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
18f0: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1900: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1910: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1920: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1930: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1940: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  nd */.  const u8
1950: 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54   *zP4,      /* T
1960: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
1970: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
1980: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
1990: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
19a0: 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d    char *p4copy =
19b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
19c0: 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65 44  Raw(sqlite3VdbeD
19d0: 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20  b(p), 8);.  if( 
19e0: 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28  p4copy ) memcpy(
19f0: 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b  p4copy, zP4, 8);
1a00: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1a10: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f  3VdbeAddOp4(p, o
1a20: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70  p, p1, p2, p3, p
1a30: 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a  4copy, p4type);.
1a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1a50: 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f  OP_ParseSchema o
1a60: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
1a70: 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f  tine is broken o
1a80: 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ut from.** sqlit
1a90: 65 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 73  e3VdbeAddOp4() s
1aa0: 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f  ince it needs to
1ab0: 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d   also needs to m
1ac0: 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a  ark all btrees.*
1ad0: 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e  * as having been
1ae0: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
1af0: 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d   zWhere string m
1b00: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
1b10: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1b20: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
1b30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1b40: 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69  ll take ownershi
1b50: 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  p of the allocat
1b60: 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f  ed memory..*/.vo
1b70: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  id sqlite3VdbeAd
1b80: 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56  dParseSchemaOp(V
1b90: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c  dbe *p, int iDb,
1ba0: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a   char *zWhere){.
1bb0: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61    int j;.  int a
1bc0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1bd0: 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61  eAddOp3(p, OP_Pa
1be0: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
1bf0: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
1c00: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1c10: 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34  addr, zWhere, P4
1c20: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72  _DYNAMIC);.  for
1c30: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e  (j=0; j<p->db->n
1c40: 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33  Db; j++) sqlite3
1c50: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c  VdbeUsesBtree(p,
1c60: 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   j);.}../*.** Ad
1c70: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
1c80: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
1c90: 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74   value as an int
1ca0: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
1cb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1cc0: 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  t(.  Vdbe *p,   
1cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1ce0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1cf0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1d00: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1d10: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1d20: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d40: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1d50: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1d60: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1d70: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1d80: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1d90: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1da0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20  d */.  int p4   
1db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1dc0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20  e P4 operand as 
1dd0: 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b  an integer */.){
1de0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
1df0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1e00: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
1e10: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
1e20: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
1e30: 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  r, SQLITE_INT_TO
1e40: 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54  _PTR(p4), P4_INT
1e50: 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  32);.  return ad
1e60: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  dr;.}../*.** Cre
1e70: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
1e80: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
1e90: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1ea0: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
1eb0: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
1ec0: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
1ed0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
1ee0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
1ef0: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
1f00: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
1f10: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
1f20: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
1f30: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
1f40: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
1f50: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
1f60: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
1f70: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
1f80: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
1f90: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
1fa0: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
1fb0: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
1fc0: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
1fd0: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
1fe0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
1ff0: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
2000: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
2010: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
2020: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
2030: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
2040: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
2050: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
2060: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
2070: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
2080: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
2090: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
20a0: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
20b0: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
20c0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
20d0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
20e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
20f0: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
2100: 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d  v){.  Parse *p =
2110: 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   v->pParse;.  in
2120: 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b  t i = p->nLabel+
2130: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e  +;.  assert( v->
2140: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2150: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2160: 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29  (i & (i-1))==0 )
2170: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20  {.    p->aLabel 
2180: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
2190: 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20  ocOrFree(p->db, 
21a0: 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20  p->aLabel, .    
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f     (i*2+1)*sizeo
21e0: 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29  f(p->aLabel[0]))
21f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
2200: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
2210: 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a  aLabel[i] = -1;.
2220: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d    }.  return -1-
2230: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f  i;.}../*.** Reso
2240: 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f  lve label "x" to
2250: 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20   be the address 
2260: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
2270: 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65  ruction to.** be
2280: 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20   inserted.  The 
2290: 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75  parameter "x" mu
22a0: 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74  st have been obt
22b0: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20  ained from.** a 
22c0: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
22d0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
22e0: 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  el()..*/.void sq
22f0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2300: 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69  Label(Vdbe *v, i
2310: 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a  nt x){.  Parse *
2320: 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20  p = v->pParse;. 
2330: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20   int j = -1-x;. 
2340: 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69   assert( v->magi
2350: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2360: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
2370: 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  j<p->nLabel );. 
2380: 20 69 66 28 20 41 4c 57 41 59 53 28 6a 3e 3d 30   if( ALWAYS(j>=0
2390: 29 20 26 26 20 70 2d 3e 61 4c 61 62 65 6c 20 29  ) && p->aLabel )
23a0: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b  {.    p->aLabel[
23b0: 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d  j] = v->nOp;.  }
23c0: 0a 20 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d  .  p->iFixedOp =
23d0: 20 76 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a   v->nOp - 1;.}..
23e0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56  /*.** Mark the V
23f0: 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20  DBE as one that 
2400: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20  can only be run 
2410: 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  one time..*/.voi
2420: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e  d sqlite3VdbeRun
2430: 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70  OnlyOnce(Vdbe *p
2440: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
2450: 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64  nce = 1;.}..#ifd
2460: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
2470: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
2480: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
2490: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
24a0: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
24b0: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
24c0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
24d0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
24e0: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
24f0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
2500: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
2510: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
2520: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
2530: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
2540: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
2550: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
2560: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
2570: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
2580: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
2590: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
25a0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
25b0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
25c0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
25f0: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
2600: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
2610: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
2620: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
2630: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
2640: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
2650: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
2660: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2670: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
2680: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2690: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
26a0: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
26b0: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
26c0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
26d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
26e0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
26f0: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
2700: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
2710: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
2720: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2730: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
2740: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
2750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2760: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2770: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
2780: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
2790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
27a0: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
27b0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
27c0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
27d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27e0: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
27f0: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
2800: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
2810: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
2820: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
2830: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
2840: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
2850: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
2860: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
2870: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
2880: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
2890: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
28a0: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
28b0: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
28c0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
28d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28e0: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
28f0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
2900: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
2910: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
2920: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
2930: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
2940: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
2950: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
2960: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
2970: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
2980: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
2990: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
29a0: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
29b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
29c0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
29d0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
29e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
29f0: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
2a00: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
2a10: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
2a20: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
2a30: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
2a40: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2a50: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
2a60: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
2a70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2a80: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
2a90: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
2aa0: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
2ab0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
2ac0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
2ad0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
2ae0: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
2af0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
2b00: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
2b10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b20: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
2b30: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
2b40: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
2b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2b60: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2b70: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
2b80: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
2b90: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
2ba0: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
2bb0: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
2bc0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
2bd0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
2be0: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
2bf0: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
2c00: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
2c10: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
2c20: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
2c30: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
2c40: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
2c50: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
2c60: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
2c70: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
2c80: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
2c90: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
2ca0: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
2cb0: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
2cc0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
2cd0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
2ce0: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
2cf0: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
2d00: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
2d10: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
2d20: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
2d30: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
2d40: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
2d50: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
2d60: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
2d70: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
2d80: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65  ).**.** Then che
2d90: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
2da0: 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62  e of Parse.mayAb
2db0: 6f 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61  ort is true if a
2dc0: 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62  n.** ABORT may b
2dd0: 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c  e thrown, or fal
2de0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65  se otherwise. Re
2df0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
2e00: 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f  does.** match, o
2e10: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
2e20: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
2e30: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
2e40: 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61  be used as.** pa
2e50: 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20  rt of an assert 
2e60: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
2e70: 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c   compiler. Simil
2e80: 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  ar to:.**.**   a
2e90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
2ea0: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2eb0: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
2ec0: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
2ed0: 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ) );.*/.int sqli
2ee0: 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79  te3VdbeAssertMay
2ef0: 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69  Abort(Vdbe *v, i
2f00: 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20  nt mayAbort){.  
2f10: 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30  int hasAbort = 0
2f20: 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75  ;.  int hasFkCou
2f30: 6e 74 65 72 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  nter = 0;.  Op *
2f40: 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65  pOp;.  VdbeOpIte
2f50: 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65  r sIter;.  memse
2f60: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
2f70: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73  eof(sIter));.  s
2f80: 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77  Iter.v = v;..  w
2f90: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
2fa0: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
2fb0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  !=0 ){.    int o
2fc0: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
2fd0: 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63  ode;.    if( opc
2fe0: 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20  ode==OP_Destroy 
2ff0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  || opcode==OP_VU
3000: 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d  pdate || opcode=
3010: 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20  =OP_VRename .   
3020: 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f    || ((opcode==O
3030: 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65  P_Halt || opcode
3040: 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29  ==OP_HaltIfNull)
3050: 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f 70   .      && ((pOp
3060: 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->p1&0xff)==SQLI
3070: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
3080: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
3090: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  rt)).    ){.    
30a0: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a    hasAbort = 1;.
30b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
30c0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
30d0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
30e0: 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  EY.    if( opcod
30f0: 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  e==OP_FkCounter 
3100: 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26  && pOp->p1==0 &&
3110: 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20   pOp->p2==1 ){. 
3120: 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65       hasFkCounte
3130: 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  r = 1;.    }.#en
3140: 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  dif.  }.  sqlite
3150: 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73  3DbFree(v->db, s
3160: 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20  Iter.apSub);..  
3170: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
3180: 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  f hasAbort==mayA
3190: 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61  bort. Or if a ma
31a0: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
31b0: 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d  urred..  ** If m
31c0: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68  alloc failed, th
31d0: 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c  en the while() l
31e0: 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f  oop above may no
31f0: 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a  t have iterated.
3200: 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c    ** through all
3210: 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73   opcodes and has
3220: 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74  Abort may be set
3230: 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65   incorrectly. Re
3240: 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66  turn.  ** true f
3250: 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20  or this case to 
3260: 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65  prevent the asse
3270: 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c  rt() in the call
3280: 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66  ers frame.  ** f
3290: 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f  rom failing.  */
32a0: 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64  .  return ( v->d
32b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
32c0: 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  || hasAbort==may
32d0: 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f  Abort || hasFkCo
32e0: 75 6e 74 65 72 20 29 3b 0a 7d 0a 23 65 6e 64 69  unter );.}.#endi
32f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
3300: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
3310: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3320: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
3330: 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  ** Loop through 
3340: 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b  the program look
3350: 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65  ing for P2 value
3360: 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61 74  s that are negat
3370: 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69  ive.** on jump i
3380: 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61  nstructions.  Ea
3390: 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73  ch such value is
33a0: 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c   a label.  Resol
33b0: 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  ve the.** label 
33c0: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
33d0: 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63  2 value to its c
33e0: 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20  orrect non-zero 
33f0: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
3400: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3410: 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61  led once after a
3420: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
3430: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  been inserted..*
3440: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70  *.** Variable *p
3450: 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73  MaxFuncArgs is s
3460: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
3470: 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50  m value of any P
3480: 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  2 argument .** t
3490: 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  o an OP_Function
34a0: 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  , OP_AggStep or 
34b0: 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64  OP_VFilter opcod
34c0: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
34d0: 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  by .** sqlite3Vd
34e0: 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f  beMakeReady() to
34f0: 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61   size the Vdbe.a
3500: 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  pArg[] array..**
3510: 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61  .** The Op.opfla
3520: 67 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  gs field is set 
3530: 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a  on all opcodes..
3540: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
3550: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56  esolveP2Values(V
3560: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61  dbe *p, int *pMa
3570: 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e  xFuncArgs){.  in
3580: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41  t i;.  int nMaxA
3590: 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41  rgs = *pMaxFuncA
35a0: 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  rgs;.  Op *pOp;.
35b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
35c0: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = p->pParse;.  i
35d0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61  nt *aLabel = pPa
35e0: 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  rse->aLabel;.  p
35f0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
3600: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
3610: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
3620: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
3630: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
3640: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
3650: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
3660: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20  ;..    /* NOTE: 
3670: 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74  Be sure to updat
3680: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
3690: 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72  when adding or r
36a0: 65 6d 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63  emoving.    ** c
36b0: 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73  ases from this s
36c0: 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77  witch! */.    sw
36d0: 69 74 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a  itch( opcode ){.
36e0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 46 75        case OP_Fu
36f0: 6e 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 63 61  nction:.      ca
3700: 73 65 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b  se OP_AggStep: {
3710: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
3720: 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p5>nMaxArgs ) 
3730: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
3740: 70 35 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p5;.        brea
3750: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3760: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
3770: 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  tion: {.        
3780: 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29  if( pOp->p2!=0 )
3790: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
37a0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c  ;.        /* fal
37b0: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20  l thru */.      
37c0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
37d0: 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20  AutoCommit:.    
37e0: 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f    case OP_Savepo
37f0: 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  int: {.        p
3800: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
3810: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3820: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
3830: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
3840: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68        case OP_Ch
3850: 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66  eckpoint:.#endif
3860: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56  .      case OP_V
3870: 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73  acuum:.      cas
3880: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
3890: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  : {.        p->r
38a0: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadOnly = 0;.   
38b0: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
38c0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  r = 1;.        b
38d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
38e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
38f0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
3900: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70       case OP_VUp
3910: 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  date: {.        
3920: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
3930: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
3940: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
3950: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3960: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
3970: 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20  VFilter: {.     
3980: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
3990: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
39a0: 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20   - i >= 3 );.   
39b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
39c0: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
39d0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
39e0: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
39f0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  1;.        if( n
3a00: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
3a10: 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Args = n;.      
3a20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3a30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61  .#endif.      ca
3a40: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
3a50: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66    case OP_NextIf
3a60: 4f 70 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65  Open:.      case
3a70: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20   OP_SorterNext: 
3a80: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  {.        pOp->p
3a90: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
3aa0: 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20  ite3BtreeNext;. 
3ab0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79         pOp->p4ty
3ac0: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
3ad0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3ae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
3af0: 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20  se OP_Prev:.    
3b00: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66    case OP_PrevIf
3b10: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  Open: {.        
3b20: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
3b30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
3b40: 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20  revious;.       
3b50: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3b60: 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20  4_ADVANCE;.     
3b70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3b80: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70  }.    }..    pOp
3b90: 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69  ->opflags = sqli
3ba0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
3bb0: 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69  y[opcode];.    i
3bc0: 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  f( (pOp->opflags
3bd0: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
3be0: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  0 && pOp->p2<0 )
3bf0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
3c00: 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73  -1-pOp->p2<pPars
3c10: 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20  e->nLabel );.   
3c20: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61     pOp->p2 = aLa
3c30: 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b  bel[-1-pOp->p2];
3c40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3c50: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
3c60: 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  , pParse->aLabel
3c70: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61  );.  pParse->aLa
3c80: 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  bel = 0;.  pPars
3c90: 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->nLabel = 0;. 
3ca0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
3cb0: 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73   nMaxArgs;.  ass
3cc0: 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
3cd0: 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c  r!=0 || DbMaskAl
3ce0: 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61  lZero(p->btreeMa
3cf0: 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sk) );.}../*.** 
3d00: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
3d10: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
3d20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
3d30: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e   inserted..*/.in
3d40: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
3d50: 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70  rentAddr(Vdbe *p
3d60: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
3d70: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3d80: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75  C_INIT );.  retu
3d90: 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a  rn p->nOp;.}../*
3da0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3db0: 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
3dc0: 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
3dd0: 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f   of opcodes asso
3de0: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
3df0: 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
3e00: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
3e10: 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20  ment. It is the 
3e20: 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
3e30: 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72  bility.** to arr
3e40: 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 74  ange for the ret
3e50: 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62  urned array to b
3e60: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
3e70: 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ed using the .**
3e80: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
3e90: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  () function..**.
3ea0: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
3eb0: 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65  ing, *pnOp is se
3ec0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
3ed0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
3ee0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72  e returned.** ar
3ef0: 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61  ray. Also, *pnMa
3f00: 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20 74  xArg is set to t
3f10: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73  he larger of its
3f20: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
3f30: 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  nd .** the numbe
3f40: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3f50: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
3f60: 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64 20   array required 
3f70: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 0a  to execute the .
3f80: 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67  ** returned prog
3f90: 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ram..*/.VdbeOp *
3fa0: 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f  sqlite3VdbeTakeO
3fb0: 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20  pArray(Vdbe *p, 
3fc0: 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a  int *pnOp, int *
3fd0: 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62  pnMaxArg){.  Vdb
3fe0: 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f  eOp *aOp = p->aO
3ff0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70  p;.  assert( aOp
4000: 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   && !p->db->mall
4010: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f  ocFailed );..  /
4020: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c  * Check that sql
4030: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
4040: 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  e() was not call
4050: 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f  ed on this VM */
4060: 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
4070: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
4080: 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73  eMask) );..  res
4090: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
40a0: 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e  pnMaxArg);.  *pn
40b0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70  Op = p->nOp;.  p
40c0: 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74  ->aOp = 0;.  ret
40d0: 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aOp;.}../*.*
40e0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
40f0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
4100: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
4110: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
4120: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
4130: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
4140: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
4150: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
4160: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
4170: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
4180: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
4190: 70 2c 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b  p, int iLineno){
41a0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
41b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
41c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
41d0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
41e0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72   + nOp > p->pPar
41f0: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20  se->nOpAlloc && 
4200: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e  growOpArray(p, n
4210: 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Op) ){.    retur
4220: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  n 0;.  }.  addr 
4230: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
4240: 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b  ALWAYS(nOp>0) ){
4250: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4260: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
4270: 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20   *pIn = aOp;.   
4280: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
4290: 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20   i++, pIn++){.  
42a0: 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e      int p2 = pIn
42b0: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65  ->p2;.      Vdbe
42c0: 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61  Op *pOut = &p->a
42d0: 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20  Op[i+addr];.    
42e0: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
42f0: 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pIn->opcode;.  
4300: 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70      pOut->p1 = p
4310: 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66  In->p1;.      if
4320: 28 20 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( p2<0 ){.      
4330: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4340: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
4350: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20  pOut->opcode] & 
4360: 4f 50 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20  OPFLG_JUMP );.  
4370: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
4380: 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29   addr + ADDR(p2)
4390: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
43a0: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
43b0: 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = p2;.      }.  
43c0: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70      pOut->p3 = p
43d0: 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f  In->p3;.      pO
43e0: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
43f0: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70  NOTUSED;.      p
4400: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
4410: 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20       pOut->p5 = 
4420: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
4430: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
4440: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70  COMMENTS.      p
4450: 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  Out->zComment = 
4460: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
4470: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
4480: 45 52 41 47 45 0a 20 20 20 20 20 20 70 4f 75 74  ERAGE.      pOut
4490: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
44a0: 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20  neno+i;.#else.  
44b0: 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e      (void)iLinen
44c0: 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  o;.#endif.#ifdef
44d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
44e0: 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66      if( p->db->f
44f0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
4500: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
4510: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4520: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
4530: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
4540: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
4550: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
4560: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
4570: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
4580: 72 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  r;.}..#if define
4590: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
45a0: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29  STMT_SCANSTATUS)
45b0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
45c0: 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 79  try to the array
45d0: 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e   of counters man
45e0: 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  aged by sqlite3_
45f0: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
4600: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
4610: 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73  e3VdbeScanStatus
4620: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4640: 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64      /* VM to add
4650: 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f   scanstatus() to
4660: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78   */.  int addrEx
4670: 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20  plain,          
4680: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
4690: 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28   of OP_Explain (
46a0: 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61  or 0) */.  int a
46b0: 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  ddrLoop,        
46c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
46d0: 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f  dress of loop co
46e0: 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  unter */ .  int 
46f0: 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 20  addrVisit,      
4700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4710: 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76  ddress of rows v
4720: 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a  isited counter *
4730: 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c  /.  LogEst nEst,
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4750: 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
4760: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
4770: 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73  t rows */.  cons
4780: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
4790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
47a0: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20  ame of table or 
47b0: 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e  index being scan
47c0: 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ned */.){.  int 
47d0: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61  nByte = (p->nSca
47e0: 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63  n+1) * sizeof(Sc
47f0: 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61  anStatus);.  Sca
4800: 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20  nStatus *aNew;. 
4810: 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61   aNew = (ScanSta
4820: 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65  tus*)sqlite3DbRe
4830: 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e  alloc(p->db, p->
4840: 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20  aScan, nByte);. 
4850: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
4860: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65   ScanStatus *pNe
4870: 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63  w = &aNew[p->nSc
4880: 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  an++];.    pNew-
4890: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61  >addrExplain = a
48a0: 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  ddrExplain;.    
48b0: 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d  pNew->addrLoop =
48c0: 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70   addrLoop;.    p
48d0: 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d  New->addrVisit =
48e0: 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20   addrVisit;.    
48f0: 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73  pNew->nEst = nEs
4900: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61  t;.    pNew->zNa
4910: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
4920: 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d  rDup(p->db, zNam
4930: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e  e);.    p->aScan
4940: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23   = aNew;.  }.}.#
4950: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
4960: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
4970: 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64  f the P1 operand
4980: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
4990: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
49a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
49b0: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
49c0: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
49d0: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
49e0: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
49f0: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
4a00: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
4a10: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
4a20: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
4a30: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
4a40: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
4a50: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56  e3VdbeChangeP1(V
4a60: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
4a70: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
4a80: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
4a90: 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70  if( ((u32)p->nOp
4aa0: 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  )>addr ){.    p-
4ab0: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20  >aOp[addr].p1 = 
4ac0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
4ad0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
4ae0: 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65  ue of the P2 ope
4af0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
4b00: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
4b10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4b20: 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73   is useful for s
4b30: 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65  etting a jump de
4b40: 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  stination..*/.vo
4b50: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4b60: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
4b70: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
4b80: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
4b90: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
4ba0: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
4bb0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
4bc0: 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p2 = val;.  }
4bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
4be0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4bf0: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P3 operand for
4c00: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
4c10: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
4c20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4c30: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33  geP3(Vdbe *p, u3
4c40: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
4c50: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4c60: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4c70: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4c80: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4c90: 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p3 = val;.  }.}
4ca0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4cb0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4cc0: 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74  P5 operand for t
4cd0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
4ce0: 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74  .** added operat
4cf0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4d00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
4d10: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c  (Vdbe *p, u8 val
4d20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
4d30: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  0 );.  if( p->aO
4d40: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
4d50: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
4d60: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
4d70: 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p5 = val;.  }.
4d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4d90: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
4da0: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  f instruction ad
4db0: 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  dr so that it po
4dc0: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61  ints to.** the a
4dd0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
4de0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
4df0: 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76  o be coded..*/.v
4e00: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a  oid sqlite3VdbeJ
4e10: 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c  umpHere(Vdbe *p,
4e20: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71   int addr){.  sq
4e30: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
4e40: 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f  2(p, addr, p->nO
4e50: 70 29 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d  p);.  p->pParse-
4e60: 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e  >iFixedOp = p->n
4e70: 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Op - 1;.}.../*.*
4e80: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
4e90: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
4ea0: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
4eb0: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
4ec0: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
4ed0: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
4ee0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
4ef0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4f00: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4f10: 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  nction(sqlite3 *
4f20: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65  db, FuncDef *pDe
4f30: 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  f){.  if( ALWAYS
4f40: 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66 2d  (pDef) && (pDef-
4f50: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
4f60: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
4f70: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4f80: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
4f90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
4fa0: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
4fb0: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
4fc0: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
4fd0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
4fe0: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
4ff0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
5000: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
5010: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
5020: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
5030: 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73  if( p4 ){.    as
5040: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20  sert( db );.    
5050: 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29  switch( p4type )
5060: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  {.      case P4_
5070: 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  REAL:.      case
5080: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20   P4_INT64:.     
5090: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
50a0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
50b0: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
50c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
50d0: 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20  e(db, p4);.     
50e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
50f0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
5100: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
5110: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
5120: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
5130: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
5140: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
5150: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
5170: 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a  e P4_MPRINTF: {.
5180: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
5190: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
51a0: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
51b0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
51c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
51d0: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
51e0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  : {.        free
51f0: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
5200: 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29  n(db, (FuncDef*)
5210: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
5220: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5230: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
5240: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
5250: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
5260: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
5270: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28  lite3ValueFree((
5280: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
5290: 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
52a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  e{.          Mem
52b0: 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a   *p = (Mem*)p4;.
52c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
52d0: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
52e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
52f0: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
5300: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5310: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  ee(db, p);.     
5320: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
5330: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5340: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a    case P4_VTAB :
5350: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
5360: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
5370: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  =0 ) sqlite3Vtab
5380: 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  Unlock((VTable *
5390: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
53a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
53b0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
53c0: 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61  Free the space a
53d0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70  llocated for aOp
53e0: 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75   and any p4 valu
53f0: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
5400: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20   the.** opcodes 
5410: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
5420: 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20  . If aOp is not 
5430: 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d  NULL it is assum
5440: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a  ed to contain .*
5450: 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a  * nOp entries. .
5460: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
5470: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
5480: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a  qlite3 *db, Op *
5490: 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20  aOp, int nOp){. 
54a0: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
54b0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72  Op *pOp;.    for
54c0: 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61  (pOp=aOp; pOp<&a
54d0: 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b  Op[nOp]; pOp++){
54e0: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
54f0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
5500: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65  Op->p4.p);.#ifde
5510: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5520: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
5530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
5540: 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43  Free(db, pOp->zC
5550: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20  omment);.#endif 
5560: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20      .    }.  }. 
5570: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5580: 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, aOp);.}../*.*
5590: 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72  * Link the SubPr
55a0: 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73  ogram object pas
55b0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
55c0: 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20  d argument into 
55d0: 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69  the linked.** li
55e0: 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50  st at Vdbe.pSubP
55f0: 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73  rogram. This lis
5600: 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c  t is used to del
5610: 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67  ete all sub-prog
5620: 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77  ram.** objects w
5630: 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f  hen the VM is no
5640: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
5650: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5660: 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67  3VdbeLinkSubProg
5670: 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ram(Vdbe *pVdbe,
5680: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b   SubProgram *p){
5690: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56  .  p->pNext = pV
56a0: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20  dbe->pProgram;. 
56b0: 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d   pVdbe->pProgram
56c0: 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = p;.}../*.** C
56d0: 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65  hange the opcode
56e0: 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50   at addr into OP
56f0: 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71  _Noop.*/.void sq
5700: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
5710: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
5720: 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20  nt addr){.  if( 
5730: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  addr<p->nOp ){. 
5740: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
5750: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
5760: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
5770: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65  = p->db;.    fre
5780: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
5790: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
57a0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c  .    memset(pOp,
57b0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
57c0: 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70  ]));.    pOp->op
57d0: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
57e0: 20 20 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d      if( addr==p-
57f0: 3e 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d  >nOp-1 ) p->nOp-
5800: 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  -;.  }.}../*.** 
5810: 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f  If the last opco
5820: 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69  de is "op" and i
5830: 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20  t is not a jump 
5840: 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20  destination,.** 
5850: 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20  then remove it. 
5860: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
5870: 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f  and only if an o
5880: 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65  pcode was remove
5890: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
58a0: 33 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72  3VdbeDeletePrior
58b0: 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20  Opcode(Vdbe *p, 
58c0: 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70  u8 op){.  if( (p
58d0: 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61  ->nOp-1)>(p->pPa
58e0: 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26  rse->iFixedOp) &
58f0: 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  & p->aOp[p->nOp-
5900: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b  1].opcode==op ){
5910: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5920: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20  ChangeToNoop(p, 
5930: 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72  p->nOp-1);.    r
5940: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65  eturn 1;.  }else
5950: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5960: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
5970: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
5980: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
5990: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
59a0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
59b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
59c0: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
59d0: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
59e0: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
59f0: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
5a00: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
5a10: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
5a20: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
5a30: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
5a40: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
5a50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
5a60: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
5a70: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
5a80: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
5a90: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
5aa0: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
5ab0: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
5ac0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
5ad0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
5ae0: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
5af0: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
5b00: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
5b10: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
5b20: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
5b30: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
5b40: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
5b50: 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72  P4..** .** Other
5b60: 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34   values of n (P4
5b70: 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c  _STATIC, P4_COLL
5b80: 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61  SEQ etc.) indica
5b90: 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  te that zP4 poin
5ba0: 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e  ts.** to a strin
5bb0: 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74  g or structure t
5bc0: 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65  hat is guarantee
5bd0: 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74  d to exist for t
5be0: 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a  he lifetime of.*
5bf0: 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74  * the Vdbe. In t
5c00: 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61  hese cases we ca
5c10: 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20  n just copy the 
5c20: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  pointer..**.** I
5c30: 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68  f addr<0 then ch
5c40: 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d  ange P4 on the m
5c50: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73  ost recently ins
5c60: 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f  erted instructio
5c70: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5c80: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56  e3VdbeChangeP4(V
5c90: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5ca0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
5cb0: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  4, int n){.  Op 
5cc0: 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  *pOp;.  sqlite3 
5cd0: 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *db;.  assert( p
5ce0: 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  !=0 );.  db = p-
5cf0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
5d00: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
5d10: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
5d20: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64  ( p->aOp==0 || d
5d30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5d40: 29 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34  ){.    if( n!=P4
5d50: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66  _VTAB ){.      f
5d60: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
5d70: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
5d80: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
5d90: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
5da0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
5db0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70    assert( addr<p
5dc0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61  ->nOp );.  if( a
5dd0: 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64  ddr<0 ){.    add
5de0: 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  r = p->nOp - 1;.
5df0: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
5e00: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73  aOp[addr];.  ass
5e10: 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
5e20: 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20  ==P4_NOTUSED.   
5e30: 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79      || pOp->p4ty
5e40: 70 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20  pe==P4_INT32.   
5e50: 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79      || pOp->p4ty
5e60: 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29  pe==P4_KEYINFO )
5e70: 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70  ;.  freeP4(db, p
5e80: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
5e90: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
5ea0: 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e  4.p = 0;.  if( n
5eb0: 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
5ec0: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
5ed0: 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65  cast is safe, be
5ee0: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
5ef0: 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20   data point was 
5f00: 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68  an int.    ** th
5f10: 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61  at was cast to a
5f20: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e   (const char *).
5f30: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   */.    pOp->p4.
5f40: 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  i = SQLITE_PTR_T
5f50: 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20  O_INT(zP4);.    
5f60: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5f70: 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20  _INT32;.  }else 
5f80: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
5f90: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
5fa0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
5fb0: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
5fc0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
5fd0: 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _KEYINFO ){.    
5fe0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
5ff0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
6000: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
6010: 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66  INFO;.  }else if
6020: 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a  ( n==P4_VTAB ){.
6030: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
6040: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
6050: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
6060: 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74  _VTAB;.    sqlit
6070: 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62  e3VtabLock((VTab
6080: 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61  le *)zP4);.    a
6090: 73 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20  ssert( ((VTable 
60a0: 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64  *)zP4)->db==p->d
60b0: 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  b );.  }else if(
60c0: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d   n<0 ){.    pOp-
60d0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
60e0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
60f0: 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68  ype = (signed ch
6100: 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ar)n;.  }else{. 
6110: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
6120: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6130: 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  0(zP4);.    pOp-
6140: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44  >p4.z = sqlite3D
6150: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
6160: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP4, n);.    pOp
6170: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59  ->p4type = P4_DY
6180: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NAMIC;.  }.}../*
6190: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f  .** Set the P4 o
61a0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
61b0: 74 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65  tly added opcode
61c0: 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   to the KeyInfo 
61d0: 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  for the.** index
61e0: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
61f0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
6200: 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  KeyInfo(Parse *p
6210: 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
6220: 64 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  dx){.  Vdbe *v =
6230: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
6240: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
6250: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78  ;.  assert( pIdx
6260: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
6270: 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
6280: 2d 31 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  -1, (char*)sqlit
6290: 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
62a0: 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a  (pParse, pIdx),.
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62c0: 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
62d0: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
62e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
62f0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a  IN_COMMENTS./*.*
6300: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d  * Change the com
6310: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  ment on the most
6320: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
6330: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
6340: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
6350: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
6360: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
6370: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
6380: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
6390: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
63a0: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
63b0: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
63c0: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
63d0: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
63e0: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74  n build..*/.stat
63f0: 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d  ic void vdbeVCom
6400: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
6410: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
6420: 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a  t, va_list ap){.
6430: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
6440: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
6450: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
6460: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
6470: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
6480: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
6490: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
64a0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
64b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
64c0: 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  aOp );.    sqlit
64d0: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
64e0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
64f0: 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  .zComment);.    
6500: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
6510: 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69  .zComment = sqli
6520: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
6530: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
6540: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
6550: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
6560: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
6570: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
6580: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6590: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
65a0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
65b0: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
65c0: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
65d0: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
65e0: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  end(ap);.  }.}.v
65f0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e  oid sqlite3VdbeN
6600: 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  oopComment(Vdbe 
6610: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
6620: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
6630: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
6640: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
6650: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
6660: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76   OP_Noop);.    v
6670: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
6680: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
6690: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
66a0: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
66b0: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  nd(ap);.  }.}.#e
66c0: 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20  ndif  /* NDEBUG 
66d0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
66e0: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
66f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
6700: 6c 75 65 20 69 66 20 74 68 65 20 69 53 72 63 4c  lue if the iSrcL
6710: 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68  ine field for th
6720: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64  e previously cod
6730: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
6740: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6750: 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72  dbeSetLineNumber
6760: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c  (Vdbe *v, int iL
6770: 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ine){.  sqlite3V
6780: 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e  dbeGetOp(v,-1)->
6790: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
67a0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
67b0: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
67c0: 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  GE */../*.** Ret
67d0: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
67e0: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
67f0: 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72  ss.  If the addr
6800: 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a  ess is -1, then.
6810: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** return the mo
6820: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
6830: 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  rted opcode..**.
6840: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
6850: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
6860: 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69  has occurred pri
6870: 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e  or to the callin
6880: 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  g of this.** rou
6890: 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69  tine, then a poi
68a0: 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20  nter to a dummy 
68b0: 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72  VdbeOp will be r
68c0: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f  eturned.  That o
68d0: 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64  pcode.** is read
68e0: 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69  able but not wri
68f0: 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74  table, though it
6900: 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72   is cast to a wr
6910: 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a  itable value..**
6920: 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61   The return of a
6930: 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c   dummy opcode al
6940: 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  lows the call to
6950: 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69   continue functi
6960: 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61  oning.** after a
6970: 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68  n OOM fault with
6980: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68  out having to ch
6990: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
69a0: 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a  e return from .*
69b0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
69c0: 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  s a valid pointe
69d0: 72 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  r.  But because 
69e0: 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65  the dummy.opcode
69f0: 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20   is 0,.** dummy 
6a00: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72  will never be wr
6a10: 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20  itten to.  This 
6a20: 69 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63  is verified by c
6a30: 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61  ode inspection a
6a40: 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67  nd.** by running
6a50: 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a   with Valgrind..
6a60: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
6a70: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
6a80: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
6a90: 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69    /* C89 specifi
6aa0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73  es that the cons
6ab0: 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c  tant "dummy" wil
6ac0: 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
6ad0: 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72   to all.  ** zer
6ae0: 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72  os, which is cor
6af0: 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65  rect.  MSVC gene
6b00: 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c  rates a warning,
6b10: 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a   nevertheless. *
6b20: 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f  /.  static VdbeO
6b30: 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e  p dummy;  /* Ign
6b40: 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72  ore the MSVC war
6b50: 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e  ning about no in
6b60: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61  itializer */.  a
6b70: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
6b80: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
6b90: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
6ba0: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
6bb0: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20  ->nOp - 1;.  }. 
6bc0: 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d   assert( (addr>=
6bd0: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
6be0: 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ) || p->db->mall
6bf0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
6c00: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
6c10: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
6c20: 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75  urn (VdbeOp*)&du
6c30: 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mmy;.  }else{.  
6c40: 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70    return &p->aOp
6c50: 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23  [addr];.  }.}..#
6c60: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6c70: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
6c80: 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a  _COMMENTS)./*.**
6c90: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
6ca0: 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65  er value for one
6cb0: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
6cc0: 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65  rs to the opcode
6cd0: 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   pOp.** determin
6ce0: 65 64 20 62 79 20 63 68 61 72 61 63 74 65 72 20  ed by character 
6cf0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
6d00: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72   translateP(char
6d10: 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f   c, const Op *pO
6d20: 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27  p){.  if( c=='1'
6d30: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
6d40: 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20  1;.  if( c=='2' 
6d50: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32  ) return pOp->p2
6d60: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29  ;.  if( c=='3' )
6d70: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b   return pOp->p3;
6d80: 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20  .  if( c=='4' ) 
6d90: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69  return pOp->p4.i
6da0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ;.  return pOp->
6db0: 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p5;.}../*.** Com
6dc0: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f  pute a string fo
6dd0: 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20  r the "comment" 
6de0: 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20  field of a VDBE 
6df0: 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a  opcode listing..
6e00: 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73  **.** The Synops
6e10: 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d  is: field in com
6e20: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62  ments in the vdb
6e30: 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20  e.c source file 
6e40: 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a  gets converted.*
6e50: 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74  * to an extra st
6e60: 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 70 70  ring that is app
6e70: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c  ended to the sql
6e80: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29  ite3OpcodeName()
6e90: 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73  .  In the.** abs
6ea0: 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f  ence of other co
6eb0: 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e  mments, this syn
6ec0: 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68  opsis becomes th
6ed0: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
6ee0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65   opcode..** Some
6ef0: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63   translation occ
6f00: 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  urs:.**.**      
6f10: 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22   "PX"      ->  "
6f20: 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22  r[X]".**       "
6f30: 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b  PX@PY"   ->  "r[
6f40: 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22  X..X+Y-1]"  or "
6f50: 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 20  r[x]" if y is 0 
6f60: 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50  or 1.**       "P
6f70: 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58  X@PY+1" ->  "r[X
6f80: 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72  ..X+Y]"    or "r
6f90: 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a  [x]" if y is 0.*
6fa0: 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22  *       "PY..PY"
6fb0: 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20    ->  "r[X..Y]" 
6fc0: 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69       or "r[x]" i
6fd0: 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63  f y<=x.*/.static
6fe0: 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d   int displayComm
6ff0: 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20  ent(.  const Op 
7000: 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pOp,     /* The
7010: 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f   opcode to be co
7020: 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e  mmented */.  con
7030: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20  st char *zP4,   
7040: 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62  /* Previously ob
7050: 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72  tained value for
7060: 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   P4 */.  char *z
7070: 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57  Temp,       /* W
7080: 72 69 74 65 20 72 65 73 75 6c 74 20 68 65 72 65  rite result here
7090: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20   */.  int nTemp 
70a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
70b0: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a  e available in z
70c0: 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63  Temp[] */.){.  c
70d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61  onst char *zOpNa
70e0: 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
70f0: 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69   *zSynopsis;.  i
7100: 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e  nt nOpName;.  in
7110: 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e  t ii, jj;.  zOpN
7120: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63  ame = sqlite3Opc
7130: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
7140: 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20  ode);.  nOpName 
7150: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7160: 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66  0(zOpName);.  if
7170: 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d  ( zOpName[nOpNam
7180: 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e+1] ){.    int 
7190: 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20  seenCom = 0;.   
71a0: 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79   char c;.    zSy
71b0: 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65  nopsis = zOpName
71c0: 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b   += nOpName + 1;
71d0: 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30  .    for(ii=jj=0
71e0: 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20  ; jj<nTemp-1 && 
71f0: 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69  (c = zSynopsis[i
7200: 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20  i])!=0; ii++){. 
7210: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20       if( c=='P' 
7220: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  ){.        c = z
7230: 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a  Synopsis[++ii];.
7240: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
7250: 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4' ){.          
7260: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7270: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7280: 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b  +jj, "%s", zP4);
7290: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
72a0: 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20  f( c=='X' ){.   
72b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
72c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
72d0: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22  , zTemp+jj, "%s"
72e0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
72f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e  ;.          seen
7300: 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Com = 1;.       
7310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7320: 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73    int v1 = trans
7330: 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20  lateP(c, pOp);. 
7340: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b           int v2;
7350: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7360: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7370: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
7380: 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20  "%d", v1);.     
7390: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
73a0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
73b0: 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a   "@P", 2)==0 ){.
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
73d0: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 3;.           
73e0: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
73f0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
7400: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32  ;.            v2
7410: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53   = translateP(zS
7420: 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70  ynopsis[ii], pOp
7430: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
7440: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
7450: 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32  psis+ii+1,"+1",2
7460: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7470: 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20        ii += 2;. 
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b               v2+
7490: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
74a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
74b0: 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20   v2>1 ){.       
74c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
74d0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
74e0: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25  , zTemp+jj, "..%
74f0: 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20  d", v1+v2-1);.  
7500: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7510: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7520: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
7530: 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20  s+ii+1, "..P3", 
7540: 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33  4)==0 && pOp->p3
7550: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7560: 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20     ii += 4;.    
7570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7580: 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20  }.        jj += 
7590: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
75a0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
75b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
75c0: 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b  zTemp[jj++] = c;
75d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
75e0: 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20     if( !seenCom 
75f0: 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26  && jj<nTemp-5 &&
7600: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29   pOp->zComment )
7610: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7620: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
7630: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20  j, zTemp+jj, "; 
7640: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
7650: 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d  nt);.      jj +=
7660: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7670: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
7680: 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65  }.    if( jj<nTe
7690: 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d  mp ) zTemp[jj] =
76a0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
76b0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
76c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
76d0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
76e0: 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  mp, "%s", pOp->z
76f0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a  Comment);.    jj
7700: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
7710: 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c  30(zTemp);.  }el
7720: 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d  se{.    zTemp[0]
7730: 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30   = 0;.    jj = 0
7740: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
7750: 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  j;.}.#endif /* S
7760: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
7770: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
7780: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
7790: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
77a0: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
77b0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
77c0: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
77d0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
77e0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
77f0: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
7800: 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72  ribes the P4 par
7810: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
7820: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
7830: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
7840: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
7850: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
7860: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
7870: 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63  layP4(Op *pOp, c
7880: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
7890: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
78a0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61  zP4 = zTemp;.  a
78b0: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
78c0: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f   );.  switch( pO
78d0: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
78e0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
78f0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c  : {.      int i,
7900: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
7910: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  o *pKeyInfo = pO
7920: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
7930: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
7940: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
7950: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  er!=0 );.      s
7960: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7970: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
7980: 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  (%d", pKeyInfo->
7990: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69  nField);.      i
79a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
79b0: 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  30(zTemp);.     
79c0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
79d0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
79e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
79f0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
7a00: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
7a10: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
7a20: 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f  har *zColl = pCo
7a30: 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ll ? pColl->zNam
7a40: 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20  e : "nil";.     
7a50: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
7a60: 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c  e3Strlen30(zColl
7a70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
7a80: 3d 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43  ==6 && memcmp(zC
7a90: 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d  oll,"BINARY",6)=
7aa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7ab0: 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20  zColl = "B";.   
7ac0: 20 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20         n = 1;.  
7ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7ae0: 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20  if( i+n>nTemp-6 
7af0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
7b00: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c  cpy(&zTemp[i],",
7b10: 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20  ...",4);.       
7b20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7b30: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d    }.        zTem
7b40: 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  p[i++] = ',';.  
7b50: 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
7b60: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  fo->aSortOrder[j
7b70: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ] ){.          z
7b80: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b  Temp[i++] = '-';
7b90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7ba0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
7bb0: 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29  [i], zColl, n+1)
7bc0: 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e  ;.        i += n
7bd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7be0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27  zTemp[i++] = ')'
7bf0: 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d  ;.      zTemp[i]
7c00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
7c10: 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20  rt( i<nTemp );. 
7c20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7c30: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f  }.    case P4_CO
7c40: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43  LLSEQ: {.      C
7c50: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
7c60: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20  pOp->p4.pColl;. 
7c70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7c80: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7c90: 6d 70 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70  mp, "(%.20s)", p
7ca0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
7cb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7cc0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e  .    case P4_FUN
7cd0: 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75  CDEF: {.      Fu
7ce0: 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f  ncDef *pDef = pO
7cf0: 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20  p->p4.pFunc;.   
7d00: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7d10: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7d20: 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66  , "%s(%d)", pDef
7d30: 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e  ->zName, pDef->n
7d40: 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Arg);.      brea
7d50: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7d60: 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20  e P4_INT64: {.  
7d70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d80: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7d90: 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d  p, "%lld", *pOp-
7da0: 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20  >p4.pI64);.     
7db0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7dc0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a    case P4_INT32:
7dd0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
7de0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7df0: 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f   zTemp, "%d", pO
7e00: 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20  p->p4.i);.      
7e10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7e20: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b   case P4_REAL: {
7e30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7e40: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7e50: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a  Temp, "%.16g", *
7e60: 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a  pOp->p4.pReal);.
7e70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7e80: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
7e90: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20  EM: {.      Mem 
7ea0: 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pMem = pOp->p4.
7eb0: 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  pMem;.      if( 
7ec0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
7ed0: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
7ee0: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zP4 = pMem->z;.
7ef0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7f00: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
7f10: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  M_Int ){.       
7f20: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7f30: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7f40: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
7f50: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
7f60: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
7f70: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
7f80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7f90: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7fa0: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  emp, "%.16g", pM
7fb0: 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em->u.r);.      
7fc0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
7fd0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
7fe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7ff0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8000: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c  mp, zTemp, "NULL
8010: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
8020: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8030: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
8040: 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  EM_Blob );.     
8050: 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29     zP4 = "(blob)
8060: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
8070: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
8080: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8090: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
80a0: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a     case P4_VTAB:
80b0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
80c0: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
80d0: 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
80e0: 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tab;.      sqlit
80f0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8100: 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a  p, zTemp, "vtab:
8110: 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20  %p", pVtab);.   
8120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8130: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
8140: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
8150: 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
8160: 20 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 70       int *ai = p
8170: 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20  Op->p4.ai;.     
8180: 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20   int n = ai[0]; 
8190: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65    /* The first e
81a0: 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54  lement of an INT
81b0: 41 52 52 41 59 20 69 73 20 61 6c 77 61 79 73 20  ARRAY is always 
81c0: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
81d0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f             ** co
81e0: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
81f0: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f  r of elements to
8200: 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20   follow */.     
8210: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b   zTemp[0] = '[';
8220: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 6a 3d 31  .      for(i=j=1
8230: 3b 20 69 3c 6e 20 26 26 20 6a 3c 6e 54 65 6d 70  ; i<n && j<nTemp
8240: 2d 37 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -7; i++){.      
8250: 20 20 69 66 28 20 6a 3e 31 20 29 20 7a 54 65 6d    if( j>1 ) zTem
8260: 70 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  p[j++] = ',';.  
8270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
8280: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 2c 20  printf(nTemp-j, 
8290: 7a 54 65 6d 70 2b 6a 2c 20 22 25 64 22 2c 20 61  zTemp+j, "%d", a
82a0: 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6a  i[i]);.        j
82b0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
82c0: 6e 33 30 28 7a 54 65 6d 70 2b 6a 29 3b 0a 20 20  n30(zTemp+j);.  
82d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
82e0: 69 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  i<n ){.        m
82f0: 65 6d 63 70 79 28 7a 54 65 6d 70 2b 6a 2c 20 22  emcpy(zTemp+j, "
8300: 2c 2e 2e 2e 5d 22 2c 20 36 29 3b 0a 20 20 20 20  ,...]", 6);.    
8310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8320: 20 6d 65 6d 63 70 79 28 7a 54 65 6d 70 2b 6a 2c   memcpy(zTemp+j,
8330: 20 22 5d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20   "]", 2);.      
8340: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8350: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
8360: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
8370: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8380: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
8390: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  mp, "program");.
83a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
83b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41   }.    case P4_A
83c0: 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20  DVANCE: {.      
83d0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
83e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
83f0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
8400: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
8410: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
8420: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
8430: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
8440: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
8450: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
8460: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
8470: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
8480: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
8490: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  if../*.** Declar
84a0: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
84b0: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
84c0: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
84d0: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  ] is used..**.**
84e0: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
84f0: 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f  atements need to
8500: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65   know in advance
8510: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   the complete se
8520: 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  t of.** attached
8530: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
8540: 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20  will be use.  A 
8550: 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61  mask of these da
8560: 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61  tabases.** is ma
8570: 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62  intained in p->b
8580: 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70  treeMask.  The p
8590: 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65  ->lockMask value
85a0: 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f   is the subset o
85b0: 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73  f.** p->btreeMas
85c0: 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74  k of databases t
85d0: 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65  hat will require
85e0: 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64   a lock..*/.void
85f0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
8600: 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69  Btree(Vdbe *p, i
8610: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
8620: 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62   i>=0 && i<p->db
8630: 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29  ->nDb && i<(int)
8640: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a  sizeof(yDbMask)*
8650: 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  8 );.  assert( i
8660: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e  <(int)sizeof(p->
8670: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a  btreeMask)*8 );.
8680: 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62    DbMaskSet(p->b
8690: 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  treeMask, i);.  
86a0: 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69  if( i!=1 && sqli
86b0: 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65  te3BtreeSharable
86c0: 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  (p->db->aDb[i].p
86d0: 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73  Bt) ){.    DbMas
86e0: 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  kSet(p->lockMask
86f0: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
8700: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8710: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
8720: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
8730: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
8740: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f   If SQLite is co
8750: 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72  mpiled to suppor
8760: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
8770: 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68  ode and to be th
8780: 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69  readsafe,.** thi
8790: 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e  s routine obtain
87a0: 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  s the mutex asso
87b0: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
87c0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
87d0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20  ure.** that may 
87e0: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
87f0: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
8800: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20  an argument. In 
8810: 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f  doing so it also
8820: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53  .** sets the BtS
8830: 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20  hared.db member 
8840: 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42  of each of the B
8850: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
8860: 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20  es, ensuring.** 
8870: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
8880: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
8890: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
88a0: 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  d if required..*
88b0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
88c0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
88d0: 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72   but does suppor
88e0: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
88f0: 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c  ode, then.** sql
8900: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
8910: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73   is invoked to s
8920: 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  et the BtShared.
8930: 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  db variables.** 
8940: 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72  of all of BtShar
8950: 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63  ed structures ac
8960: 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65  cessible via the
8970: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
8980: 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20   .** associated 
8990: 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a  with the VM..**.
89a0: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
89b0: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61  not threadsafe a
89c0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  nd does not supp
89d0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
89e0: 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66   mode, this.** f
89f0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
8a00: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d  op..**.** The p-
8a10: 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64  >btreeMask field
8a20: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
8a30: 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74   all btrees that
8a40: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a   the prepared .*
8a50: 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69  * statement p wi
8a60: 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65  ll ever use.  Le
8a70: 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65  t N be the numbe
8a80: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e  r of bits in p->
8a90: 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72  btreeMask.** cor
8aa0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74  responding to bt
8ab0: 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68  rees that use sh
8ac0: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
8ad0: 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66  n the runtime of
8ae0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
8af0: 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73   is N*N.  But as
8b00: 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72   N is rarely mor
8b10: 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73  e than 1, this s
8b20: 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20  hould not.** be 
8b30: 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
8b40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  id sqlite3VdbeEn
8b50: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ter(Vdbe *p){.  
8b60: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
8b70: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
8b80: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66  .  int nDb;.  if
8b90: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
8ba0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
8bb0: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
8bc0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
8bd0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
8be0: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
8bf0: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
8c00: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
8c10: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
8c20: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
8c30: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
8c40: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
8c50: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
8c60: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
8c70: 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ter(aDb[i].pBt);
8c80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
8c90: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
8ca0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
8cb0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
8cc0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
8cd0: 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  >0./*.** Unlock 
8ce0: 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65  all of the btree
8cf0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  s previously loc
8d00: 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  ked by a call to
8d10: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
8d20: 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r()..*/.void sql
8d30: 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64  ite3VdbeLeave(Vd
8d40: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
8d50: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8d60: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
8d70: 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61   nDb;.  if( DbMa
8d80: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63  skAllZero(p->loc
8d90: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b  kMask) ) return;
8da0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
8db0: 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70  case */.  db = p
8dc0: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
8dd0: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
8de0: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
8df0: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
8e00: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
8e10: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
8e20: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
8e30: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
8e40: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
8e50: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44  te3BtreeLeave(aD
8e60: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
8e70: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
8e80: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
8e90: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
8ea0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
8eb0: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
8ec0: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
8ed0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8ee0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
8ef0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
8f00: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
8f10: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
8f20: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
8f30: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
8f40: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
8f50: 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d    char zCom[100]
8f60: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
8f70: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
8f80: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
8f90: 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25   %4d %4d %-13s %
8fa0: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
8fb0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
8fc0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
8fd0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
8fe0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
8ff0: 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tr));.#ifdef SQL
9000: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
9010: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69  IN_COMMENTS.  di
9020: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
9030: 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a  , zP4, zCom, siz
9040: 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73  eof(zCom));.#els
9050: 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b  e.  zCom[0] = 0;
9060: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a  .#endif.  /* NB:
9070: 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63    The sqlite3Opc
9080: 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69  odeName() functi
9090: 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
90a0: 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65  d by code create
90b0: 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b  d.  ** by the mk
90c0: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20  opcodeh.awk and 
90d0: 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63  mkopcodec.awk sc
90e0: 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72  ripts which extr
90f0: 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66  act the.  ** inf
9100: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
9110: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
9120: 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74  text */.  fprint
9130: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
9140: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
9150: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
9160: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
9170: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
9180: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
9190: 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d  ->p5,.      zCom
91a0: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
91b0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
91c0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
91d0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
91e0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
91f0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
9200: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
9210: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
9220: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
9230: 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20  *pEnd = &p[N];. 
9240: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
9250: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d   p->db;.    u8 m
9260: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64  alloc_failed = d
9270: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
9280: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
9290: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
92a0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
92b0: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
92c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
92d0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
92e0: 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b        }while( (+
92f0: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
9300: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
9310: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73      do{.      as
9320: 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70  sert( (&p[1])==p
9330: 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  End || p[0].db==
9340: 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20  p[1].db );.     
9350: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9360: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
9370: 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20  riants(p) );..  
9380: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
9390: 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69  k is really an i
93a0: 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f  nlined version o
93b0: 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  f sqlite3VdbeMem
93c0: 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20  Release().      
93d0: 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64  ** that takes ad
93e0: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66  vantage of the f
93f0: 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d  act that the mem
9400: 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69  ory cell value i
9410: 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  s .      ** bein
9420: 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66  g set to NULL af
9430: 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e  ter releasing an
9440: 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72  y dynamic resour
9450: 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ces..      **.  
9460: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69      ** The justi
9470: 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  fication for dup
9480: 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73  licating code is
9490: 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20   that according 
94a0: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  to .      ** cal
94b0: 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75  lgrind, this cau
94c0: 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65  ses a certain te
94d0: 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74  st case to hit t
94e0: 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20  he CPU 4.7 .    
94f0: 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73    ** percent les
9500: 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63  s (x86 linux, gc
9510: 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c  c version 4.1.2,
9520: 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20   -O6) than if . 
9530: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d       ** sqlite3M
9540: 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65  emRelease() were
9550: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72   called from her
9560: 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69  e. With -O2, thi
9570: 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a  s jumps.      **
9580: 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e   to 6.6 percent.
9590: 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69   The test case i
95a0: 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30  s inserting 1000
95b0: 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62   rows into a tab
95c0: 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  le .      ** wit
95d0: 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69  h no indexes usi
95e0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70  ng a single prep
95f0: 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74  ared INSERT stat
9600: 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20  ement, bind() . 
9610: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
9620: 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65  t(). Inserts are
9630: 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20   grouped into a 
9640: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
9650: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74     */.      test
9660: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
9670: 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20   MEM_Agg );.    
9680: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
9690: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
96a0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
96b0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
96c0: 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  _Frame );.      
96d0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
96e0: 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20  gs & MEM_RowSet 
96f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
9700: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
9710: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65  EM_Dyn|MEM_Frame
9720: 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a  |MEM_RowSet) ){.
9730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9740: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
9750: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9760: 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b  ( p->szMalloc ){
9770: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9780: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
9790: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
97a0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  p->szMalloc = 0;
97b0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
97c0: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  p->flags = MEM_U
97d0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77  ndefined;.    }w
97e0: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
97f0: 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   );.    db->mall
9800: 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
9810: 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a  c_failed;.  }.}.
9820: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
9830: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
9840: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
9850: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
9860: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
9870: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
9880: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
9890: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
98a0: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
98b0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
98c0: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
98d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
98e0: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
98f0: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
9900: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
9910: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
9920: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
9930: 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Mem];.  for(i=0;
9940: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
9950: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
9960: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
9970: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
9980: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
9990: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
99a0: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
99b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
99c0: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
99d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
99e0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
99f0: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
9a00: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
9a10: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
9a20: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
9a30: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
9a40: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
9a50: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
9a60: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
9a70: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
9a80: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
9a90: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
9aa0: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
9ab0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
9ac0: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
9ad0: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
9ae0: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
9af0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
9b00: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
9b10: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
9b20: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
9b30: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
9b40: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
9b50: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
9b60: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
9b70: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
9b80: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
9b90: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
9ba0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
9bb0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
9bc0: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
9bd0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
9be0: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
9bf0: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
9c00: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
9c10: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
9c20: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
9c30: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
9c40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
9c50: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c70: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
9c80: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
9cb0: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
9cc0: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
9cd0: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
9ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9d00: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
9d10: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
9d20: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
9d30: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
9d40: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
9d50: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
9d60: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
9d90: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
9da0: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
9db0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9dc0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
9dd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
9de0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9df0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9e20: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
9e30: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9e40: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
9e50: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
9e60: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
9e70: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  em = &p->aMem[1]
9e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9e90: 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65   First Mem of re
9ea0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61  sult set */..  a
9eb0: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
9ec0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
9ed0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
9ee0: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
9ef0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
9f00: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
9f10: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
9f20: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
9f30: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
9f40: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
9f50: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
9f60: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
9f70: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
9f80: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
9f90: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
9fa0: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
9fb0: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
9fc0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9fd0: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
9fe0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
9ff0: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
a000: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
a010: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
a020: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
a030: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
a040: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
a050: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
a060: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
a070: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
a080: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
a090: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
a0a0: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
a0b0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
a0c0: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
a0d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a0e0: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
a0f0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
a100: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
a110: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
a120: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
a130: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
a140: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
a150: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
a160: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
a170: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
a180: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
a190: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
a1a0: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
a1b0: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
a1c0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
a1d0: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
a1e0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
a1f0: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
a200: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
a210: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
a220: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
a230: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
a240: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
a250: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
a260: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
a270: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
a280: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
a290: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
a2a0: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
a2b0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
a2c0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
a2d0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
a2e0: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
a2f0: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
a300: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
a310: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
a320: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
a330: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
a340: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
a350: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
a360: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
a370: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
a380: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
a390: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
a3a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
a3b0: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
a3c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a3d0: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
a3e0: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
a3f0: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
a400: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
a410: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
a420: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
a430: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
a440: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
a450: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
a460: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
a470: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
a480: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
a490: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
a4a0: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
a4b0: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
a4c0: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
a4d0: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
a4e0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
a4f0: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
a500: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
a510: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
a520: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
a530: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
a540: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
a550: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
a560: 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70  i<nRow && p->exp
a570: 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f  lain==2 && p->aO
a580: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
a590: 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  Explain );.  if(
a5a0: 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20   i>=nRow ){.    
a5b0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
a5c0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
a5d0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
a5e0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
a5f0: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
a600: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
a610: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
a620: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
a630: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
a640: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
a650: 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71  sg, db, "%s", sq
a660: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
a670: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
a680: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20    char *zP4;.   
a690: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66   Op *pOp;.    if
a6a0: 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ( i<p->nOp ){.  
a6b0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
a6c0: 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  t line number is
a6d0: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68   small enough th
a6e0: 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  at we are still 
a6f0: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
a700: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f  main program. */
a710: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d  .      pOp = &p-
a720: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  >aOp[i];.    }el
a730: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  se{.      /* We 
a740: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69  are currently li
a750: 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d  sting subprogram
a760: 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  s.  Figure out w
a770: 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20  hich one and.   
a780: 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68     ** pick up th
a790: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70  e appropriate op
a7a0: 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  code. */.      i
a7b0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d  nt j;.      i -=
a7c0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66   p->nOp;.      f
a7d0: 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62  or(j=0; i>=apSub
a7e0: 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a  [j]->nOp; j++){.
a7f0: 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53          i -= apS
a800: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[j]->nOp;.    
a810: 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20    }.      pOp = 
a820: 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69  &apSub[j]->aOp[i
a830: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
a840: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
a850: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
a860: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
a870: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
a880: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8a0: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
a8b0: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  unter */.      p
a8c0: 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20  Mem++;.  .      
a8d0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a8e0: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
a8f0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
a900: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
a910: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
a920: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
a930: 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20  ; /* Opcode */. 
a940: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
a950: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
a960: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
a970: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
a980: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
a990: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
a9a0: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
a9b0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
a9c0: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
a9d0: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
a9e0: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
a9f0: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
aa00: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
aa10: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
aa20: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
aa30: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
aa40: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
aa50: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
aa60: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
aa70: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
aa80: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
aa90: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
aaa0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
aab0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
aac0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
aad0: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
aae0: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
aaf0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
ab00: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
ab10: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
ab20: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
ab30: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
ab40: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
ab50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
ab60: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
ab70: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
ab80: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
ab90: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
aba0: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
abb0: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
abc0: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
abd0: 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20   nSub!=0) ){.   
abe0: 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28         apSub = (
abf0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
ac00: 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20  ub->z;.         
ac10: 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d   apSub[nSub++] =
ac20: 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61   pOp->p4.pProgra
ac30: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  m;.          pSu
ac40: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  b->flags |= MEM_
ac50: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20  Blob;.          
ac60: 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73  pSub->n = nSub*s
ac70: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
ac80: 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  *);.        }.  
ac90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
aca0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
acb0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
acc0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
acf0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
ad00: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
ad10: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
ad20: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
ad30: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad50: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P2 */.    pMem++
ad60: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
ad70: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
ad80: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
ad90: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P3 */.    pMe
adc0: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  m++;..    if( sq
add0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
ade0: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
adf0: 20 33 32 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f   32) ){ /* P4 */
ae00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ae10: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
ae20: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
ae30: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
ae40: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
ae50: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
ae60: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
ae70: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
ae80: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29  Op, pMem->z, 32)
ae90: 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70  ;.    if( zP4!=p
aea0: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
aeb0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
aec0: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
aed0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
aee0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
aef0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
af00: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
af10: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
af20: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
af30: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
af40: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
af50: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
af60: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
af70: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
af80: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
af90: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
afa0: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29  dResize(pMem, 4)
afb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
afc0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
afd0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
afe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
aff0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
b000: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
b010: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
b020: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
b030: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
b040: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
b050: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
b060: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
b070: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
b080: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
b090: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
b0a0: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
b0b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
b0c0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
b0d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
b0e0: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
b0f0: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29  esize(pMem, 500)
b100: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
b110: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
b120: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
b130: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b140: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
b150: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
b160: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
b170: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
b180: 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d  ->n = displayCom
b190: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70  ment(pOp, zP4, p
b1a0: 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20  Mem->z, 500);.  
b1b0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
b1c0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c  SQLITE_UTF8;.#el
b1d0: 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  se.      pMem->f
b1e0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e         /* Commen
b210: 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  t */.#endif.    
b220: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
b230: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
b240: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
b250: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
b260: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20   &p->aMem[1];.  
b270: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
b280: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
b290: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
b2a0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
b2b0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
b2c0: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
b2d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
b2e0: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
b2f0: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
b300: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
b310: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
b320: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b330: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
b340: 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63  e *p){.  const c
b350: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
b360: 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
b370: 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20   z = p->zSql;.  
b380: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70  }else if( p->nOp
b390: 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=1 ){.    const
b3a0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
b3b0: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69  p->aOp[0];.    i
b3c0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
b3d0: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
b3e0: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  p4.z!=0 ){.     
b3f0: 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a   z = pOp->p4.z;.
b400: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
b410: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
b420: 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) z++;.    }.  }
b430: 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74  .  if( z ) print
b440: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
b450: 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   z);.}.#endif..#
b460: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b470: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
b480: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
b490: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
b4a0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
b4b0: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
b4c0: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
b4d0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
b4e0: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
b4f0: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
b500: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
b510: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
b520: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
b530: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
b540: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
b550: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
b560: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
b570: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
b580: 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70  P_Init && pOp->p
b590: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  4.z!=0 ){.    in
b5a0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
b5b0: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
b5c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
b5d0: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
b5e0: 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  ", pOp->p4.z);. 
b5f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69     for(i=0; sqli
b600: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
b610: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72  ; i++){}.    for
b620: 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (j=0; z[i]; i++)
b630: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
b640: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
b650: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
b660: 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20  z[i-1]!=' ' ){. 
b670: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
b680: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
b690: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b6a0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
b6b0: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
b6c0: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b   }.    z[j] = 0;
b6d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72  .    sqlite3IoTr
b6e0: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
b6f0: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
b700: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
b710: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
b720: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
b730: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  */../*.** Alloca
b740: 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20  te space from a 
b750: 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65  fixed size buffe
b760: 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  r and return a p
b770: 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61  ointer to.** tha
b780: 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73  t space.  If ins
b790: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
b7a0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
b7b0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
b7c0: 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65   The pBuf parame
b7d0: 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69  ter is the initi
b7e0: 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f  al value of a po
b7f0: 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c  inter which will
b800: 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20  .** receive the 
b810: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75  new memory.  pBu
b820: 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55  f is normally NU
b830: 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20  LL.  If pBuf is 
b840: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20  not.** NULL, it 
b850: 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72  means that memor
b860: 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65  y space has alre
b870: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
b880: 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74  ed and that.** t
b890: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
b8a0: 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  ld not allocate 
b8b0: 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20  any new memory. 
b8c0: 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f   When pBuf is no
b8d0: 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79  t.** NULL simply
b8e0: 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f   return pBuf.  O
b8f0: 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77  nly allocate new
b900: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68   memory space wh
b910: 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55  en pBuf.** is NU
b920: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20  LL..**.** nByte 
b930: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b940: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
b950: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70  needed..**.** *p
b960: 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20  pFrom points to 
b970: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20  available space 
b980: 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20  and pEnd points 
b990: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
b9a0: 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73  e.** available s
b9b0: 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63  pace.  When spac
b9c0: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20  e is allocated, 
b9d0: 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e  *ppFrom is advan
b9e0: 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ced past.** the 
b9f0: 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  end of the alloc
ba00: 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a  ated space..**.*
ba10: 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63  * *pnByte is a c
ba20: 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75  ounter of the nu
ba30: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
ba40: 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65   space that have
ba50: 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c   failed.** to al
ba60: 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72  locate.  If ther
ba70: 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e  e is insufficien
ba80: 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72  t space in *ppFr
ba90: 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  om to satisfy th
baa0: 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68  e.** request, th
bab0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  en increment *pn
bac0: 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75  Byte by the amou
bad0: 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  nt of the reques
bae0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
baf0: 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20  d *allocSpace(. 
bb00: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
bb10: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72        /* Where r
bb20: 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69  eturn pointer wi
bb30: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a  ll be stored */.
bb40: 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
bb50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bb60: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c   of bytes to all
bb70: 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a  ocate */.  u8 **
bb80: 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20  ppFrom,         
bb90: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63  /* IN/OUT: Alloc
bba0: 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d  ate from *ppFrom
bbb0: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20   */.  u8 *pEnd, 
bbc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
bbd0: 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20  inter to 1 byte 
bbe0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
bbf0: 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a  *ppFrom buffer *
bc00: 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20  /.  int *pnByte 
bc10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
bc20: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  llocation cannot
bc30: 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d   be made, increm
bc40: 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29  ent *pnByte */.)
bc50: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
bc60: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
bc70: 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69  (*ppFrom) );.  i
bc80: 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e  f( pBuf ) return
bc90: 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d   pBuf;.  nByte =
bca0: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
bcb0: 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29    if( &(*ppFrom)
bcc0: 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20  [nByte] <= pEnd 
bcd0: 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76  ){.    pBuf = (v
bce0: 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20  oid*)*ppFrom;.  
bcf0: 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79    *ppFrom += nBy
bd00: 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  te;.  }else{.   
bd10: 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74   *pnByte += nByt
bd20: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
bd30: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
bd40: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
bd50: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
bd60: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
bd70: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
bd80: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
bd90: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
bda0: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
bdb0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
bdc0: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
bdd0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
bde0: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
bdf0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
be00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
be10: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
be20: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
be30: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
be40: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
be50: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
be60: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
be70: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
be80: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
be90: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
bea0: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
beb0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
bec0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69  E_MAGIC_RUN;..#i
bed0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
bee0: 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  G.  for(i=1; i<p
bef0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
bf00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
bf10: 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29  m[i].db==p->db )
bf20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
bf30: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
bf40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bf50: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
bf60: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
bf70: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
bf80: 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e  AGIC_RUN;.  p->n
bf90: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d  Change = 0;.  p-
bfa0: 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20  >cacheCtr = 1;. 
bfb0: 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
bfc0: 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20  Format = 255;.  
bfd0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
bfe0: 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  0;.  p->nFkConst
bff0: 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65  raint = 0;.#ifde
c000: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
c010: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
c020: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d  Op; i++){.    p-
c030: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
c040: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
c050: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23  ycles = 0;.  }.#
c060: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
c070: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
c080: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
c090: 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66  cution for the f
c0a0: 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a  irst time after.
c0b0: 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  ** creating the 
c0c0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
c0d0: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
c0e0: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
c0f0: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67  s allocating reg
c100: 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69  isters and initi
c110: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
c120: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
c130: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
c140: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
c150: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
c160: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
c170: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
c180: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
c190: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e   .**.** This fun
c1a0: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
c1b0: 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  led exactly once
c1c0: 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c   on each virtual
c1d0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74   machine..** Aft
c1e0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
c1f0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d  is called the VM
c200: 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61   has been "packa
c210: 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64  ged" and is read
c220: 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66  y.** to run.  Af
c230: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
c240: 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74   is called, furt
c250: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  her calls to .**
c260: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c270: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  p() functions ar
c280: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54  e prohibited.  T
c290: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63  his routine disc
c2a0: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56  onnects.** the V
c2b0: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72  dbe from the Par
c2c0: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  se object that h
c2d0: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69  elped generate i
c2e0: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  t so that the.**
c2f0: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65   the Vdbe become
c300: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74  s an independent
c310: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20   entity and the 
c320: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e  Parse object can
c330: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64   be.** destroyed
c340: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
c350: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
c360: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  d() procedure to
c370: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75   restore a virtu
c380: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a  al machine back.
c390: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61  ** to its initia
c3a0: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74  l state after it
c3b0: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a   has been run..*
c3c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
c3d0: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
c3e0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c400: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50   The VDBE */.  P
c410: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20  arse *pParse    
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c430: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
c440: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
c450: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
c460: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
c470: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c480: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  on */.  int nVar
c490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c4a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c4b0: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a   of parameters *
c4c0: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c4f0: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  VM memory regist
c500: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ers */.  int nCu
c510: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
c520: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c530: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71  r of cursors req
c540: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
c550: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
c560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c570: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
c580: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20   in subprograms 
c590: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20  */.  int nOnce; 
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c5c0: 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63   OP_Once instruc
c5d0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tions */.  int n
c5e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c5f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c600: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
c610: 38 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20  8 *zCsr;        
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c630: 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   Memory availabl
c640: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
c650: 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20   */.  u8 *zEnd; 
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c670: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
c680: 74 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65  te past allocate
c690: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
c6a0: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c6c0: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d  How much extra m
c6d0: 65 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20  emory is needed 
c6e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  */..  assert( p!
c6f0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c700: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
c710: 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
c720: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
c730: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
c740: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
c750: 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70  rt( pParse==p->p
c760: 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20  Parse );.  db = 
c770: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
c780: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c790: 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d  d==0 );.  nVar =
c7a0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20   pParse->nVar;. 
c7b0: 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   nMem = pParse->
c7c0: 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20  nMem;.  nCursor 
c7d0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
c7e0: 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d    nArg = pParse-
c7f0: 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63  >nMaxArg;.  nOnc
c800: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63  e = pParse->nOnc
c810: 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d  e;.  if( nOnce==
c820: 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f  0 ) nOnce = 1; /
c830: 2a 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73  * Ensure at leas
c840: 74 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d  t one byte in p-
c850: 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a  >aOnceFlag[] */.
c860: 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68    .  /* For each
c870: 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64   cursor required
c880: 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20  , also allocate 
c890: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d  a memory cell. M
c8a0: 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73  emory.  ** cells
c8b0: 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72   (nMem+1-nCursor
c8c0: 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69  )..nMem, inclusi
c8d0: 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ve, will never b
c8e0: 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74  e used by.  ** t
c8f0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e  he vdbe program.
c900: 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72   Instead they ar
c910: 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  e used to alloca
c920: 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a  te space for.  *
c930: 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43  * VdbeCursor/BtC
c940: 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73  ursor structures
c950: 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  . The blob of me
c960: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
c970: 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f  with .  ** curso
c980: 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e  r 0 is stored in
c990: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65   memory cell nMe
c9a0: 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28  m. Memory cell (
c9b0: 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f  nMem-1).  ** sto
c9c0: 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  res the blob of 
c9d0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
c9e0: 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c  d with cursor 1,
c9f0: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
ca00: 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61  See also: alloca
ca10: 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f  teCursor()..  */
ca20: 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73  .  nMem += nCurs
ca30: 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  or;..  /* Alloca
ca40: 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
ca50: 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53  ory registers, S
ca60: 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44  QL variables, VD
ca70: 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a  BE cursors and .
ca80: 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f    ** an array to
ca90: 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e   marshal SQL fun
caa0: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
cab0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20  in..  */.  zCsr 
cac0: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
cad0: 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 20 20  ->nOp];         
cae0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
caf0: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  liable for alloc
cb00: 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20  ation */.  zEnd 
cb10: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
cb20: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d  Parse->nOpAlloc]
cb30: 3b 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65  ;  /* First byte
cb40: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73   past end of zCs
cb50: 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76  r[] */..  resolv
cb60: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
cb70: 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74  rg);.  p->usesSt
cb80: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  mtJournal = (u8)
cb90: 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  (pParse->isMulti
cba0: 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d  Write && pParse-
cbb0: 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66  >mayAbort);.  if
cbc0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
cbd0: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
cbe0: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
cbf0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72   }.  memset(zCsr
cc00: 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b  , 0, zEnd-zCsr);
cc10: 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72  .  zCsr += (zCsr
cc20: 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20   - (u8*)0)&7;.  
cc30: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
cc40: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73  TE_ALIGNMENT(zCs
cc50: 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72  r) );.  p->expir
cc60: 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65  ed = 0;..  /* Me
cc70: 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65  mory for registe
cc80: 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20  rs, parameters, 
cc90: 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20  cursor, etc, is 
cca0: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f  allocated in two
ccb0: 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f  .  ** passes.  O
ccc0: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73  n the first pass
ccd0: 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73  , we try to reus
cce0: 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61  e unused space a
ccf0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20  t the .  ** end 
cd00: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
cd10: 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20  ray.  If we are 
cd20: 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  unable to satisf
cd30: 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a  y all memory.  *
cd40: 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62  * requirements b
cd50: 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70  y reusing the op
cd60: 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c  code array tail,
cd70: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
cd80: 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20  .  ** pass will 
cd90: 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74  fill in the rest
cda0: 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61   using a fresh a
cdb0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a  llocation.  .  *
cdc0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d  *.  ** This two-
cdd0: 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68  pass approach th
cde0: 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63  at reuses as muc
cdf0: 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
ce00: 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  ible from.  ** t
ce10: 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63  he leftover spac
ce20: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
ce30: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
ce40: 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74   can significant
ce50: 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74  ly.  ** reduce t
ce60: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
ce70: 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72  ory held by a pr
ce80: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
ce90: 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20  ..  */.  do {.  
cea0: 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20    nByte = 0;.   
ceb0: 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
cec0: 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e  Space(p->aMem, n
ced0: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Mem*sizeof(Mem),
cee0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
cef0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56  Byte);.    p->aV
cf00: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
cf10: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69  p->aVar, nVar*si
cf20: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
cf30: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
cf40: 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20  .    p->apArg = 
cf50: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
cf60: 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
cf70: 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  (Mem*), &zCsr, z
cf80: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
cf90: 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c    p->azVar = all
cfa0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72  ocSpace(p->azVar
cfb0: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68  , nVar*sizeof(ch
cfc0: 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  ar*), &zCsr, zEn
cfd0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
cfe0: 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63  p->apCsr = alloc
cff0: 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20  Space(p->apCsr, 
d000: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
d010: 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20  dbeCursor*),.   
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45         &zCsr, zE
d040: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
d050: 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20   p->aOnceFlag = 
d060: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f  allocSpace(p->aO
d070: 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20  nceFlag, nOnce, 
d080: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
d090: 79 74 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  yte);.#ifdef SQL
d0a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
d0b0: 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70  SCANSTATUS.    p
d0c0: 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63  ->anExec = alloc
d0d0: 53 70 61 63 65 28 70 2d 3e 61 6e 45 78 65 63 2c  Space(p->anExec,
d0e0: 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69   p->nOp*sizeof(i
d0f0: 36 34 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  64), &zCsr, zEnd
d100: 2c 20 26 6e 42 79 74 65 29 3b 0a 23 65 6e 64 69  , &nByte);.#endi
d110: 66 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  f.    if( nByte 
d120: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65  ){.      p->pFre
d130: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
d140: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
d150: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43  e);.    }.    zC
d160: 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20  sr = p->pFree;. 
d170: 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b     zEnd = &zCsr[
d180: 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65  nByte];.  }while
d190: 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e  ( nByte && !db->
d1a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
d1b0: 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  p->nCursor = 
d1c0: 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f  nCursor;.  p->nO
d1d0: 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b  nceFlag = nOnce;
d1e0: 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29  .  if( p->aVar )
d1f0: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20  {.    p->nVar = 
d200: 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20  (ynVar)nVar;.   
d210: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
d220: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
d230: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
d240: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
d250: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
d260: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
d270: 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 26 26   if( p->azVar &&
d280: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3e 30   pParse->nzVar>0
d290: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72   ){.    p->nzVar
d2a0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   = pParse->nzVar
d2b0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
d2c0: 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61  azVar, pParse->a
d2d0: 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73  zVar, p->nzVar*s
d2e0: 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30  izeof(p->azVar[0
d2f0: 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ]));.    memset(
d300: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30  pParse->azVar, 0
d310: 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a  , pParse->nzVar*
d320: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
d330: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  zVar[0]));.  }. 
d340: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
d350: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
d380: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
d390: 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  */.    p->nMem =
d3a0: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
d3b0: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
d3c0: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
d3d0: 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d  -1 */.    for(n=
d3e0: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29  1; n<=nMem; n++)
d3f0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  {.      p->aMem[
d400: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  n].flags = MEM_U
d410: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20  ndefined;.      
d420: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
d430: 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  db;.    }.  }.  
d440: 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
d450: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
d460: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
d470: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  d(p);.}../*.** C
d480: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73  lose a VDBE curs
d490: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  or and release a
d4a0: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
d4b0: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a   that cursor .**
d4c0: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64   happens to hold
d4d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d4e0: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
d4f0: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
d500: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
d510: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
d520: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
d530: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c  ite3VdbeSorterCl
d540: 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b  ose(p->db, pCx);
d550: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20  .  if( pCx->pBt 
d560: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
d570: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
d580: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  t);.    /* The p
d590: 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
d5a0: 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
d5b0: 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
d5c0: 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a  xists, by.    **
d5d0: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
d5e0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
d5f0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
d600: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
d610: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
d620: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  >pCursor);.  }.#
d630: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d640: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
d650: 20 20 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e    else if( pCx->
d660: 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20  pVtabCursor ){. 
d670: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f     sqlite3_vtab_
d680: 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
d690: 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62  sor = pCx->pVtab
d6a0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73  Cursor;.    cons
d6b0: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
d6c0: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61   *pModule = pVta
d6d0: 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e  bCursor->pVtab->
d6e0: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61 73 73  pModule;.    ass
d6f0: 65 72 74 28 20 70 56 74 61 62 43 75 72 73 6f 72  ert( pVtabCursor
d700: 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20  ->pVtab->nRef>0 
d710: 29 3b 0a 20 20 20 20 70 56 74 61 62 43 75 72 73  );.    pVtabCurs
d720: 6f 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d  or->pVtab->nRef-
d730: 2d 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  -;.    pModule->
d740: 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73  xClose(pVtabCurs
d750: 6f 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  or);.  }.#endif.
d760: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
d770: 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
d780: 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65  in the VdbeFrame
d790: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
d7a0: 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20  s Vdbe. This.** 
d7b0: 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61  is used, for exa
d7c0: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69  mple, when a tri
d7d0: 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d  gger sub-program
d7e0: 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65   is halted to re
d7f0: 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c  store.** control
d800: 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   to the main pro
d810: 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  gram..*/.int sql
d820: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
d830: 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a  tore(VdbeFrame *
d840: 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20  pFrame){.  Vdbe 
d850: 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a  *v = pFrame->v;.
d860: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d870: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
d880: 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63  ATUS.  v->anExec
d890: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65   = pFrame->anExe
d8a0: 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61  c;.#endif.  v->a
d8b0: 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d  OnceFlag = pFram
d8c0: 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20  e->aOnceFlag;.  
d8d0: 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70  v->nOnceFlag = p
d8e0: 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67  Frame->nOnceFlag
d8f0: 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  ;.  v->aOp = pFr
d900: 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
d910: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
d920: 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
d930: 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
d940: 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
d950: 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
d960: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
d970: 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
d980: 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
d990: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
d9a0: 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
d9b0: 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
d9c0: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
d9d0: 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64  >nChange;.  v->d
d9e0: 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  b->nChange = pFr
d9f0: 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a  ame->nDbChange;.
da00: 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d    return pFrame-
da10: 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  >pc;.}../*.** Cl
da20: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ose all cursors.
da30: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65  .**.** Also rele
da40: 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ase any dynamic 
da50: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74  memory held by t
da60: 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62  he VM in the Vdb
da70: 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a  e.aMem memory .*
da80: 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68  * cell array. Th
da90: 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
daa0: 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  as the memory ce
dab0: 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e  ll array may con
dac0: 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73  tain.** pointers
dad0: 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62   to VdbeFrame ob
dae0: 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79  jects, which may
daf0: 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e   in turn contain
db00: 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20   pointers to.** 
db10: 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f  open cursors..*/
db20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
db30: 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62  seAllCursors(Vdb
db40: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
db50: 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  pFrame ){.    Vd
db60: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b  beFrame *pFrame;
db70: 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d  .    for(pFrame=
db80: 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d  p->pFrame; pFram
db90: 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61  e->pParent; pFra
dba0: 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  me=pFrame->pPare
dbb0: 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nt);.    sqlite3
dbc0: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
dbd0: 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d  (pFrame);.    p-
dbe0: 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20  >pFrame = 0;.   
dbf0: 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a   p->nFrame = 0;.
dc00: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
dc10: 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 0a 20  >nFrame==0 );.. 
dc20: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
dc30: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
dc40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
dc50: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
dc60: 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
dc70: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
dc80: 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
dc90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dca0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
dcb0: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
dcc0: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
dcd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dce0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  }.  if( p->aMem 
dcf0: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
dd00: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
dd10: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  1], p->nMem);.  
dd20: 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44  }.  while( p->pD
dd30: 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  elFrame ){.    V
dd40: 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d  dbeFrame *pDel =
dd50: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20   p->pDelFrame;. 
dd60: 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20     p->pDelFrame 
dd70: 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b  = pDel->pParent;
dd80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
dd90: 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c  FrameDelete(pDel
dda0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
ddb0: 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20  ete any auxdata 
ddc0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65  allocations made
ddd0: 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20   by the VM */.  
dde0: 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20  if( p->pAuxData 
ddf0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  ) sqlite3VdbeDel
de00: 65 74 65 41 75 78 44 61 74 61 28 70 2c 20 2d 31  eteAuxData(p, -1
de10: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
de20: 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29  p->pAuxData==0 )
de30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
de40: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
de50: 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a   a single run..*
de60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c  /.static void Cl
de70: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a  eanup(Vdbe *p){.
de80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
de90: 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53  p->db;..#ifdef S
dea0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
deb0: 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28   Execute assert(
dec0: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
ded0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
dee0: 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64  Vdbe.apCsr[] and
def0: 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d   .  ** Vdbe.aMem
df00: 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61  [] arrays have a
df10: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61  lready been clea
df20: 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e  ned up.  */.  in
df30: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
df40: 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69  Csr ) for(i=0; i
df50: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
df60: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
df70: 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66  sr[i]==0 );.  if
df80: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
df90: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
dfa0: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
dfb0: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  t( p->aMem[i].fl
dfc0: 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e  ags==MEM_Undefin
dfd0: 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed );.  }.#endif
dfe0: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
dff0: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
e000: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
e010: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
e020: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
e030: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
e040: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
e050: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
e060: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
e070: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
e080: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
e090: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
e0a0: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
e0b0: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
e0c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
e0d0: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
e0e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e0f0: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
e100: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
e110: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
e120: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
e130: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
e140: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
e150: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
e160: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
e170: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
e180: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
e190: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
e1a0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
e1b0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
e1c0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
e1d0: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
e1e0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
e1f0: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
e200: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
e210: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
e220: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
e230: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
e240: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
e250: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
e260: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
e270: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
e280: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
e290: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
e2a0: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
e2b0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
e2c0: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
e2d0: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
e2e0: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
e2f0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
e300: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
e310: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
e320: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
e330: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
e340: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
e350: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
e360: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
e370: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
e380: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
e390: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
e3a0: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
e3b0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
e3c0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
e3d0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
e3e0: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
e3f0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
e400: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
e410: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
e420: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
e430: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
e440: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
e450: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
e460: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
e470: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
e480: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
e490: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
e4a0: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
e4b0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
e4c0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
e4d0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
e500: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
e510: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
e540: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
e550: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
e560: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e580: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
e590: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
e5a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e5b0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
e5c0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
e5d0: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
e5e0: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
e5f0: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
e600: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
e610: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
e620: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
e630: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
e640: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
e650: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
e660: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
e670: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
e680: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
e690: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
e6a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
e6b0: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
e6c0: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
e6d0: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
e6e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e6f0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
e700: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
e710: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
e720: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
e730: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
e740: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
e750: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
e760: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
e770: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
e780: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
e790: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
e7a0: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
e7b0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
e7c0: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
e7d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e7e0: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
e7f0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
e800: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
e810: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
e820: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
e830: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
e840: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
e850: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
e860: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
e870: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
e880: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
e890: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
e8a0: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
e8b0: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
e8c0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e8d0: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
e8e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
e8f0: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
e900: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
e910: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
e920: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
e930: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
e940: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
e950: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
e960: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
e970: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
e980: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
e990: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
e9a0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
e9b0: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
e9c0: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
e9d0: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
e9e0: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
e9f0: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
ea00: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
ea10: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
ea20: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
ea30: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
ea40: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
ea50: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
ea60: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
ea70: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
ea80: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
ea90: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
eaa0: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
eab0: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
eac0: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
ead0: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
eae0: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
eaf0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
eb00: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
eb10: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
eb20: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
eb30: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
eb40: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
eb50: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
eb60: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
eb70: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
eb80: 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  p);..  /* This l
eb90: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
eba0: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
ebb0: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
ebc0: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
ebd0: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
ebe0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
ebf0: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
ec00: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
ec10: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
ec20: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
ec30: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
ec40: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
ec50: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
ec60: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
ec70: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
ec80: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
ec90: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
eca0: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
ecb0: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
ecc0: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
ecd0: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d   .  for(i=0; rc=
ece0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
ecf0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
ed00: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
ed10: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
ed20: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
ed30: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
ed40: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  Bt) ){.      nee
ed50: 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
ed60: 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e      if( i!=1 ) n
ed70: 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73  Trans++;.      s
ed80: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
ed90: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
eda0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
edb0: 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69  clusiveLock(sqli
edc0: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
edd0: 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
ede0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
edf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
ee00: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ee10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
ee20: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
ee30: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
ee40: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
ee50: 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
ee60: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
ee70: 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
ee80: 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
ee90: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
eea0: 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
eeb0: 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
eec0: 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
eed0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
eee0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
eef0: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
ef00: 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  HOOK;.    }.  }.
ef10: 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
ef20: 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
ef30: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
ef40: 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
ef50: 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
ef60: 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
ef70: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
ef80: 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
ef90: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
efa0: 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
efb0: 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
efc0: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
efd0: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
efe0: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
eff0: 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
f000: 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
f010: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
f020: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
f030: 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
f040: 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
f050: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
f060: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
f070: 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
f080: 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
f090: 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
f0a0: 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
f0b0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
f0c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
f0d0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
f0e0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
f0f0: 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61  pBt)).   || nTra
f100: 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66  ns<=1.  ){.    f
f110: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
f120: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
f130: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
f140: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
f150: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
f160: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
f170: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f180: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
f190: 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
f1a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
f1b0: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
f1c0: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
f1d0: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
f1e0: 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
f1f0: 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
f200: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
f210: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
f220: 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
f230: 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
f240: 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
f250: 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
f260: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
f270: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
f280: 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
f290: 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
f2a0: 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
f2b0: 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
f2c0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
f2d0: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
f2e0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
f2f0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
f300: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
f310: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
f320: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
f330: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
f340: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
f350: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
f360: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
f370: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
f380: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
f390: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f3a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
f3b0: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
f3c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
f3d0: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
f3e0: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
f3f0: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
f400: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
f410: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
f420: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
f430: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
f440: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
f450: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
f460: 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79  itted atomically
f470: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
f480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
f490: 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
f4a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
f4b0: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
f4c0: 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
f4d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
f4e0: 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
f4f0: 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
f500: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
f510: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
f520: 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
f530: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
f540: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
f550: 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
f560: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
f570: 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
f580: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
f590: 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72  t res;.    int r
f5a0: 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20  etryCount = 0;. 
f5b0: 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65     int nMainFile
f5c0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
f5d0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
f5e0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  l file name */. 
f5f0: 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73     nMainFile = s
f600: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f610: 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a  MainFile);.    z
f620: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
f630: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
f640: 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a  mjXXXXXX9XXz", z
f650: 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69  MainFile);.    i
f660: 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20  f( zMaster==0 ) 
f670: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
f680: 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  MEM;.    do {.  
f690: 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b      u32 iRandom;
f6a0: 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79  .      if( retry
f6b0: 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  Count ){.       
f6c0: 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e   if( retryCount>
f6d0: 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
f6e0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
f6f0: 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65  ITE_FULL, "MJ de
f700: 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lete: %s", zMast
f710: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
f720: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
f730: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
f740: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
f750: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
f760: 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d   if( retryCount=
f770: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
f780: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
f790: 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c  TE_FULL, "MJ col
f7a0: 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lide: %s", zMast
f7b0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
f7c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
f7d0: 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20  ryCount++;.     
f7e0: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
f7f0: 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64  ess(sizeof(iRand
f800: 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a  om), &iRandom);.
f810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
f820: 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73  printf(13, &zMas
f830: 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20  ter[nMainFile], 
f840: 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a  "-mj%06X9%02X",.
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
f870: 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66  iRandom>>8)&0xff
f880: 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78  ffff, iRandom&0x
f890: 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ff);.      /* Th
f8a0: 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74  e antipenultimat
f8b0: 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  e character of t
f8c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f8d0: 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20  l name must.    
f8e0: 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61    ** be "9" to a
f8f0: 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73  void name collis
f900: 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20  ions when using 
f910: 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a  8+3 filenames. *
f920: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
f930: 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53  zMaster[sqlite3S
f940: 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29  trlen30(zMaster)
f950: 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20  -3]=='9' );.    
f960: 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
f970: 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20  fix3(zMainFile, 
f980: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
f990: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
f9a0: 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
f9b0: 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
f9c0: 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
f9d0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
f9e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
f9f0: 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
fa00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fa10: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
fa20: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
fa30: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
fa40: 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
fa50: 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
fa60: 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
fa70: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
fa80: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
fa90: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
faa0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
fab0: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
fac0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
fad0: 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
fae0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
faf0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fb00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
fb10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
fb20: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
fb30: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
fb40: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
fb50: 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
fb60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
fb70: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
fb80: 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
fb90: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
fba0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
fbb0: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
fbc0: 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
fbd0: 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
fbe0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
fbf0: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
fc00: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
fc10: 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
fc20: 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
fc30: 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
fc40: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
fc50: 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
fc60: 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
fc70: 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
fc80: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
fc90: 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
fca0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
fcb0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
fcc0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
fcd0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
fce0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
fcf0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
fd00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
fd10: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
fd20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
fd30: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
fd40: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
fd50: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
fd60: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
fd70: 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e  * Ignore TEMP an
fd80: 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  d :memory: datab
fd90: 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
fda0: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
fdb0: 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b  ( zFile[0]!=0 );
fdc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65  .        if( !ne
fdd0: 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74  edSync && !sqlit
fde0: 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
fdf0: 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20  led(pBt) ){.    
fe00: 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
fe10: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
fe20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
fe30: 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
fe40: 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
fe50: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
fe60: 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
fe70: 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
fe80: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
fe90: 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
fea0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
feb0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
fec0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
fed0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
fee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
fef0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
ff00: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
ff10: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
ff20: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
ff30: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
ff40: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
ff50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
ff60: 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
ff70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ff80: 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
ff90: 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
ffa0: 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
ffb0: 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
ffc0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
ffd0: 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
ffe0: 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  nc .     && 0==(
fff0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
10000 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
10010 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
10020 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
10030 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
10040 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
10050 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c  3OsSync(pMaster,
10060 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
10070 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  MAL)).    ){.   
10080 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
10090 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
100a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
100b0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
100c0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
100d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
100e0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
100f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10100 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
10110 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
10120 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
10130 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
10140 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
10150 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
10160 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
10170 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
10180 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
10190 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
101a0 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
101b0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
101c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
101d0 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
101e0 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
101f0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
10200 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
10210 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
10220 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
10230 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
10240 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
10250 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
10260 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10270 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
10280 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
10290 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
102a0 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
102b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
102c0 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
102d0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
102e0 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
102f0 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
10300 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20  re occurred..   
10310 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
10320 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
10330 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
10340 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
10350 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
10360 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
10370 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
10380 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
10390 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
103a0 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  pBt, zMaster);. 
103b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
103c0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
103d0 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
103e0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
103f0 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20  LITE_BUSY );.   
10400 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10410 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
10420 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
10430 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
10440 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
10450 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
10460 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10470 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
10480 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
10490 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
104a0 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
104b0 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
104c0 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
104d0 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
104e0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
104f0 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
10500 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
10510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10520 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
10530 73 74 65 72 2c 20 6e 65 65 64 53 79 6e 63 29 3b  ster, needSync);
10540 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
10550 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
10560 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
10570 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
10580 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10590 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
105a0 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
105b0 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
105c0 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
105d0 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
105e0 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
105f0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
10600 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
10610 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
10620 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
10630 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
10640 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
10650 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
10660 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
10670 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
10680 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
10690 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
106a0 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
106b0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
106c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
106d0 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
106e0 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
106f0 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
10700 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
10710 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
10720 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
10730 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
10740 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
10750 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
10760 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
10770 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
10780 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
10790 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
107a0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
107b0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
107c0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
107d0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
107e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
107f0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
10800 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a  aseTwo(pBt, 1);.
10810 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10820 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
10830 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
10840 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
10850 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
10860 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
10870 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
10880 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
10890 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
108a0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
108b0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
108c0 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f  3.nVdbeActive co
108d0 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
108e0 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
108f0 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
10900 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
10910 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
10920 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
10930 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
10940 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
10950 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
10960 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
10970 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
10980 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
10990 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
109a0 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
109b0 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
109c0 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
109d0 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
109e0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
109f0 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
10a00 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
10a10 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
10a20 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
10a30 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
10a40 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
10a50 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d  0;.  int nRead =
10a60 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
10a70 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
10a80 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
10a90 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71  e3_stmt_busy((sq
10aa0 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29  lite3_stmt*)p) )
10ab0 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
10ac0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
10ad0 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
10ae0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
10af0 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65  >bIsReader ) nRe
10b00 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ad++;.    }.    
10b10 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
10b20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
10b30 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65  =db->nVdbeActive
10b40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
10b50 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57  rite==db->nVdbeW
10b60 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  rite );.  assert
10b70 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64  ( nRead==db->nVd
10b80 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73  beRead );.}.#els
10b90 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
10ba0 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
10bb0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
10bc0 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
10bd0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
10be0 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
10bf0 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
10c00 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
10c10 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
10c20 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
10c30 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
10c40 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
10c50 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
10c60 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
10c70 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
10c80 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
10c90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
10ca0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
10cb0 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
10cc0 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
10cd0 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
10ce0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
10cf0 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
10d00 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
10d10 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
10d20 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
10d30 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
10d40 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
10d50 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
10d60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
10d70 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
10d80 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
10d90 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f  ){.  sqlite3 *co
10da0 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  nst db = p->db;.
10db0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10dc0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  E_OK;..  /* If p
10dd0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  ->iStatement is 
10de0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
10df0 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62  o, then this Vdb
10e00 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a  e opened a .  **
10e10 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10e20 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75  action that shou
10e30 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72  ld be closed her
10e40 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65  e. The only exce
10e50 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68  ption.  ** is th
10e60 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d  at an IO error m
10e70 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  ay have occurred
10e80 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65  , causing an eme
10e90 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e  rgency rollback.
10ea0 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  .  ** In this ca
10eb0 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  se (db->nStateme
10ec0 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72  nt==0), and ther
10ed0 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
10ee0 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  do..  */.  if( d
10ef0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26  b->nStatement &&
10f00 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29   p->iStatement )
10f10 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
10f20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
10f30 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
10f40 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73  ement-1;..    as
10f50 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50  sert( eOp==SAVEP
10f60 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  OINT_ROLLBACK ||
10f70 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
10f80 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73  RELEASE);.    as
10f90 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
10fa0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73  ment>0 );.    as
10fb0 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
10fc0 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
10fd0 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
10fe0 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  int) );..    for
10ff0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
11000 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
11010 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
11020 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  K;.      Btree *
11030 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
11040 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
11050 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pBt ){.        i
11060 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
11070 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
11080 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
11090 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
110a0 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
110b0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
110c0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
110d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
110e0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
110f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
11100 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
11110 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
11120 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
11130 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
11140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
11150 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11160 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
11170 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20   = rc2;.        
11180 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11190 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
111a0 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74  nt--;.    p->iSt
111b0 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  atement = 0;..  
111c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
111d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
111e0 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
111f0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
11200 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11210 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
11220 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
11230 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
11240 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11260 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
11270 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
11280 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
11290 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
112a0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
112b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
112c0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
112d0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
112e0 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
112f0 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72  ack, also restor
11300 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  e the .    ** da
11310 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64  tabase handles d
11320 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
11330 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68  nt counter to th
11340 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77  e value it had w
11350 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
11360 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
11370 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
11380 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f  .  */.    if( eO
11390 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
113a0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64  LBACK ){.      d
113b0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
113c0 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f   = p->nStmtDefCo
113d0 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44  ns;.      db->nD
113e0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
113f0 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43   p->nStmtDefImmC
11400 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ons;.    }.  }. 
11410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11420 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
11430 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
11440 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
11450 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61  opened by the da
11460 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c  tabase .** handl
11470 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
11480 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  h the VM passed 
11490 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69  as an argument i
114a0 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a  s about to be .*
114b0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20  * committed. If 
114c0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
114d0 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66  nding deferred f
114e0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
114f0 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69  raint.** violati
11500 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ons, return SQLI
11510 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77  TE_ERROR. Otherw
11520 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
11530 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
11540 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46  re outstanding F
11550 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64  K violations and
11560 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
11570 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
11580 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65  E_ERROR, set the
11590 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56   result of the V
115a0 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  M to SQLITE_CONS
115b0 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
115c0 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61  Y.** and write a
115d0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
115e0 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75  to it. Then retu
115f0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
11600 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
11610 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
11620 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  KEY.int sqlite3V
11630 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20  dbeCheckFk(Vdbe 
11640 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64  *p, int deferred
11650 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
11660 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
11670 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62  (deferred && (db
11680 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b  ->nDeferredCons+
11690 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
116a0 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20  Cons)>0) .   || 
116b0 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
116c0 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
116d0 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72  ) .  ){.    p->r
116e0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
116f0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
11700 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63  ;.    p->errorAc
11710 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
11720 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
11730 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
11740 67 2c 20 64 62 2c 20 22 46 4f 52 45 49 47 4e 20  g, db, "FOREIGN 
11750 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  KEY constraint f
11760 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74  ailed");.    ret
11770 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
11780 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11790 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
117a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
117b0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
117c0 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45   the when a VDBE
117d0 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20   tries to halt. 
117e0 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20   If the VDBE.** 
117f0 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73  has made changes
11800 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63   and is in autoc
11810 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e  ommit mode, then
11820 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a   commit those.**
11830 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20   changes.  If a 
11840 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64  rollback is need
11850 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  ed, then do the 
11860 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
11870 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
11880 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
11890 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  move the state o
118a0 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53  f a VM from.** S
118b0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20  QLITE_MAGIC_RUN 
118c0 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  to SQLITE_MAGIC_
118d0 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72  HALT.  It is har
118e0 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c  mless to.** call
118f0 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68   this on a VM th
11900 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c  at is in the SQL
11910 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73  ITE_MAGIC_HALT s
11920 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tate..**.** Retu
11930 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
11940 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
11950 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c   could not compl
11960 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a  ete because of.*
11970 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  * lock contentio
11980 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  n, return SQLITE
11990 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54  _BUSY.  If SQLIT
119a0 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
119b0 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ed, it.** means 
119c0 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f  the close did no
119d0 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65  t happen and nee
119e0 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ds to be repeate
119f0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
11a00 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a  3VdbeHalt(Vdbe *
11a10 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  p){.  int rc;   
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
11a40 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74   store transient
11a50 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f   return codes */
11a60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
11a70 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68   p->db;..  /* Th
11a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  is function cont
11a90 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74  ains the logic t
11aa0 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69  hat determines i
11ab0 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  f a statement or
11ac0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
11ad0 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74  n will be commit
11ae0 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
11af0 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ck as a result o
11b00 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75  f the.  ** execu
11b10 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72  tion of this vir
11b20 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20  tual machine. . 
11b30 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20   **.  ** If any 
11b40 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
11b50 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20   errors occur:. 
11b60 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c   **.  **     SQL
11b70 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20  ITE_NOMEM.  **  
11b80 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a     SQLITE_IOERR.
11b90 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
11ba0 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51  FULL.  **     SQ
11bb0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20  LITE_INTERRUPT. 
11bc0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68   **.  ** Then th
11bd0 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65  e internal cache
11be0 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
11bf0 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
11c00 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74  nsistent.  ** st
11c10 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ate.  We need to
11c20 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74   rollback the st
11c30 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
11c40 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73  ion, if there is
11c50 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68  .  ** one, or th
11c60 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73  e complete trans
11c70 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
11c80 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  is no statement 
11c90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
11ca0 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  /..  if( p->db->
11cb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
11cc0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
11cd0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
11ce0 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  if( p->aOnceFlag
11cf0 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e   ) memset(p->aOn
11d00 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f  ceFlag, 0, p->nO
11d10 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73  nceFlag);.  clos
11d20 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
11d30 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
11d40 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
11d50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11d60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68  ITE_OK;.  }.  ch
11d70 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
11d80 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63  (db);..  /* No c
11d90 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
11da0 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  k needed if the 
11db0 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74  program never st
11dc0 61 72 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a  arted or if the.
11dd0 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
11de0 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64  nt does not read
11df0 20 6f 72 20 77 72 69 74 65 20 61 20 64 61 74 61   or write a data
11e00 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20  base file.  */. 
11e10 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26   if( p->pc>=0 &&
11e20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b   p->bIsReader ){
11e30 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
11e40 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
11e50 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
11e60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61   */.    int eSta
11e70 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20  tementOp = 0;.  
11e80 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
11e90 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
11ea0 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
11eb0 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65  if a 'special' e
11ec0 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rror */..    /* 
11ed0 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20  Lock all btrees 
11ee0 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74  used by the stat
11ef0 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ement */.    sql
11f00 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29  ite3VdbeEnter(p)
11f10 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
11f20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
11f30 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
11f40 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
11f50 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53   & 0xff;.    isS
11f60 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
11f70 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11f80 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
11f90 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
11fa0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
11fb0 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
11fc0 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
11fd0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
11fe0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
11ff0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
12000 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
12010 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72  -only and the er
12020 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
12030 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20  TE_INTERRUPT, . 
12040 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62       ** no rollb
12050 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79  ack is necessary
12060 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20  . Otherwise, at 
12070 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e  least a savepoin
12080 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
12090 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
120a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72  rolled back to r
120b0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
120c0 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20  ase to a .      
120d0 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74  ** consistent st
120e0 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
120f0 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74      ** Even if t
12100 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
12110 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73  read-only, it is
12120 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65   important to pe
12130 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61  rform.      ** a
12140 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72   statement or tr
12150 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
12160 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66  ck operation. If
12170 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20   the error .    
12180 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68    ** occurred wh
12190 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ile writing to t
121a0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d  he journal, sub-
121b0 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62  journal or datab
121c0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
121d0 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
121e0 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75  effort to free u
121f0 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73  p cache space (s
12200 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
12210 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73    ** pagerStress
12220 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20  () in pager.c), 
12230 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
12240 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74  required to rest
12250 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
12260 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e  e pager to a con
12270 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
12280 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
12290 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  ( !p->readOnly |
122a0 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e  | mrc!=SQLITE_IN
122b0 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  TERRUPT ){.     
122c0 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c     if( (mrc==SQL
122d0 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
122e0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
122f0 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
12300 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
12310 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
12320 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
12330 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ACK;.        }el
12340 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
12350 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
12360 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
12370 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
12380 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
12390 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
123a0 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
123b0 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
123c0 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
123d0 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
123e0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
123f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
12400 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
12410 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
12420 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  CK);.          s
12430 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
12440 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
12450 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
12460 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
12470 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
12480 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
12490 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
124a0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d  /* Check for imm
124b0 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
124c0 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a  ey violations. *
124d0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
124e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
124f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
12500 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20  heckFk(p, 0);.  
12510 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
12520 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
12530 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
12540 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
12550 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20  y active writer 
12560 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e  .    ** VM, then
12570 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20   we do either a 
12580 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
12590 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ck of the curren
125a0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  t transaction. .
125b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
125c0 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61  te: This block a
125d0 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20  lso runs if one 
125e0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
125f0 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20  rrors handled . 
12600 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
12610 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a  occurred. .    *
12620 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  /.    if( !sqlit
12630 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29  e3VtabInSync(db)
12640 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75   .     && db->au
12650 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26  toCommit .     &
12660 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  & db->nVdbeWrite
12670 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ==(p->readOnly==
12680 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0) .    ){.     
12690 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
126a0 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
126b0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
126c0 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
126d0 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
126e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
126f0 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a  eCheckFk(p, 1);.
12700 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
12710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12720 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
12730 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  (p->readOnly) ){
12740 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
12750 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
12760 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
12770 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12780 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
12790 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
127a0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
127b0 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
127c0 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20      }else{ .    
127d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74        /* The aut
127e0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
127f0 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20   true, the vdbe 
12800 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63  program was succ
12810 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20  essful .        
12820 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27    ** or hit an '
12830 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61  OR FAIL' constra
12840 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72  int and there ar
12850 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f  e no deferred fo
12860 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20  reign.          
12870 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  ** key constrain
12880 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68  ts to hold up th
12890 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
128a0 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d  his means a comm
128b0 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  it .          **
128c0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
128d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
128e0 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70  vdbeCommit(db, p
128f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12900 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
12910 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72  ITE_BUSY && p->r
12920 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
12930 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12940 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
12950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12960 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
12970 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
12980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12990 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
129a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
129b0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
129c0 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
129d0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
129e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
129f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12a00 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
12a10 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
12a20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
12a30 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  mmCons = 0;.    
12a40 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
12a50 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72  &= ~SQLITE_Defer
12a60 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73  FKs;.          s
12a70 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
12a80 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b  rnalChanges(db);
12a90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12ab0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
12ac0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
12ad0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
12ae0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
12af0 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74   }.      db->nSt
12b00 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  atement = 0;.   
12b10 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
12b20 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20  ementOp==0 ){.  
12b30 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
12b40 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65  QLITE_OK || p->e
12b50 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
12b60 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ail ){.        e
12b70 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
12b80 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b  VEPOINT_RELEASE;
12b90 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
12ba0 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
12bb0 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
12bc0 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
12bd0 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
12be0 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65  LLBACK;.      }e
12bf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
12c00 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
12c10 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
12c20 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
12c30 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
12c40 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
12c50 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
12c60 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
12c70 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
12c80 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
12c90 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65  }.  .    /* If e
12ca0 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e  StatementOp is n
12cb0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
12cc0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12cd0 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20  ction needs to. 
12ce0 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74     ** be committ
12cf0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
12d00 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56  k. Call sqlite3V
12d10 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
12d20 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  t() to.    ** do
12d30 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65   so. If this ope
12d40 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  ration returns a
12d50 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65  n error, and the
12d60 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
12d70 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  nt.    ** error 
12d80 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f  code is SQLITE_O
12d90 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53  K or SQLITE_CONS
12da0 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f  TRAINT, then pro
12db0 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  mote the.    ** 
12dc0 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
12dd0 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20  t error code..  
12de0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74    */.    if( eSt
12df0 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20  atementOp ){.   
12e00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
12e10 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
12e20 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f  t(p, eStatementO
12e30 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
12e40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
12e50 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12e60 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29   || (p->rc&0xff)
12e70 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
12e80 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  INT ){.         
12e90 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
12ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
12eb0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
12ec0 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
12ed0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
12ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12ef0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
12f00 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
12f10 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
12f20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12f30 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
12f40 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
12f50 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
12f60 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
12f70 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
12f80 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
12f90 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
12fa0 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
12fb0 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20  r DELETE and no 
12fc0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12fd0 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73  ction.    ** has
12fe0 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
12ff0 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61  k, update the da
13000 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13010 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  n change-counter
13020 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
13030 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
13040 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53   ){.      if( eS
13050 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45  tatementOp!=SAVE
13060 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
13070 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13080 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
13090 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
130a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
130b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
130c0 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
130d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
130e0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
130f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13100 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
13110 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
13120 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
13130 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  }..  /* We have 
13140 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c  successfully hal
13150 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74  ted and closed t
13160 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74  he VM.  Record t
13170 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69  his fact. */.  i
13180 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
13190 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69     db->nVdbeActi
131a0 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70  ve--;.    if( !p
131b0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d  ->readOnly ) db-
131c0 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20  >nVdbeWrite--;. 
131d0 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
131e0 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52  der ) db->nVdbeR
131f0 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  ead--;.    asser
13200 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
13210 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ve>=db->nVdbeRea
13220 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
13230 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d   db->nVdbeRead>=
13240 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
13250 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
13260 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20  ->nVdbeWrite>=0 
13270 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  );.  }.  p->magi
13280 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48  c = VDBE_MAGIC_H
13290 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  ALT;.  checkActi
132a0 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20  veVdbeCnt(db);. 
132b0 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
132c0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
132d0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
132e0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
132f0 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
13300 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  it flag is set t
13310 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  o true, then any
13320 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65   locks that were
13330 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f   held.  ** by co
13340 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65  nnection db have
13350 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73   now been releas
13360 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ed. Call sqlite3
13370 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
13380 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e  ed() .  ** to in
13390 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65  voke any require
133a0 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  d unlock-notify 
133b0 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
133c0 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
133d0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
133e0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
133f0 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a  ocked(db);.  }..
13400 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
13410 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64  dbeActive>0 || d
13420 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
13430 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65   || db->nStateme
13440 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  nt==0 );.  retur
13450 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  n (p->rc==SQLITE
13460 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42  _BUSY ? SQLITE_B
13470 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29  USY : SQLITE_OK)
13480 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
13490 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
134a0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
134b0 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
134c0 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
134d0 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
134e0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
134f0 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
13500 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
13510 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
13520 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
13530 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
13540 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
13550 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
13560 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
13570 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65  error message be
13580 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56  longing to the V
13590 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  DBE passed.** as
135a0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
135b0 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62  ent to its datab
135c0 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74  ase handle (so t
135d0 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65  hat they will be
135e0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79   .** returned by
135f0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
13600 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20  3_errcode() and 
13610 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
13620 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
13630 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
13640 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65  clear the VDBE e
13650 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73  rror code or mes
13660 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f  sage, just.** co
13670 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65  pies them to the
13680 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13690 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
136a0 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
136b0 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  r(Vdbe *p){.  sq
136c0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
136d0 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  b;.  int rc = p-
136e0 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45  >rc;.  if( p->zE
136f0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38 20  rrMsg ){.    u8 
13700 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64  mallocFailed = d
13710 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
13720 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
13730 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
13740 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72  .    if( db->pEr
13750 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20  r==0 ) db->pErr 
13760 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
13770 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  w(db);.    sqlit
13780 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
13790 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
137a0 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
137b0 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
137c0 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
137d0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
137e0 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61  oc();.    db->ma
137f0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c  llocFailed = mal
13800 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 64  locFailed;.    d
13810 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  b->errCode = rc;
13820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
13830 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
13840 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
13850 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
13860 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
13870 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20  LOG./*.** If an 
13880 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
13890 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67  LLOG hook is reg
138a0 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20  istered and the 
138b0 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c  VM has been run,
138c0 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a   .** invoke it..
138d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
138e0 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
138f0 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20  Vdbe *v){.  if( 
13900 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
13910 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76  fig.xSqllog && v
13920 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13930 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d  && v->zSql && v-
13940 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68  >pc>=0 ){.    ch
13950 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20  ar *zExpanded = 
13960 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e  sqlite3VdbeExpan
13970 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29  dSql(v, v->zSql)
13980 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d  ;.    assert( v-
13990 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d  >db->init.busy==
139a0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78  0 );.    if( zEx
139b0 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20  panded ){.      
139c0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
139d0 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20  fig.xSqllog(.   
139e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
139f0 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
13a00 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45  ogArg, v->db, zE
13a10 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20  xpanded, 1.     
13a20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
13a30 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a  3DbFree(v->db, z
13a40 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d  Expanded);.    }
13a50 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
13a60 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65  efine vdbeInvoke
13a70 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66  Sqllog(x).#endif
13a80 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
13a90 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
13aa0 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
13ab0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
13ac0 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
13ad0 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
13ae0 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
13af0 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
13b00 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
13b10 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
13b20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
13b30 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
13b40 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
13b50 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
13b60 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
13b70 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
13b80 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
13b90 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
13ba0 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
13bb0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
13bc0 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
13bd0 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
13be0 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
13bf0 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
13c00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
13c10 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
13c20 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
13c30 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
13c40 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20  .  /* If the VM 
13c50 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63  did not run to c
13c60 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20  ompletion or if 
13c70 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  it encountered a
13c80 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68  n.  ** error, th
13c90 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  en it might not 
13ca0 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64  have been halted
13cb0 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68   properly.  So h
13cc0 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e  alt.  ** it now.
13cd0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
13ce0 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f  dbeHalt(p);..  /
13cf0 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61  * If the VDBE ha
13d00 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61  s be run even pa
13d10 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72  rtially, then tr
13d20 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72  ansfer the error
13d30 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65   code.  ** and e
13d40 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f  rror message fro
13d50 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20  m the VDBE into 
13d60 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
13d70 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75  e structure.  Bu
13d80 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44  t.  ** if the VD
13d90 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  BE has just been
13da0 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20   set to run but 
13db0 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  has not actually
13dc0 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20   executed any.  
13dd0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
13de0 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d  yet, leave the m
13df0 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72  ain database err
13e00 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  or information u
13e10 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20  nchanged..  */. 
13e20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
13e30 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53  .    vdbeInvokeS
13e40 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71  qllog(p);.    sq
13e50 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
13e60 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73  rError(p);.    s
13e70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
13e80 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
13e90 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
13ea0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e  ;.    if( p->run
13eb0 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78  OnlyOnce ) p->ex
13ec0 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  pired = 1;.  }el
13ed0 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20  se if( p->rc && 
13ee0 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20  p->expired ){.  
13ef0 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64    /* The expired
13f00 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e   flag was set on
13f10 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65   the VDBE before
13f20 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a   the first call.
13f30 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
13f40 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f  3_step(). For co
13f50 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65  nsistency (since
13f60 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
13f70 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65  was.    ** calle
13f80 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61  d), set the data
13f90 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68  base error in th
13fa0 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e  is case as well.
13fb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
13fc0 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
13fd0 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45  db, p->rc, p->zE
13fe0 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30  rrMsg ? "%s" : 0
13ff0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
14000 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
14010 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
14020 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
14030 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
14040 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
14050 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56  ry used by the V
14060 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e  DBE.  */.  Clean
14070 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76  up(p);..  /* Sav
14080 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
14090 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
140a0 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
140b0 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
140c0 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
140d0 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
140e0 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
140f0 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
14100 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
14110 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
14120 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
14130 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
14140 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
14150 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
14160 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
14170 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
14180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
14190 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
141a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
141b0 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  zSql ){.        
141c0 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a  char c, pc = 0;.
141d0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
141e0 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
141f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63       for(i=0; (c
14200 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d   = p->zSql[i])!=
14210 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
14220 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20     if( pc=='\n' 
14230 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  ) fprintf(out, "
14240 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  -- ");.         
14250 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20   putc(c, out);. 
14260 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b           pc = c;
14270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14280 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20     if( pc!='\n' 
14290 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  ) fprintf(out, "
142a0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
142b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
142c0 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
142d0 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31       char zHdr[1
142e0 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  00];.        sql
142f0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
14300 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72  zeof(zHdr), zHdr
14310 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38  , "%6u %12llu %8
14320 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20  llu ",.         
14330 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c    p->aOp[i].cnt,
14340 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
14350 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20  Op[i].cycles,.  
14360 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
14370 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f  i].cnt>0 ? p->aO
14380 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61  p[i].cycles/p->a
14390 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20  Op[i].cnt : 0.  
143a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
143b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
143c0 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20  s", zHdr);.     
143d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
143e0 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
143f0 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
14400 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
14410 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
14420 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72  #endif.  p->iCur
14430 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20  rentTime = 0;.  
14440 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
14450 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
14460 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d  turn p->rc & db-
14470 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a  >errMask;.}. ./*
14480 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
14490 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
144a0 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
144b0 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
144c0 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
144d0 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
144e0 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
144f0 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
14500 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
14510 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
14520 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
14530 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14540 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
14550 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
14560 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
14570 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
14580 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
14590 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
145a0 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  t(p);.    assert
145b0 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65  ( (rc & p->db->e
145c0 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
145d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
145e0 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74  Delete(p);.  ret
145f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14600 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f   If parameter iO
14610 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  p is less than z
14620 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ero, then invoke
14630 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
14640 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c  for.** all auxil
14650 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
14660 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  rs currently cac
14670 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  hed by the VM pa
14680 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66  ssed as.** the f
14690 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
146a0 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20  *.** Or, if iOp 
146b0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
146c0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
146d0 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72  , then the destr
146e0 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79  uctor is.** only
146f0 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f   invoked for tho
14700 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  se auxiliary dat
14710 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74  a pointers creat
14720 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a  ed by the user .
14730 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  ** function invo
14740 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75  ked by the OP_Fu
14750 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74  nction opcode at
14760 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70   instruction iOp
14770 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65   of .** VM pVdbe
14780 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20  , and only then 
14790 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  if:.**.**    * t
147a0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75  he associated fu
147b0 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
147c0 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20   is the 32nd or 
147d0 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a  later (counting.
147e0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66  **      from lef
147f0 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a  t to right), or.
14800 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63  **.**    * the c
14810 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
14820 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73   in argument mas
14830 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72  k is clear (wher
14840 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20  e the first.**  
14850 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72      function par
14860 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e  ameter correspon
14870 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e  ds to bit 0 etc.
14880 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
14890 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
148a0 61 74 61 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ata(Vdbe *pVdbe,
148b0 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61   int iOp, int ma
148c0 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 20 2a  sk){.  AuxData *
148d0 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e 70 41  *pp = &pVdbe->pA
148e0 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28  uxData;.  while(
148f0 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44   *pp ){.    AuxD
14900 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b  ata *pAux = *pp;
14910 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29  .    if( (iOp<0)
14920 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e  .     || (pAux->
14930 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75  iOp==iOp && (pAu
14940 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28  x->iArg>31 || !(
14950 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32  mask & MASKBIT32
14960 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a  (pAux->iArg)))).
14970 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
14980 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72  tcase( pAux->iAr
14990 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69  g==31 );.      i
149a0 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
149b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
149c0 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
149d0 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
149e0 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d       *pp = pAux-
149f0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
14a00 6c 69 74 65 33 44 62 46 72 65 65 28 70 56 64 62  lite3DbFree(pVdb
14a10 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20  e->db, pAux);.  
14a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
14a30 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b  p= &pAux->pNext;
14a40 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
14a50 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  .** Free all mem
14a60 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
14a70 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73  ith the Vdbe pas
14a80 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
14a90 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65  d argument,.** e
14aa0 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74  xcept for object
14ab0 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69   itself, which i
14ac0 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a  s preserved..**.
14ad0 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
14ae0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
14af0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69  unction and sqli
14b00 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20  te3VdbeDelete() 
14b10 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44  is that.** VdbeD
14b20 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c  elete() also unl
14b30 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72  inks the Vdbe fr
14b40 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56  om the list of V
14b50 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  Ms associated wi
14b60 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  th.** the databa
14b70 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e  se connection an
14b80 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65  d frees the obje
14b90 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f  ct itself..*/.vo
14ba0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  id sqlite3VdbeCl
14bb0 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  earObject(sqlite
14bc0 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
14bd0 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  .  SubProgram *p
14be0 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  Sub, *pNext;.  i
14bf0 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
14c00 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
14c10 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
14c20 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
14c30 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
14c40 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
14c50 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
14c60 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
14c70 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75  ME_N);.  for(pSu
14c80 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70  b=p->pProgram; p
14c90 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29  Sub; pSub=pNext)
14ca0 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53  {.    pNext = pS
14cb0 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76  ub->pNext;.    v
14cc0 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
14cd0 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53  b, pSub->aOp, pS
14ce0 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71  ub->nOp);.    sq
14cf0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14d00 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  pSub);.  }.  for
14d10 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69  (i=p->nzVar-1; i
14d20 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65  >=0; i--) sqlite
14d30 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
14d40 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65  zVar[i]);.  vdbe
14d50 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
14d60 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
14d70 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
14d80 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
14d90 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
14da0 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
14db0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
14dc0 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
14dd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14de0 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
14df0 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ATUS.  for(i=0; 
14e00 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29  i<p->nScan; i++)
14e10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
14e20 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
14e30 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
14e40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14e50 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23  db, p->aScan);.#
14e60 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
14e70 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
14e80 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
14e90 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
14ea0 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
14eb0 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
14ec0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
14ed0 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
14ee0 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
14ef0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14f00 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
14f10 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
14f20 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a  rObject(db, p);.
14f30 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
14f40 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
14f50 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
14f60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
14f70 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
14f80 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
14f90 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
14fa0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
14fb0 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
14fc0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
14fd0 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
14fe0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
14ff0 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
15000 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
15010 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
15020 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  ./*.** The curso
15030 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64  r "p" has a pend
15040 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69  ing seek operati
15050 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  on that has not 
15060 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72  yet been.** carr
15070 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74  ied out.  Seek t
15080 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20  he cursor now.  
15090 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
150a0 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  rs, return.** th
150b0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
150c0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
150d0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
150e0 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65  OINLINE handleDe
150f0 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62  ferredMoveto(Vdb
15100 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
15110 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
15120 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
15130 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
15140 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
15150 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
15160 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  t( p->deferredMo
15170 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  veto );.  assert
15180 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  ( p->isTable );.
15190 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
151a0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
151b0 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  d(p->pCursor, 0,
151c0 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
151d0 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66  , 0, &res);.  if
151e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
151f0 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29  ;.  if( res!=0 )
15200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
15210 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66  ORRUPT_BKPT;.#if
15220 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
15230 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
15240 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
15250 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  .  p->deferredMo
15260 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  veto = 0;.  p->c
15270 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
15280 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75  HE_STALE;.  retu
15290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
152a0 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67  ./*.** Something
152b0 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f   has moved curso
152c0 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61  r "p" out of pla
152d0 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72  ce.  Maybe the r
152e0 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69  ow it was.** poi
152f0 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65  nted to was dele
15300 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
15310 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65  er it.  Or maybe
15320 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a   the btree was.*
15330 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57  * rebalanced.  W
15340 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73  hatever the caus
15350 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72  e, try to restor
15360 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61  e "p" to the pla
15370 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70  ce it.** is supp
15380 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74  osed to be point
15390 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77  ing.  If the row
153a0 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
153b0 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a   from under the.
153c0 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74  ** cursor, set t
153d0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
153e0 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77  nt to a NULL row
153f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15400 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
15410 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
15420 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  r(VdbeCursor *p)
15430 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72  {.  int isDiffer
15440 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73  entRow, rc;.  as
15450 73 65 72 74 28 20 70 2d 3e 70 43 75 72 73 6f 72  sert( p->pCursor
15460 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
15470 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
15480 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
15490 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20  Cursor) );.  rc 
154a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  = sqlite3BtreeCu
154b0 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 70  rsorRestore(p->p
154c0 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65  Cursor, &isDiffe
154d0 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63  rentRow);.  p->c
154e0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
154f0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
15500 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29  isDifferentRow )
15510 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
15520 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15530 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
15540 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
15550 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
15560 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75    Restore the cu
15570 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20  rsor.** if need 
15580 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20  be.  Return any 
15590 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  I/O error from t
155a0 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61  he restore opera
155b0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
155c0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
155d0 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72  store(VdbeCursor
155e0 20 2a 70 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *p){.  if( sqli
155f0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
15600 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
15610 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
15620 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
15630 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  or(p);.  }.  ret
15640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15650 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
15660 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
15670 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
15680 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
15690 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
156a0 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
156b0 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
156c0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
156d0 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
156e0 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
156f0 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
15700 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
15710 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
15720 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
15730 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
15740 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
15750 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
15760 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
15770 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
15780 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
15790 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
157a0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
157b0 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
157c0 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
157d0 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
157e0 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
157f0 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
15800 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
15810 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
15820 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
15830 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
15840 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
15850 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
15860 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
15870 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
15880 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
15890 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
158a0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
158b0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
158c0 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
158d0 6f 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69  or **pp, int *pi
158e0 43 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72 73  Col){.  VdbeCurs
158f0 6f 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69  or *p = *pp;.  i
15900 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
15910 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
15920 69 4d 61 70 3b 0a 20 20 20 20 69 66 28 20 70 2d  iMap;.    if( p-
15930 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61  >aAltMap && (iMa
15940 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31  p = p->aAltMap[1
15950 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20  +*piCol])>0 ){. 
15960 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41       *pp = p->pA
15970 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ltCursor;.      
15980 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20  *piCol = iMap - 
15990 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
159a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
159b0 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
159c0 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
159d0 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (p);.  }.  if( p
159e0 2d 3e 70 43 75 72 73 6f 72 20 26 26 20 73 71 6c  ->pCursor && sql
159f0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
15a00 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73  asMoved(p->pCurs
15a10 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  or) ){.    retur
15a20 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
15a30 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  sor(p);.  }.  re
15a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15a50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
15a60 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
15a70 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
15a80 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
15a90 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
15aa0 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
15ab0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15ac0 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
15ad0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
15ae0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
15af0 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
15b00 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
15b10 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
15b20 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
15b30 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
15b40 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
15b50 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
15b60 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
15b70 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
15b80 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
15b90 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
15ba0 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
15bb0 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
15bc0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
15bd0 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
15be0 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
15bf0 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
15c00 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
15c10 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
15c20 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
15c30 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
15c40 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
15c50 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
15c60 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
15c70 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
15c80 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
15c90 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
15ca0 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
15cb0 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
15cc0 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
15cd0 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
15ce0 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
15cf0 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
15d00 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
15d10 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
15d20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
15d30 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
15d40 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
15d50 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
15d60 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
15d70 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
15d80 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
15d90 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
15da0 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
15db0 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
15dc0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
15dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
15de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
15df0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15e00 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
15e10 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
15e20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
15e30 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
15e40 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
15e50 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
15e60 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
15e70 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
15e80 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
15e90 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
15ec0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
15ed0 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
15ee0 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
15ef0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
15f00 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
15f30 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
15f40 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
15f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
15f60 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
15f70 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
15f80 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
15f90 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
15fa0 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
15fb0 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
15fd0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
15fe0 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
15ff0 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
16000 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
16010 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
16020 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
16030 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16050 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
16060 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
16070 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
16080 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
16090 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
160a0 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
160b0 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
160c0 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
160d0 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
160e0 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
160f0 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
16100 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
16110 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
16120 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
16130 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
16140 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
16150 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
16160 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
16170 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
16180 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
16190 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
161a0 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
161b0 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
161c0 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
161d0 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
161e0 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 69  s;.  u32 n;..  i
161f0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
16200 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
16210 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
16220 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
16230 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
16240 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
16250 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
16260 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
16270 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
16280 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30  ((i64)0x00008000
16290 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
162a0 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
162b0 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
162c0 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
162d0 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c   u = ~i;.    }el
162e0 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b  se{.      u = i;
162f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
16300 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 72  <=127 ){.      r
16310 65 74 75 72 6e 20 28 28 69 26 31 29 3d 3d 69 20  eturn ((i&1)==i 
16320 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  && file_format>=
16330 34 29 20 3f 20 38 2b 28 75 33 32 29 75 20 3a 20  4) ? 8+(u32)u : 
16340 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
16350 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75   u<=32767 ) retu
16360 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 2;.    if( u<
16370 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72  =8388607 ) retur
16380 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 3;.    if( u<=
16390 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74  2147483647 ) ret
163a0 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75  urn 4;.    if( u
163b0 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65  <=MAX_6BYTE ) re
163c0 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75  turn 5;.    retu
163d0 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
163e0 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
163f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  {.    return 7;.
16400 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
16410 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
16420 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
16430 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
16440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
16450 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20  em->n>=0 );.  n 
16460 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a  = (u32)pMem->n;.
16470 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
16480 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
16490 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
164a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
164b0 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66  (n*2) + 12 + ((f
164c0 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30  lags&MEM_Str)!=0
164d0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
164e0 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
164f0 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
16500 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
16510 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
16520 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
16530 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
16540 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
16550 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
16560 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
16570 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
16580 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
16590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
165a0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69  tic const u8 aSi
165b0 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32  ze[] = { 0, 1, 2
165c0 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c  , 3, 4, 6, 8, 8,
165d0 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
165e0 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b     return aSize[
165f0 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
16600 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  }.}../*.** If we
16610 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69   are on an archi
16620 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78  tecture with mix
16630 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69  ed-endian floati
16640 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65  ng .** points (e
16650 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77  x: ARM7) then sw
16660 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62  ap the lower 4 b
16670 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a  ytes with the .*
16680 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e  * upper 4 bytes.
16690 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
166a0 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d  ult..**.** For m
166b0 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ost architecture
166c0 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  s, this is a no-
166d0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72  op..**.** (later
166e0 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74  ):  It is report
166f0 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68  ed to me that th
16700 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70  e mixed-endian p
16710 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d  roblem.** on ARM
16720 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69  7 is an issue wi
16730 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68  th GCC, not with
16740 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20   the ARM7 chip. 
16750 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61   It seems.** tha
16760 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73  t early versions
16770 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74   of GCC stored t
16780 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20  he two words of 
16790 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61  a 64-bit.** floa
167a0 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f  t in the wrong o
167b0 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20  rder.  And that 
167c0 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
167d0 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65  ropagated.** eve
167e0 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c  r since.  The bl
167f0 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ame is not neces
16800 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c  sarily with GCC,
16810 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20   though..** GCC 
16820 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20  might have just 
16830 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62  copying the prob
16840 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  lem from a prior
16850 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20   compiler..** I 
16860 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61  am also told tha
16870 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  t newer versions
16880 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c   of GCC that fol
16890 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a  low a different.
168a0 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62  ** ABI get the b
168b0 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e  yte order right.
168c0 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72  .**.** Developer
168d0 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f  s using SQLite o
168e0 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64  n an ARM7 should
168f0 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e   compile and run
16900 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63   their.** applic
16910 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51  ation using -DSQ
16920 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20  LITE_DEBUG=1 at 
16930 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74  least once.  Wit
16940 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c  h DEBUG.** enabl
16950 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73  ed, some asserts
16960 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75   below will ensu
16970 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65  re that the byte
16980 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f   order of.** flo
16990 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
169a0 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  es is correct..*
169b0 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30  *.** (2007-08-30
169c0 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67  )  Frank van Vug
169d0 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68  t has studied th
169e0 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65  is problem close
169f0 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65  ly.** and has se
16a00 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20  nd his findings 
16a10 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65  to the SQLite de
16a20 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b  velopers.  Frank
16a30 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20  .** writes that 
16a40 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65  some Linux kerne
16a50 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e  ls offer floatin
16a60 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65  g point hardware
16a70 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68  .** emulation th
16a80 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d  at uses only 32-
16a90 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e  bit mantissas in
16aa0 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20  stead of a full 
16ab0 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72  .** 48-bits as r
16ac0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49  equired by the I
16ad0 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28  EEE standard.  (
16ae0 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43  This is the.** C
16af0 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50  ONFIG_FPE_FASTFP
16b00 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73  E option.)  On s
16b10 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f  uch systems, flo
16b20 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62  ating point.** b
16b30 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63  yte swapping bec
16b40 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69  omes very compli
16b50 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64  cated.  To avoid
16b60 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68   problems,.** th
16b70 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65  e necessary byte
16b80 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72   swapping is car
16b90 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61  ried out using a
16ba0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a   64-bit integer.
16bb0 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  ** rather than a
16bc0 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20   64-bit float.  
16bd0 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73  Frank assures us
16be0 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68   that the code h
16bf0 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72  ere.** works for
16c00 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64   him.  We, the d
16c10 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20  evelopers, have 
16c20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65  no way to indepe
16c30 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66  ndently.** verif
16c40 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e  y this, but Fran
16c50 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20  k seems to know 
16c60 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69  what he is talki
16c70 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77  ng about.** so w
16c80 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a  e trust him..*/.
16c90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49  #ifdef SQLITE_MI
16ca0 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
16cb0 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36  _FLOAT.static u6
16cc0 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20  4 floatSwap(u64 
16cd0 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  in){.  union {. 
16ce0 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33     u64 r;.    u3
16cf0 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20  2 i[2];.  } u;. 
16d00 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d   u32 t;..  u.r =
16d10 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30   in;.  t = u.i[0
16d20 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e  ];.  u.i[0] = u.
16d30 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d  i[1];.  u.i[1] =
16d40 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72   t;.  return u.r
16d50 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61  ;.}.# define swa
16d60 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
16d70 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53  t(X)  X = floatS
16d80 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  wap(X).#else.# d
16d90 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
16da0 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65  ndianFloat(X).#e
16db0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
16dc0 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
16dd0 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
16de0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
16df0 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
16e00 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
16e10 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
16e20 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
16e30 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
16e40 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
16e50 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16e60 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a  s written..**.**
16e70 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f   nBuf is the amo
16e80 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66  unt of space lef
16e90 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65  t in buf[].  The
16ea0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
16eb0 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c  nsible.** for al
16ec0 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20  locating enough 
16ed0 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74  space to buf[] t
16ee0 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
16ef0 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69  e field, exclusi
16f00 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65  ve.** of the pMe
16f10 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73  m->u.nZero bytes
16f20 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20   for a MEM_Zero 
16f30 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  value..**.** Ret
16f40 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
16f50 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
16f60 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75   written into bu
16f70 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  f[].  The number
16f80 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20  .** of bytes in 
16f90 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
16fa0 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64  tail is included
16fb0 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76   in the return v
16fc0 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alue only.** if 
16fd0 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65  those bytes were
16fe0 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d   zeroed in buf[]
16ff0 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
17000 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75  3VdbeSerialPut(u
17010 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  8 *buf, Mem *pMe
17020 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  m, u32 serial_ty
17030 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  pe){.  u32 len;.
17040 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
17050 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
17060 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
17070 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
17080 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
17090 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
170a0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
170b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
170c0 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
170d0 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b  of(pMem->u.r) );
170e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76  .      memcpy(&v
170f0 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69  , &pMem->u.r, si
17100 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
17110 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
17120 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
17130 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
17140 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
17150 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
17160 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
17170 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
17180 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
17190 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  i>0 );.    do{. 
171a0 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20       buf[--i] = 
171b0 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20  (u8)(v&0xFF);.  
171c0 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
171d0 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20   }while( i );.  
171e0 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
171f0 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
17200 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
17210 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
17220 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
17230 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
17240 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
17250 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  o)?pMem->u.nZero
17260 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
17270 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33   == (int)sqlite3
17280 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
17290 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29  n(serial_type) )
172a0 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  ;.    len = pMem
172b0 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ->n;.    memcpy(
172c0 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
172d0 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c  n);.    return l
172e0 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
172f0 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
17300 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
17310 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75  rn 0;.}../* Inpu
17320 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65  t "x" is a seque
17330 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20  nce of unsigned 
17340 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
17350 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62  represent a.** b
17360 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
17370 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65  r.  Return the e
17380 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65  quivalent native
17390 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66   integer.*/.#def
173a0 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  ine ONE_BYTE_INT
173b0 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b  (x)    ((i8)(x)[
173c0 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f  0]).#define TWO_
173d0 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
173e0 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  256*(i8)((x)[0])
173f0 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65  |(x)[1]).#define
17400 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
17410 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28  x)  (65536*(i8)(
17420 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
17430 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66  <8)|(x)[2]).#def
17440 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ine FOUR_BYTE_UI
17450 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78  NT(x)  (((u32)(x
17460 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31  )[0]<<24)|((x)[1
17470 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
17480 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69  8)|(x)[3]).#defi
17490 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54  ne FOUR_BYTE_INT
174a0 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69  (x) (16777216*(i
174b0 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
174c0 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
174d0 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a  <8)|(x)[3])../*.
174e0 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
174f0 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
17500 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
17510 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
17520 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
17530 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
17540 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
17550 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17560 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a   bytes read..**.
17570 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17580 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
17590 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  as two separate 
175a0 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72  routines for per
175b0 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
175c0 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20   few cases that 
175d0 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61  require local va
175e0 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b  riables are brok
175f0 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65  en out into a se
17600 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e  parate.** routin
17610 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73  e so that in mos
17620 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72  t cases the over
17630 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74  head of moving t
17640 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  he stack pointer
17650 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a  .** is avoided..
17660 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53  */ .static u32 S
17670 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
17680 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
17690 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
176a0 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
176b0 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
176c0 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
176d0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
176e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
176f0 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
17700 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
17710 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
17720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
17730 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
17740 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
17750 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46  /.){.  u64 x = F
17760 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
17770 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f  f);.  u32 y = FO
17780 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
17790 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33  +4);.  x = (x<<3
177a0 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65  2) + y;.  if( se
177b0 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
177c0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
177d0 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37  OF: R-29851-5227
177e0 32 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  2 Value is a big
177f0 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20  -endian 64-bit. 
17800 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
17810 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
17820 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  /.    pMem->u.i 
17830 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
17840 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
17850 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74  EM_Int;.    test
17860 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
17870 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
17880 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17890 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20  : R-57343-49114 
178a0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
178b0 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32  ndian IEEE 754-2
178c0 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a  008 64-bit.    *
178d0 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
178e0 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20   number. */.#if 
178f0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
17900 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
17910 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
17920 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20  G_POINT).    /* 
17930 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
17940 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
17950 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
17960 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
17970 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
17980 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
17990 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
179a0 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
179b0 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
179c0 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
179d0 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
179e0 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
179f0 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a  .    ** endian..
17a00 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
17a10 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d  c const u64 t1 =
17a20 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30   ((u64)0x3ff0000
17a30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74  0)<<32;.    stat
17a40 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
17a50 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36  r1 = 1.0;.    u6
17a60 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73  4 t2 = t1;.    s
17a70 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
17a80 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73  oat(t2);.    ass
17a90 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
17aa0 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
17ab0 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
17ac0 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
17ad0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
17ae0 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
17af0 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
17b00 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20  ->u.r)==8 );.   
17b10 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
17b20 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65  Float(x);.    me
17b30 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c  mcpy(&pMem->u.r,
17b40 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
17b50 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
17b60 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28   = sqlite3IsNaN(
17b70 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d  pMem->u.r) ? MEM
17b80 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
17b90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38  ;.  }.  return 8
17ba0 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56  ;.}.u32 sqlite3V
17bb0 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
17bc0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
17bd0 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
17be0 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
17bf0 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
17c00 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
17c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17c20 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
17c30 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
17c40 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c60 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
17c70 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
17c80 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
17c90 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
17ca0 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
17cb0 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
17cc0 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
17cd0 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
17ce0 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
17cf0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
17d00 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75  case 0: {  /* Nu
17d10 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  ll */.      /* E
17d20 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
17d30 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20  078-09375 Value 
17d40 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  is a NULL. */.  
17d50 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
17d60 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
17d70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
17d80 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20     case 1: {.   
17d90 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
17da0 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36  F: R-44885-25196
17db0 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62   Value is an 8-b
17dc0 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  it twos-compleme
17dd0 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  nt.      ** inte
17de0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
17df0 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59  em->u.i = ONE_BY
17e00 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
17e10 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
17e20 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
17e30 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
17e40 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
17e50 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
17e60 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20     case 2: { /* 
17e70 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  2-byte signed in
17e80 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
17e90 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17ea0 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c  -49794-35026 Val
17eb0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
17ec0 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20  an 16-bit.      
17ed0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
17ee0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
17ef0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
17f00 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75   TWO_BYTE_INT(bu
17f10 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
17f20 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
17f30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17f40 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
17f50 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
17f60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
17f70 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
17f80 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
17f90 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
17fa0 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34  E-OF: R-37839-54
17fb0 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62  301 Value is a b
17fc0 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74  ig-endian 24-bit
17fd0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
17fe0 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
17ff0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
18000 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59  ->u.i = THREE_BY
18010 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
18020 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
18030 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
18040 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
18050 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
18060 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
18070 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
18080 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
18090 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
180a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
180b0 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c  -01849-26079 Val
180c0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
180d0 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20  an 32-bit.      
180e0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
180f0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
18100 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
18110 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62   FOUR_BYTE_INT(b
18120 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
18130 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
18140 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18150 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
18160 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
18170 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
18180 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
18190 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
181a0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
181b0 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30  CE-OF: R-50385-0
181c0 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20  9674 Value is a 
181d0 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69  big-endian 48-bi
181e0 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
181f0 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
18200 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
18210 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
18220 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b  TE_UINT(buf+2) +
18230 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
18240 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
18250 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
18260 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
18270 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18280 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
18290 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
182a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
182b0 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
182c0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
182d0 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
182e0 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
182f0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
18300 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20  These use local 
18310 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f  variables, so do
18320 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72   them in a separ
18330 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  ate routine.    
18340 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61    ** to avoid ha
18350 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65  ving to move the
18360 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69   frame pointer i
18370 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
18380 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
18390 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c  n serialGet(buf,
183a0 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d  serial_type,pMem
183b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
183c0 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
183d0 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
183e0 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
183f0 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  r 1 */.      /* 
18400 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
18410 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65  2976-22893 Value
18420 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20   is the integer 
18430 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  0. */.      /* E
18440 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38  VIDENCE-OF: R-18
18450 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20  143-12121 Value 
18460 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31  is the integer 1
18470 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
18480 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
18490 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
184a0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
184b0 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
184c0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
184d0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
184e0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
184f0 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75  14606-31564 Valu
18500 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74  e is a BLOB that
18510 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74   is (N-12)/2 byt
18520 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c  es in.      ** l
18530 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  ength..      ** 
18540 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
18550 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65  8401-00140 Value
18560 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20   is a string in 
18570 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  the text encodin
18580 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  g and.      ** (
18590 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e  N-13)/2 bytes in
185a0 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20   length. */.    
185b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
185c0 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d  16 aFlag[] = { M
185d0 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65  EM_Blob|MEM_Ephe
185e0 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45  m, MEM_Str|MEM_E
185f0 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d  phem };.      pM
18600 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
18610 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
18620 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  >n = (serial_typ
18630 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
18640 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c  Mem->flags = aFl
18650 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31  ag[serial_type&1
18660 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ];.      return 
18670 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20  pMem->n;.    }. 
18680 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
18690 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
186a0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61  ine is used to a
186b0 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65  llocate sufficie
186c0 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20  nt space for an 
186d0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
186e0 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67  * structure larg
186f0 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75  e enough to be u
18700 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
18710 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
18720 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72  () if.** the fir
18730 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
18740 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49   pointer to KeyI
18750 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b  nfo structure pK
18760 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  eyInfo..**.** Th
18770 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65  e space is eithe
18780 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  r allocated usin
18790 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  g sqlite3DbMallo
187a0 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77  cRaw() or from w
187b0 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61  ithin.** the una
187c0 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61  ligned buffer pa
187d0 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63  ssed via the sec
187e0 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72  ond and third ar
187f0 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61  guments (presuma
18800 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61  bly.** stack spa
18810 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d  ce). If the form
18820 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65  er, then *ppFree
18830 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69   is set to a poi
18840 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  nter that should
18850 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  .** be eventuall
18860 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  y freed by the c
18870 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
18880 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c  te3DbFree(). Or,
18890 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   if the .** allo
188a0 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f  cation comes fro
188b0 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53  m the pSpace/szS
188c0 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70  pace buffer, *pp
188d0 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Free is set to N
188e0 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  ULL.** before re
188f0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
18900 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
18910 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
18920 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61  eturned..*/.Unpa
18930 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
18940 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
18950 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65  ckedRecord(.  Ke
18960 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
18970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18980 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
18990 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
189a0 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20  char *pSpace,   
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189c0 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61  /* Unaligned spa
189d0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ce available */.
189e0 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20    int szSpace,  
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a00 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
18a10 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
18a20 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65  /.  char **ppFre
18a30 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
18a40 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c      /* OUT: Call
18a50 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74  er should free t
18a60 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29  his pointer */.)
18a70 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  {.  UnpackedReco
18a80 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  rd *p;          
18a90 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
18aa0 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e  record to return
18ab0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20   */.  int nOff; 
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ad0 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
18ae0 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66  nt pSpace by nOf
18af0 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f  f to align it */
18b00 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18b30 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
18b40 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57  or *p */..  /* W
18b50 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20  e want to shift 
18b60 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61  the pointer pSpa
18b70 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20  ce up such that 
18b80 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69  it is 8-byte ali
18b90 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c  gned..  ** Thus,
18ba0 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63   we need to calc
18bb0 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e  ulate a value, n
18bc0 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61  Off, between 0 a
18bd0 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a  nd 7, to shift .
18be0 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20    ** it by.  If 
18bf0 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64  pSpace is alread
18c00 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  y 8-byte aligned
18c10 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65  , nOff should be
18c20 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f   zero..  */.  nO
18c30 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54  ff = (8 - (SQLIT
18c40 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70  E_PTR_TO_INT(pSp
18c50 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a  ace) & 7)) & 7;.
18c60 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
18c70 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
18c80 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
18c90 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
18ca0 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69  ->nField+1);.  i
18cb0 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65  f( nByte>szSpace
18cc0 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d  +nOff ){.    p =
18cd0 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
18ce0 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
18cf0 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
18d00 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
18d10 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20  *ppFree = (char 
18d20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20  *)p;.    if( !p 
18d30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65  ) return 0;.  }e
18d40 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  lse{.    p = (Un
18d50 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70  packedRecord*)&p
18d60 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20  Space[nOff];.   
18d70 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20   *ppFree = 0;.  
18d80 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28  }..  p->aMem = (
18d90 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29  Mem*)&((char*)p)
18da0 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55  [ROUND8(sizeof(U
18db0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d  npackedRecord))]
18dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
18dd0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
18de0 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79  !=0 );.  p->pKey
18df0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
18e00 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
18e10 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
18e20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
18e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
18e40 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
18e50 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
18e60 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
18e70 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
18e80 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
18e90 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
18ea0 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
18eb0 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
18ec0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
18ed0 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
18ee0 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
18ef0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
18f00 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
18f10 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
18f20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
18f30 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
18f40 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
18f50 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
18f60 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
18f70 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
18f80 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
18f90 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
18fa0 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
18fb0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
18fc0 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
18fd0 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
18fe0 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
18ff0 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
19000 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
19010 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
19020 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19030 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74  ar *)pKey;.  int
19040 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19060 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
19070 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
19080 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
19090 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
190b0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
190c0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
190d0 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
190e0 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
190f0 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20  p->default_rc = 
19100 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  0;.  assert( EIG
19110 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
19120 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
19130 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
19140 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
19150 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
19160 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
19170 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79  szHdr && d<=nKey
19180 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
19190 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
191a0 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
191b0 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
191c0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
191d0 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
191e0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
191f0 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
19200 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
19210 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
19220 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
19230 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
19240 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
19250 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  .    pMem->szMal
19260 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
19270 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
19280 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
19290 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
192a0 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
192b0 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d  .    if( (++u)>=
192c0 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  p->nField ) brea
192d0 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  k;.  }.  assert(
192e0 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
192f0 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
19300 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a  >nField = u;.}..
19310 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
19320 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
19330 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77  tion compares tw
19340 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  o index or table
19350 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20   record keys in 
19360 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20  the same way.** 
19370 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  as the sqlite3Vd
19380 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
19390 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b  ) routine. Unlik
193a0 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
193b0 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66  are(),.** this f
193c0 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
193d0 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65  izes and compare
193e0 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74  s values using t
193f0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  he.** sqlite3Vdb
19400 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64  eSerialGet() and
19410 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
19420 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  re() functions. 
19430 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e  It is used.** in
19440 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
19450 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
19460 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
19470 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c  d code in.** sql
19480 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
19490 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20  mpare() returns 
194a0 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65  results with the
194b0 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65  se two primitive
194c0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
194d0 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75  true if the resu
194e0 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
194f0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
19500 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e  o desiredResult.
19510 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
19520 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
19530 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a  isagreement..*/.
19540 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
19550 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
19560 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
19570 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
19580 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
19590 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b  /.  const Unpack
195a0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
195b0 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a  , /* Right key *
195c0 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52  /.  int desiredR
195d0 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
195e0 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73    /* Correct ans
195f0 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  wer */.){.  u32 
19600 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
19610 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
19620 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
19630 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
19640 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
19650 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
19660 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
19670 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
19680 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
19690 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
196a0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
196b0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
196c0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   0;.  int rc = 0
196d0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
196e0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
196f0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
19700 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
19710 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
19720 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
19730 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
19740 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
19750 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
19760 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  db==0 ) return 1
19770 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
19780 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
19790 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
197a0 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d  fo->db;.  /* mem
197b0 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f  1.flags = 0;  //
197c0 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   Will be initial
197d0 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  ized by sqlite3V
197e0 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a  dbeSerialGet() *
197f0 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  /.  VVA_ONLY( me
19800 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
19810 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
19820 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
19830 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f  atements */..  /
19840 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20  * Compilers may 
19850 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65  complain that me
19860 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74  m1.u.i is potent
19870 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69  ially uninitiali
19880 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75  zed..  ** We cou
19890 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  ld initialize it
198a0 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c  , as shown here,
198b0 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73   to silence thos
198c0 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20  e complaints..  
198d0 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20  ** But in fact, 
198e0 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65  mem1.u.i will ne
198f0 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20  ver actually be 
19900 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a  used uninitializ
19910 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20  ed, and doing . 
19920 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73   ** the unnecess
19930 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ary initializati
19940 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61  on has a measura
19950 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72  ble negative per
19960 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d  formance.  ** im
19970 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73  pact, since this
19980 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65   routine is a ve
19990 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20  ry high runner. 
199a0 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f   And so, we choo
199b0 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72  se.  ** to ignor
199c0 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  e the compiler w
199d0 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76  arnings and leav
199e0 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  e this variable 
199f0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
19a00 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75   */.  /*  mem1.u
19a10 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20  .i = 0;  // not 
19a20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20  needed, here to 
19a30 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72  silence compiler
19a40 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20   warning */.  . 
19a50 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
19a60 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
19a70 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72  1);.  d1 = szHdr
19a80 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  1;.  assert( pKe
19a90 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b  yInfo->nField+pK
19aa0 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e  eyInfo->nXField>
19ab0 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  =pPKey2->nField 
19ac0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
19ad0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
19ae0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
19af0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19b00 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
19b10 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
19b20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
19b30 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
19b40 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
19b50 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f  al_type1;..    /
19b60 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
19b70 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
19b80 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
19b90 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
19ba0 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69   idx1 += getVari
19bb0 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31  nt32( aKey1+idx1
19bc0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29  , serial_type1 )
19bd0 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
19be0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65   that there is e
19bf0 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20  nough key space 
19c00 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f  remaining to avo
19c10 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66  id.    ** a buff
19c20 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68  er overread.  Th
19c30 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  e "d1+serial_typ
19c40 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73  e1+2" subexpress
19c50 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
19c60 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65  always be greate
19c70 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
19c80 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  to the amount of
19c90 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70   required key sp
19ca0 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20  ace..    ** Use 
19cb0 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69  that approximati
19cc0 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  on to avoid the 
19cd0 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63  more expensive c
19ce0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
19cf0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
19d00 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20  ypeLen() in the 
19d10 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20  common case..   
19d20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73   */.    if( d1+s
19d30 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75  erial_type1+2>(u
19d40 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26  32)nKey1.     &&
19d50 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53   d1+sqlite3VdbeS
19d60 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
19d70 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29  ial_type1)>(u32)
19d80 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20  nKey1 .    ){.  
19d90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19da0 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
19db0 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62   the values to b
19dc0 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20  e compared..    
19dd0 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  */.    d1 += sql
19de0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
19df0 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
19e00 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d  rial_type1, &mem
19e10 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74  1);..    /* Do t
19e20 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20  he comparison.  
19e30 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
19e40 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
19e50 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e  &mem1, &pPKey2->
19e60 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66  aMem[i], pKeyInf
19e70 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20  o->aColl[i]);.  
19e80 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
19e90 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
19ea0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
19eb0 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
19ec0 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
19ed0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
19ee0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
19ef0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
19f00 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20    /* Invert the 
19f10 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20  result for DESC 
19f20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
19f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
19f40 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e  o debugCompareEn
19f50 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  d;.    }.    i++
19f60 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
19f70 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
19f80 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a  ey2->nField );..
19f90 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
19fa0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
19fb0 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
19fc0 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
19fd0 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
19fe0 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
19ff0 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1a000 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1a010 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1a020 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1a030 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1a040 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1a050 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61  &mem1)..  */.  a
1a060 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1a070 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
1a080 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
1a090 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
1a0a0 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
1a0b0 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
1a0c0 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
1a0d0 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
1a0e0 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
1a0f0 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
1a100 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
1a110 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79   */.  rc = pPKey
1a120 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a  2->default_rc;..
1a130 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a  debugCompareEnd:
1a140 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1a150 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30  sult==0 && rc==0
1a160 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1a170 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1a180 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74  <0 && rc<0 ) ret
1a190 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1a1a0 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20  iredResult>0 && 
1a1b0 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc>0 ) return 1;
1a1c0 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
1a1d0 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  B ) return 1;.  
1a1e0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
1a1f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a200 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
1a210 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1a220 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
1a230 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  G./*.** Count th
1a240 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
1a250 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d  ds (a.k.a. colum
1a260 6e 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72  ns) in the recor
1a270 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b  d given by.** pK
1a280 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65  ey,nKey.  The ve
1a290 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63  rify that this c
1a2a0 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61  ount is less tha
1a2b0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
1a2c0 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e  e.** limit given
1a2d0 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   by pKeyInfo->nF
1a2e0 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d  ield + pKeyInfo-
1a2f0 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  >nXField..**.** 
1a300 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  If this constrai
1a310 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66  nt is not satisf
1a320 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ied, it means th
1a330 61 74 20 74 68 65 20 68 69 67 68 2d 73 70 65 65  at the high-spee
1a340 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43  d.** vdbeRecordC
1a350 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20  ompareInt() and 
1a360 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1a370 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e  eString() routin
1a380 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77  es will.** not w
1a390 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  ork correctly.  
1a3a0 49 66 20 74 68 69 73 20 61 73 73 65 72 74 28 29  If this assert()
1a3b0 20 65 76 65 72 20 66 69 72 65 73 2c 20 69 74 20   ever fires, it 
1a3c0 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a  probably means.*
1a3d0 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e  * that the KeyIn
1a3e0 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79  fo.nField or Key
1a3f0 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c  Info.nXField val
1a400 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65  ues were compute
1a410 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79  d.** incorrectly
1a420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a430 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1a440 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1a450 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63  s(.  int nKey, c
1a460 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1a470 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
1a480 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20   to verify */ . 
1a490 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a   const KeyInfo *
1a4a0 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f  pKeyInfo       /
1a4b0 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77  * Compare size w
1a4c0 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f  ith this KeyInfo
1a4d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69   */.){.  int nFi
1a4e0 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73  eld = 0;.  u32 s
1a4f0 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b  zHdr;.  u32 idx;
1a500 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a  .  u32 notUsed;.
1a510 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1a520 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
1a530 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1a540 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28  ar*)pKey;..  if(
1a550 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
1a560 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65  turn;.  idx = ge
1a570 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
1a580 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74  szHdr);.  assert
1a590 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  ( nKey>=0 );.  a
1a5a0 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75  ssert( szHdr<=(u
1a5b0 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69  32)nKey );.  whi
1a5c0 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b  le( idx<szHdr ){
1a5d0 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
1a5e0 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78  arint32(aKey+idx
1a5f0 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20  , notUsed);.    
1a600 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20  nField++;.  }.  
1a610 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c  assert( nField <
1a620 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
1a630 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  ld+pKeyInfo->nXF
1a640 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  ield );.}.#else.
1a650 23 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73  # define vdbeAss
1a660 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1a670 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29  hinLimits(A,B,C)
1a680 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42  .#endif../*.** B
1a690 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a  oth *pMem1 and *
1a6a0 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74  pMem2 contain st
1a6b0 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d  ring values. Com
1a6c0 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c  pare the two val
1a6d0 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ues.** using the
1a6e0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1a6f0 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73  nce pColl. As us
1a700 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65  ual, return a ne
1a710 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a  gative , zero.**
1a720 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c   or positive val
1a730 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20  ue if *pMem1 is 
1a740 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1a750 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74   to or greater t
1a760 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20  han .** *pMem2, 
1a770 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69  respectively. Si
1a780 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20  milar in spirit 
1a790 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31  to "rc = (*pMem1
1a7a0 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a  ) - (*pMem2);"..
1a7b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1a7c0 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1a7d0 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  ng(.  const Mem 
1a7e0 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20  *pMem1,.  const 
1a7f0 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f  Mem *pMem2,.  co
1a800 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
1a810 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72  ll,.  u8 *prcErr
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a830 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f        /* If an O
1a840 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  OM occurs, set t
1a850 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a  o SQLITE_NOMEM *
1a860 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31  /.){.  if( pMem1
1a870 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e  ->enc==pColl->en
1a880 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  c ){.    /* The 
1a890 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65  strings are alre
1a8a0 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65  ady in the corre
1a8b0 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61  ct encoding.  Ca
1a8c0 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63  ll the.     ** c
1a8d0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
1a8e0 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20  on directly */. 
1a8f0 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d     return pColl-
1a900 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1a910 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d  er,pMem1->n,pMem
1a920 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d  1->z,pMem2->n,pM
1a930 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65  em2->z);.  }else
1a940 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1a950 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31    const void *v1
1a960 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e  , *v2;.    int n
1a970 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63  1, n2;.    Mem c
1a980 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20  1;.    Mem c2;. 
1a990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1a9a0 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31  mInit(&c1, pMem1
1a9b0 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  ->db, MEM_Null);
1a9c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a9d0 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65  MemInit(&c2, pMe
1a9e0 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  m1->db, MEM_Null
1a9f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1aa00 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1aa10 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d  (&c1, pMem1, MEM
1aa20 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c  _Ephem);.    sql
1aa30 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c  ite3VdbeMemShall
1aa40 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d  owCopy(&c2, pMem
1aa50 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20  2, MEM_Ephem);. 
1aa60 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56     v1 = sqlite3V
1aa70 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
1aa80 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43  3_value*)&c1, pC
1aa90 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e  oll->enc);.    n
1aaa0 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20  1 = v1==0 ? 0 : 
1aab0 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73  c1.n;.    v2 = s
1aac0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1aad0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
1aae0 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c2, pColl->enc)
1aaf0 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30  ;.    n2 = v2==0
1ab00 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20   ? 0 : c2.n;.   
1ab10 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d   rc = pColl->xCm
1ab20 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
1ab30 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b  n1, v1, n2, v2);
1ab40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ab50 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b  MemRelease(&c1);
1ab60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ab70 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b  MemRelease(&c2);
1ab80 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20  .    if( (v1==0 
1ab90 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63  || v2==0) && prc
1aba0 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20  Err ) *prcErr = 
1abb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1abc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1abd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1abe0 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65  e two blobs.  Re
1abf0 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1ac00 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1ac10 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   if the first.**
1ac20 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1ac30 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1ac40 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63  ter than the sec
1ac50 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ond, respectivel
1ac60 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f  y..** If one blo
1ac70 62 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  b is a prefix of
1ac80 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e   the other, then
1ac90 20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20   the shorter is 
1aca0 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73  the lessor..*/.s
1acb0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
1acc0 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65  NLINE int sqlite
1acd0 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e  3BlobCompare(con
1ace0 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e  st Mem *pB1, con
1acf0 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20  st Mem *pB2){.  
1ad00 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70  int c = memcmp(p
1ad10 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70  B1->z, pB2->z, p
1ad20 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70  B1->n>pB2->n ? p
1ad30 42 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b  B2->n : pB1->n);
1ad40 0a 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72  .  if( c ) retur
1ad50 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  n c;.  return pB
1ad60 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d  1->n - pB2->n;.}
1ad70 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
1ad80 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74   the values cont
1ad90 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f  ained by the two
1ada0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72   memory cells, r
1adb0 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61  eturning.** nega
1adc0 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f  tive, zero or po
1add0 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20  sitive if pMem1 
1ade0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1adf0 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1ae00 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32  er.** than pMem2
1ae10 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20  . Sorting order 
1ae20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c  is NULL's first,
1ae30 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d   followed by num
1ae40 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a  bers (integers.*
1ae50 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72  * and reals) sor
1ae60 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c  ted numerically,
1ae70 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78   followed by tex
1ae80 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65  t ordered by the
1ae90 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
1aea0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64  quence pColl and
1aeb0 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20   finally blob's 
1aec0 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d  ordered by memcm
1aed0 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  p()..**.** Two N
1aee0 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63  ULL values are c
1aef0 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20  onsidered equal 
1af00 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1af10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1af20 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  MemCompare(const
1af30 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e   Mem *pMem1, con
1af40 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63  st Mem *pMem2, c
1af50 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1af60 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20  oll){.  int f1, 
1af70 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e  f2;.  int combin
1af80 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20  ed_flags;..  f1 
1af90 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a  = pMem1->flags;.
1afa0 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c    f2 = pMem2->fl
1afb0 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f  ags;.  combined_
1afc0 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20  flags = f1|f2;. 
1afd0 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e   assert( (combin
1afe0 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  ed_flags & MEM_R
1aff0 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20  owSet)==0 );. . 
1b000 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1b010 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20   is NULL, it is 
1b020 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74  less than the ot
1b030 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c  her. If both val
1b040 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  ues.  ** are NUL
1b050 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  L, return 0..  *
1b060 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1b070 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  _flags&MEM_Null 
1b080 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66  ){.    return (f
1b090 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66  2&MEM_Null) - (f
1b0a0 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  1&MEM_Null);.  }
1b0b0 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
1b0c0 6c 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72 20  lue is a number 
1b0d0 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
1b0e0 20 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65 72   not, the number
1b0f0 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49   is less..  ** I
1b100 66 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62 65  f both are numbe
1b110 72 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20 72  rs, compare as r
1b120 65 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20 61  eals if one is a
1b130 20 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74   real, or as int
1b140 65 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f  egers.  ** if bo
1b150 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 69 6e  th values are in
1b160 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  tegers..  */.  i
1b170 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1b180 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  s&(MEM_Int|MEM_R
1b190 65 61 6c 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  eal) ){.    doub
1b1a0 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 69  le r1, r2;.    i
1b1b0 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45  f( (f1 & f2 & ME
1b1c0 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1b1d0 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1b1e0 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i < pMem2->u.i )
1b1f0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1b200 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1b210 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   > pMem2->u.i ) 
1b220 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
1b230 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1b240 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f      if( (f1&MEM_
1b250 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1b260 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e 75 2e    r1 = pMem1->u.
1b270 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
1b280 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f1&MEM_Int)!=0
1b290 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 28   ){.      r1 = (
1b2a0 64 6f 75 62 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e  double)pMem1->u.
1b2b0 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
1b2c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1b2d0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 26    }.    if( (f2&
1b2e0 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1b2f0 20 20 20 20 20 20 72 32 20 3d 20 70 4d 65 6d 32        r2 = pMem2
1b300 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65  ->u.r;.    }else
1b310 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74   if( (f2&MEM_Int
1b320 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32  )!=0 ){.      r2
1b330 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 32   = (double)pMem2
1b340 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ->u.i;.    }else
1b350 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
1b360 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1b370 20 72 31 3c 72 32 20 29 20 72 65 74 75 72 6e 20   r1<r2 ) return 
1b380 2d 31 3b 0a 20 20 20 20 69 66 28 20 72 31 3e 72  -1;.    if( r1>r
1b390 32 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  2 ) return 1;.  
1b3a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1b3b0 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
1b3c0 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61  ue is a string a
1b3d0 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  nd the other is 
1b3e0 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69  a blob, the stri
1b3f0 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a  ng is less..  **
1b400 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72   If both are str
1b410 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73  ings, compare us
1b420 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ing the collatin
1b430 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  g functions..  *
1b440 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1b450 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29  _flags&MEM_Str )
1b460 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  {.    if( (f1 & 
1b470 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
1b480 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1b490 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32     }.    if( (f2
1b4a0 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
1b4b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
1b4c0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  1;.    }..    as
1b4d0 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1b4e0 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a  ==pMem2->enc );.
1b4f0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1b500 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1b510 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  TF8 || .        
1b520 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d      pMem1->enc==
1b530 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c  SQLITE_UTF16LE |
1b540 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51  | pMem1->enc==SQ
1b550 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a  LITE_UTF16BE );.
1b560 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c  .    /* The coll
1b570 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d  ation sequence m
1b580 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61  ust be defined a
1b590 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76  t this point, ev
1b5a0 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  en if.    ** the
1b5b0 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68   user deletes th
1b5c0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1b5d0 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76  ence after the v
1b5e0 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20  dbe program is. 
1b5f0 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28     ** compiled (
1b600 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77  this was not alw
1b610 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20  ays the case).. 
1b620 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1b630 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c  ( !pColl || pCol
1b640 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20  l->xCmp );..    
1b650 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
1b660 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f     return vdbeCo
1b670 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70  mpareMemString(p
1b680 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f  Mem1, pMem2, pCo
1b690 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 0);.    }.  
1b6a0 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70    /* If a NULL p
1b6b0 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65  ointer was passe
1b6c0 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65  d as the collate
1b6d0 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20   function, fall 
1b6e0 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74  through.    ** t
1b6f0 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20  o the blob case 
1b700 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29  and use memcmp()
1b710 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a  .  */.  }. .  /*
1b720 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73   Both values mus
1b730 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d  t be blobs.  Com
1b740 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d  pare using memcm
1b750 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  p().  */.  retur
1b760 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  n sqlite3BlobCom
1b770 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d  pare(pMem1, pMem
1b780 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  2);.}.../*.** Th
1b790 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1b7a0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1b7b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65  function is a se
1b7c0 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a  rial-type that.*
1b7d0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  * corresponds to
1b7e0 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c   an integer - al
1b7f0 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  l values between
1b800 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69   1 and 9 inclusi
1b810 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e  ve .** except 7.
1b820 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e   The second poin
1b830 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
1b840 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74  ontaining an int
1b850 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65  eger value.** se
1b860 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69  rialized accordi
1b870 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70  ng to serial_typ
1b880 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1b890 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a   deserializes.**
1b8a0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
1b8b0 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
1b8c0 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64  c i64 vdbeRecord
1b8d0 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65  DecodeInt(u32 se
1b8e0 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74  rial_type, const
1b8f0 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
1b900 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43  2 y;.  assert( C
1b910 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65  ORRUPT_DB || (se
1b920 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20  rial_type>=1 && 
1b930 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26  serial_type<=9 &
1b940 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37  & serial_type!=7
1b950 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  ) );.  switch( s
1b960 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1b970 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61    case 0:.    ca
1b980 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74  se 1:.      test
1b990 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1b9a0 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1b9b0 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  rn ONE_BYTE_INT(
1b9c0 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1b9d0 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  2:.      testcas
1b9e0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1b9f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ba00 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1ba10 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a  y);.    case 3:.
1ba20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ba30 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1ba40 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52        return THR
1ba50 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  EE_BYTE_INT(aKey
1ba60 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b  );.    case 4: {
1ba70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ba80 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1ba90 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
1baa0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1bab0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1bac0 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
1bad0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1bae0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1baf0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1bb00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46  ;.      return F
1bb10 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1bb20 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
1bb30 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1bb40 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d  INT(aKey);.    }
1bb50 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20  .    case 6: {. 
1bb60 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55       u64 x = FOU
1bb70 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1bb80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bb90 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1bba0 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
1bbb0 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
1bbc0 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
1bbd0 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
1bbe0 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20  )*(i64*)&x;.    
1bbf0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1bc00 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38  (serial_type - 8
1bc10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1bc20 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
1bc30 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
1bc40 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
1bc50 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
1bc60 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
1bc70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
1bc80 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
1bc90 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
1bca0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
1bcb0 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73  teger if key1 is
1bcc0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1bcd0 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
1bce0 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20  ter than key2.  
1bcf0 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
1bd00 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
1bd10 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
1bd20 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
1bd30 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
1bd40 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
1bd50 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
1bd60 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
1bd70 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
1bd80 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
1bd90 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
1bda0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
1bdb0 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f  ment bSkip is no
1bdc0 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73  n-zero, it is as
1bdd0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
1bde0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1bdf0 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  y.** determined 
1be00 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66  that the first f
1be10 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79  ields of the key
1be20 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a  s are equal..**.
1be30 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  ** Key1 and Key2
1be40 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
1be50 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
1be60 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1be70 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69  s. If all .** fi
1be80 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72  elds that appear
1be90 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72   in both keys ar
1bea0 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50  e equal, then pP
1beb0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1bec0 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1bed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62  ..**.** If datab
1bee0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
1bef0 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65  s discovered, se
1bf00 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  t pPKey2->errCod
1bf10 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  e to .** SQLITE_
1bf20 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75  CORRUPT and retu
1bf30 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  rn 0. If an OOM 
1bf40 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1bf50 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32  ered, .** pPKey2
1bf60 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  ->errCode is set
1bf70 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
1bf80 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e   and, if it is n
1bf90 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20  ot NULL, the.** 
1bfa0 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c  malloc-failed fl
1bfb0 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61  ag set on databa
1bfc0 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79  se handle (pPKey
1bfd0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29  2->pKeyInfo->db)
1bfe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bff0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1c000 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74  eWithSkip(.  int
1c010 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1c020 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
1c030 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1c040 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1c050 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a  Key2,         /*
1c060 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1c070 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20  int bSkip       
1c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c090 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70  /* If true, skip
1c0a0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1c0b0 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b   */.){.  u32 d1;
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1c0e0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1c0f0 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
1c100 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c120 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1c130 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20  x of next field 
1c140 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
1c150 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c170 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72  /* Size of recor
1c180 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65  d header in byte
1c190 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  s */.  u32 idx1;
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1c1c0 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69   of first type i
1c1d0 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
1c1e0 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c200 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1c210 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70  .  Mem *pRhs = p
1c220 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20  PKey2->aMem;    
1c230 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64     /* Next field
1c240 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f   of pPKey2 to co
1c250 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e  mpare */.  KeyIn
1c260 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
1c270 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
1c280 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1c290 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
1c2a0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1c2b0 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
1c2c0 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20  Mem mem1;..  /* 
1c2d0 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65  If bSkip is true
1c2e0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
1c2f0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65  r has already de
1c300 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1c310 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f  e first.  ** two
1c320 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
1c330 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1c340 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73   Fix the various
1c350 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73   stack variables
1c360 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
1c370 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e  is routine begin
1c380 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74  s comparing at t
1c390 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e  he second field.
1c3a0 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20   */.  if( bSkip 
1c3b0 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20  ){.    u32 s1;. 
1c3c0 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65     idx1 = 1 + ge
1c3d0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1c3e0 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a  [1], s1);.    sz
1c3f0 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  Hdr1 = aKey1[0];
1c400 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1c410 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   + sqlite3VdbeSe
1c420 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b  rialTypeLen(s1);
1c430 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
1c440 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  pRhs++;.  }else{
1c450 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56  .    idx1 = getV
1c460 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
1c470 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d  zHdr1);.    d1 =
1c480 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28   szHdr1;.    if(
1c490 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b   d1>(unsigned)nK
1c4a0 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50  ey1 ){ .      pP
1c4b0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1c4c0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1c4d0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
1c4e0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72  eturn 0;  /* Cor
1c4f0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
1c500 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a  .    i = 0;.  }.
1c510 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
1c520 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  1.szMalloc = 0; 
1c530 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
1c540 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
1c550 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73  tements */.  ass
1c560 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1c570 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50  yInfo->nField+pP
1c580 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1c590 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
1c5a0 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20  >nField .       
1c5b0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1c5c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
1c5d0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  2->pKeyInfo->aSo
1c5e0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1c5f0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1c600 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1c610 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1c620 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
1c630 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1c640 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
1c650 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a  al_type;..    /*
1c660 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67   RHS is an integ
1c670 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52  er */.    if( pR
1c680 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1c690 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72  Int ){.      ser
1c6a0 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1c6b0 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65  [idx1];.      te
1c6c0 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1c6d0 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1c6e0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1c6f0 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20  >=12 ){.        
1c700 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1c710 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1c720 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
1c730 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1c740 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1c750 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
1c760 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73        double rhs
1c770 20 3d 20 28 64 6f 75 62 6c 65 29 70 52 68 73 2d   = (double)pRhs-
1c780 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 73 71  >u.i;.        sq
1c790 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1c7a0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1c7b0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1c7c0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1c7d0 6d 65 6d 31 2e 75 2e 72 3c 72 68 73 20 29 7b 0a  mem1.u.r<rhs ){.
1c7e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1c7f0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1c800 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 72 68   if( mem1.u.r>rh
1c810 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1c820 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1c830 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1c840 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d         i64 lhs =
1c850 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
1c860 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65  eInt(serial_type
1c870 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20  , &aKey1[d1]);. 
1c880 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d         i64 rhs =
1c890 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20   pRhs->u.i;.    
1c8a0 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
1c8b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1c8c0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1c8d0 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
1c8e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1c8f0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1c900 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1c910 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61     /* RHS is rea
1c920 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  l */.    else if
1c930 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1c940 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
1c950 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1c960 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1c970 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1c980 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20 20  pe>=12 ){.      
1c990 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1c9a0 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1c9b0 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
1c9c0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1c9d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c9e0 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20     double rhs = 
1c9f0 70 52 68 73 2d 3e 75 2e 72 3b 0a 20 20 20 20 20  pRhs->u.r;.     
1ca00 20 20 20 64 6f 75 62 6c 65 20 6c 68 73 3b 0a 20     double lhs;. 
1ca10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1ca20 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1ca30 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1ca40 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  ype, &mem1);.   
1ca50 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1ca60 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
1ca70 20 20 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e       lhs = mem1.
1ca80 75 2e 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  u.r;.        }el
1ca90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68  se{.          lh
1caa0 73 20 3d 20 28 64 6f 75 62 6c 65 29 6d 65 6d 31  s = (double)mem1
1cab0 2e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a  .u.i;.        }.
1cac0 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c          if( lhs<
1cad0 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1cae0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1caf0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e    }else if( lhs>
1cb00 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1cb10 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1cb20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cb30 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1cb40 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20   a string */.   
1cb50 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
1cb60 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
1cb70 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  ){.      getVari
1cb80 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
1cb90 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
1cba0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1cbb0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1cbc0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1cbd0 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a  rial_type<12 ){.
1cbe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1cbf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1cc00 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26   !(serial_type &
1cc10 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
1cc20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1cc30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cc40 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c  mem1.n = (serial
1cc50 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
1cc60 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1cc70 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d  e( (d1+mem1.n)==
1cc80 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1cc90 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1cca0 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b  ase( (d1+mem1.n+
1ccb0 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  1)==(unsigned)nK
1ccc0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ey1 );.        i
1ccd0 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e  f( (d1+mem1.n) >
1cce0 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31   (unsigned)nKey1
1ccf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1cd00 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1cd10 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1cd20 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1cd30 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1cd50 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1cd60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1cd70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1cd80 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ] ){.          m
1cd90 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
1cda0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20  fo->enc;.       
1cdb0 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65     mem1.db = pKe
1cdc0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20  yInfo->db;.     
1cdd0 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20       mem1.flags 
1cde0 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20  = MEM_Str;.     
1cdf0 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63       mem1.z = (c
1ce00 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b  har*)&aKey1[d1];
1ce10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ce20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
1ce30 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20  ring(.          
1ce40 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c      &mem1, pRhs,
1ce50 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1ce60 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72  [i], &pPKey2->er
1ce70 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20  rCode.          
1ce80 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1ce90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1cea0 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e  nCmp = MIN(mem1.
1ceb0 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  n, pRhs->n);.   
1cec0 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
1ced0 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
1cee0 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
1cef0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1cf00 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e  =0 ) rc = mem1.n
1cf10 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20   - pRhs->n; .   
1cf20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1cf30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1cf40 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
1cf50 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1cf60 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
1cf70 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61  b ){.      getVa
1cf80 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
1cf90 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
1cfa0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1cfb0 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1cfc0 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1cfd0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c  serial_type<12 |
1cfe0 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26  | (serial_type &
1cff0 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
1d000 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1d010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d020 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69  int nStr = (seri
1d030 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
1d040 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  2;.        testc
1d050 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d  ase( (d1+nStr)==
1d060 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1d070 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1d080 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29  ase( (d1+nStr+1)
1d090 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1d0a0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
1d0b0 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e   (d1+nStr) > (un
1d0c0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
1d0d0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
1d0e0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1d0f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1d100 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
1d110 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1d120 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
1d130 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1d140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d150 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
1d160 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b  (nStr, pRhs->n);
1d170 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d180 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
1d190 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
1d1a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1d1b0 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53   rc==0 ) rc = nS
1d1c0 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20  tr - pRhs->n;.  
1d1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d1e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1d1f0 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  S is null */.   
1d200 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72   else{.      ser
1d210 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1d220 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63  [idx1];.      rc
1d230 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21   = (serial_type!
1d240 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  =0);.    }..    
1d250 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1d260 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
1d270 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
1d280 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1d290 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1d2a0 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
1d2b0 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1d2c0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1d2d0 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20  PKey2, rc) );.  
1d2e0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1d2f0 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1d300 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1d310 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  below */.      r
1d320 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1d330 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52  .    i++;.    pR
1d340 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20  hs++;.    d1 += 
1d350 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1d360 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1d370 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20  type);.    idx1 
1d380 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74  += sqlite3Varint
1d390 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1d3a0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
1d3b0 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72  <(unsigned)szHdr
1d3c0 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
1d3d0 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e  Field && d1<=(un
1d3e0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1d3f0 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
1d400 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
1d410 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
1d420 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
1d430 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
1d440 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
1d450 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
1d460 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
1d470 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
1d480 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
1d490 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
1d4a0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1d4b0 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61  (&mem1).  */.  a
1d4c0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1d4d0 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
1d4e0 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
1d4f0 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f  s that one or bo
1d500 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  th of the keys r
1d510 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
1d520 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
1d530 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
1d540 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
1d550 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
1d560 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
1d570 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73   value.  */.  as
1d580 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
1d590 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65   .       || vdbe
1d5a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1d5b0 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1d5c0 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d   pPKey2, pPKey2-
1d5d0 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20  >default_rc) .  
1d5e0 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f       || pKeyInfo
1d5f0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1d600 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  ed.  );.  return
1d610 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1d620 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _rc;.}.int sqlit
1d630 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1d640 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  are(.  int nKey1
1d650 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1d660 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
1d670 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1d680 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
1d690 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1d6a0 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74   key */.){.  ret
1d6b0 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
1d6c0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1d6d0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1d6e0 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  y2, 0);.}.../*.*
1d6f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d700 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1d710 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
1d720 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1d730 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
1d740 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
1d750 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
1d760 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20  an integer, and 
1d770 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65  (b) the .** size
1d780 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
1d790 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
1d7a0 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
1d7b0 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
1d7c0 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69  .** byte (i.e. i
1d7d0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29  s less than 128)
1d7e0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
1d7f0 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20   concerns about 
1d800 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
1d810 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1d820 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f  s only used.** o
1d830 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20  n schemas where 
1d840 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69  the maximum vali
1d850 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  d header size is
1d860 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73   63 bytes or les
1d870 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1d880 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1d890 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65  reInt(.  int nKe
1d8a0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1d8b0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
1d8c0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1d8d0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
1d8e0 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1d8f0 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
1d900 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63   u8 *aKey = &((c
1d910 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
1d920 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  *(const u8*)pKey
1d930 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74  1 & 0x3F];.  int
1d940 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28   serial_type = (
1d950 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1d960 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b  )[1];.  int res;
1d970 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20  .  u32 y;.  u64 
1d980 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b  x;.  i64 v = pPK
1d990 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69  ey2->aMem[0].u.i
1d9a0 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20  ;.  i64 lhs;..  
1d9b0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1d9c0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1d9d0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1d9e0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29  PKey2->pKeyInfo)
1d9f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 28 75  ;.  assert( (*(u
1da00 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20  8*)pKey1)<=0x3F 
1da10 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1da20 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1da30 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1da40 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
1da50 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1da60 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1da70 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
1da80 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1da90 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1daa0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1dab0 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
1dac0 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
1dad0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1dae0 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  lhs = TWO_BYTE_I
1daf0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1db00 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1db10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1db20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
1db30 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
1db40 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1db50 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45        lhs = THRE
1db60 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1db70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1db80 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1db90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1dba0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
1dbb0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1dbc0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20  eger */.      y 
1dbd0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1dbe0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68  (aKey);.      lh
1dbf0 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29  s = (i64)*(int*)
1dc00 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  &y;.      testca
1dc10 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1dc20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1dc30 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
1dc40 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
1dc50 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1dc60 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  lhs = FOUR_BYTE_
1dc70 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
1dc80 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1dc90 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1dca0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1dcb0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1dcc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1dcd0 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38    case 6: { /* 8
1dce0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1dcf0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20  eger */.      x 
1dd00 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1dd10 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20  (aKey);.      x 
1dd20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52  = (x<<32) | FOUR
1dd30 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1dd40 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  4);.      lhs = 
1dd50 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
1dd60 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1dd70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1dd80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1dd90 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  8: .      lhs = 
1dda0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1ddb0 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20      case 9:.    
1ddc0 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20    lhs = 1;.     
1ddd0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
1dde0 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20  This case could 
1ddf0 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f  be removed witho
1de00 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
1de10 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69  results of runni
1de20 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63  ng.    ** this c
1de30 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69  ode. Including i
1de40 74 20 63 61 75 73 65 73 20 67 63 63 20 74 6f 20  t causes gcc to 
1de50 67 65 6e 65 72 61 74 65 20 61 20 66 61 73 74 65  generate a faste
1de60 72 20 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a  r switch .    **
1de70 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63   statement (sinc
1de80 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73  e the range of s
1de90 77 69 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f  witch targets no
1dea0 77 20 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f  w starts at zero
1deb0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63   and.    ** is c
1dec0 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74 20 64  ontiguous) but d
1ded0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
1dee0 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65  y duplicate code
1def0 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
1df00 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20  .    ** (as gcc 
1df10 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68  is clever enough
1df20 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
1df30 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e  two like cases).
1df40 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   Other .    ** c
1df50 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62  ompilers might b
1df60 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a  e similar.  */ .
1df70 20 20 20 20 63 61 73 65 20 30 3a 20 63 61 73 65      case 0: case
1df80 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e   7:.      return
1df90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1dfa0 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1dfb0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
1dfc0 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
1dfd0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1dfe0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1dff0 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
1e000 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a  1, pPKey2);.  }.
1e010 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a  .  if( v>lhs ){.
1e020 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1e030 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r1;.  }else if
1e040 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v<lhs ){.    r
1e050 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
1e060 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
1e070 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
1e080 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
1e090 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1e0a0 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
1e0b0 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  al. Compare the 
1e0c0 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a  trailing .    **
1e0d0 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20   fields.  */.   
1e0e0 20 72 65 73 20 3d 20 76 64 62 65 52 65 63 6f 72   res = vdbeRecor
1e0f0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1e100 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1e110 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c  PKey2, 1);.  }el
1e120 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  se{.    /* The f
1e130 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
1e140 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
1e150 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20  equal and there 
1e160 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a  are no trailing.
1e170 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52      ** fields. R
1e180 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
1e190 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73  fault_rc in this
1e1a0 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65   case. */.    re
1e1b0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  s = pPKey2->defa
1e1c0 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20 20 61  ult_rc;.  }..  a
1e1d0 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
1e1e0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1e1f0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1e200 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65  y2, res) );.  re
1e210 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1e220 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e230 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
1e240 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
1e250 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1e260 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20  pare() .** that 
1e270 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (a) the first fi
1e280 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73  eld of pPKey2 is
1e290 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20   a string, that 
1e2a0 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (b) the first fi
1e2b0 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20  eld.** uses the 
1e2c0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1e2d0 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63  ce BINARY and (c
1e2e0 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  ) that the size-
1e2f0 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
1e300 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72   .** at the star
1e310 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
1e320 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
1e330 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61  gle byte..*/.sta
1e340 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f  tic int vdbeReco
1e350 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1e360 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1e370 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1e380 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1e390 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1e3a0 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
1e3b0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1e3c0 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
1e3d0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38  Key1 = (const u8
1e3e0 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73  *)pKey1;.  int s
1e3f0 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e  erial_type;.  in
1e400 74 20 72 65 73 3b 0a 0a 20 20 76 64 62 65 41 73  t res;..  vdbeAs
1e410 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1e420 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
1e430 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
1e440 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65  >pKeyInfo);.  ge
1e450 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1e460 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [1], serial_type
1e470 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  );.  if( serial_
1e480 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72  type<12 ){.    r
1e490 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
1e4a0 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
1e4b0 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62  nKey1) is a numb
1e4c0 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a  er or a null */.
1e4d0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
1e4e0 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1e4f0 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20  ) ){ .    res = 
1e500 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20  pPKey2->r2;     
1e510 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
1e520 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  ) is a blob */. 
1e530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1e540 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53  nCmp;.    int nS
1e550 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64  tr;.    int szHd
1e560 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20  r = aKey1[0];.. 
1e570 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61     nStr = (seria
1e580 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a  l_type-12) / 2;.
1e590 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b      if( (szHdr +
1e5a0 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29   nStr) > nKey1 )
1e5b0 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e  {.      pPKey2->
1e5c0 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1e5d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e5e0 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
1e5f0 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74  0;    /* Corrupt
1e600 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
1e610 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b   nCmp = MIN( pPK
1e620 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20  ey2->aMem[0].n, 
1e630 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20  nStr );.    res 
1e640 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
1e650 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e  szHdr], pPKey2->
1e660 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29  aMem[0].z, nCmp)
1e670 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  ;..    if( res==
1e680 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  0 ){.      res =
1e690 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e   nStr - pPKey2->
1e6a0 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20  aMem[0].n;.     
1e6b0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
1e6c0 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79         if( pPKey
1e6d0 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
1e6e0 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 76           res = v
1e6f0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1e700 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
1e710 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
1e720 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1e730 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
1e740 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
1e750 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t_rc;.        }.
1e760 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e770 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  res>0 ){.       
1e780 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1e790 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
1e7a0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
1e7b0 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20  Key2->r1;.      
1e7c0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
1e7d0 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  res>0 ){.      r
1e7e0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
1e7f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e800 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1e810 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r1;.    }.  }.. 
1e820 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
1e830 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1e840 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1e850 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20  Key2, res).     
1e860 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a    || CORRUPT_DB.
1e870 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32         || pPKey2
1e880 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  ->pKeyInfo->db->
1e890 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29  mallocFailed.  )
1e8a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
1e8b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1e8c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
1e8d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1e8e0 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61  dCompare() compa
1e8f0 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  tible function.*
1e900 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63  * suitable for c
1e910 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69  omparing seriali
1e920 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74  zed records to t
1e930 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
1e940 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  rd passed.** as 
1e950 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
1e960 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70  t..*/.RecordComp
1e970 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46  are sqlite3VdbeF
1e980 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63  indCompare(Unpac
1e990 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
1e9a0 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64   /* varintRecord
1e9b0 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
1e9c0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
1e9d0 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74  pareString() bot
1e9e0 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68  h assume.  ** th
1e9f0 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
1ea00 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61  eader varint tha
1ea10 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
1ea20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65  start of each re
1ea30 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69  cord.  ** fits i
1ea40 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
1ea50 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20  (i.e. is 127 or 
1ea60 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63  less). varintRec
1ea70 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a  ordCompareInt().
1ea80 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65    ** also assume
1ea90 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  s that it is saf
1eaa0 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20  e to overread a 
1eab0 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61  buffer by at lea
1eac0 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78  st the .  ** max
1ead0 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65  imum possible le
1eae0 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  gal header size 
1eaf0 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65  plus 8 bytes. Be
1eb00 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20  cause there is. 
1eb10 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
1eb20 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34  o be at least 74
1eb30 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62   (but not 136) b
1eb40 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
1eb50 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20  following each. 
1eb60 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65   ** buffer passe
1eb70 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72  d to varintRecor
1eb80 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68  dCompareInt() th
1eb90 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76  is makes it conv
1eba0 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c  enient to.  ** l
1ebb0 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66  imit the size of
1ebc0 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36   the header to 6
1ebd0 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73  4 bytes in cases
1ebe0 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
1ebf0 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61   field.  ** is a
1ec00 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a  n integer..  **.
1ec10 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74    ** The easiest
1ec20 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20   way to enforce 
1ec30 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f  this limit is to
1ec40 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72   consider only r
1ec50 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a  ecords with.  **
1ec60 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65   13 fields or le
1ec70 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74  ss. If the first
1ec80 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74   field is an int
1ec90 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75  eger, the maximu
1eca0 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61  m legal.  ** hea
1ecb0 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a  der size is (12*
1ecc0 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73  5 + 1 + 1) bytes
1ecd0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
1ece0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1ecf0 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e   + p->pKeyInfo->
1ed00 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a  nXField)<=13 ){.
1ed10 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
1ed20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73  p->aMem[0].flags
1ed30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65  ;.    if( p->pKe
1ed40 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1ed50 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d  r[0] ){.      p-
1ed60 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  >r1 = 1;.      p
1ed70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  ->r2 = -1;.    }
1ed80 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
1ed90 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d  1 = -1;.      p-
1eda0 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  >r2 = 1;.    }. 
1edb0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
1edc0 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20  MEM_Int) ){.    
1edd0 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
1ede0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20  ordCompareInt;. 
1edf0 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
1ee00 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  e( flags & MEM_R
1ee10 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  eal );.    testc
1ee20 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
1ee30 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Null );.    tes
1ee40 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
1ee50 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69  EM_Blob );.    i
1ee60 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d  f( (flags & (MEM
1ee70 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d  _Real|MEM_Null|M
1ee80 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20  EM_Blob))==0 && 
1ee90 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  p->pKeyInfo->aCo
1eea0 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ll[0]==0 ){.    
1eeb0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20    assert( flags 
1eec0 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20  & MEM_Str );.   
1eed0 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
1eee0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1eef0 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  g;.    }.  }..  
1ef00 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1ef10 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b  beRecordCompare;
1ef20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70  .}../*.** pCur p
1ef30 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
1ef40 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
1ef50 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
1ef60 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
1ef70 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
1ef80 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
1ef90 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
1efa0 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
1efb0 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
1efc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
1efd0 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
1efe0 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
1eff0 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
1f000 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62  .** pCur might b
1f010 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65  e pointing to te
1f020 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  xt obtained from
1f030 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
1f040 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20  ase file..** So 
1f050 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e  the content cann
1f060 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20  ot be trusted.  
1f070 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  Do appropriate c
1f080 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e  hecks on the con
1f090 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tent..*/.int sql
1f0a0 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
1f0b0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74  (sqlite3 *db, Bt
1f0c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
1f0d0 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
1f0e0 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
1f0f0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
1f100 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
1f110 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
1f120 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
1f130 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
1f140 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
1f150 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
1f160 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
1f170 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
1f180 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
1f190 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73  ..  /* Get the s
1f1a0 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ize of the index
1f1b0 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e   entry.  Only in
1f1c0 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66  dices entries of
1f1d0 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
1f1e0 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74  2GiB are support
1f1f0 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67   - anything larg
1f200 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61  e must be databa
1f210 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
1f220 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69   ** Any corrupti
1f230 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69  on is detected i
1f240 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  n sqlite3BtreePa
1f250 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68  rseCellPtr(), th
1f260 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68  ough, so.  ** th
1f270 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65  is code can safe
1f280 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e  ly assume that n
1f290 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69  CellKey is 32-bi
1f2a0 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ts  .  */.  asse
1f2b0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1f2c0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
1f2d0 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c  ur) );.  VVA_ONL
1f2e0 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42  Y(rc =) sqlite3B
1f2f0 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
1f300 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
1f310 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1f320 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20  TE_OK );     /* 
1f330 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76  pCur is always v
1f340 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20  alid so KeySize 
1f350 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20  cannot fail */. 
1f360 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b   assert( (nCellK
1f370 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ey & SQLITE_MAX_
1f380 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c  U32)==(u64)nCell
1f390 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  Key );..  /* Rea
1f3a0 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74  d in the complet
1f3b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1f3c0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a   index entry */.
1f3d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1f3e0 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b  Init(&m, db, 0);
1f3f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
1f400 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
1f410 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  pCur, 0, (u32)nC
1f420 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
1f430 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f440 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1f450 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
1f460 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
1f470 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
1f480 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
1f490 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
1f4a0 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
1f4b0 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
1f4c0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1f4d0 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
1f4e0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
1f4f0 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48  dr<3 || (int)szH
1f500 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  dr>m.n) ){.    g
1f510 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
1f520 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
1f530 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
1f540 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
1f550 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
1f560 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
1f570 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
1f580 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
1f590 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
1f5a0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
1f5b0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
1f5c0 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
1f5d0 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
1f5e0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1f5f0 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
1f600 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1f610 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
1f620 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
1f630 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1f640 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
1f650 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1f660 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
1f670 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1f680 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
1f690 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
1f6a0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1f6b0 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
1f6c0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
1f6d0 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
1f6e0 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
1f6f0 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
1f700 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
1f710 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
1f720 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
1f730 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1f740 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
1f750 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
1f760 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
1f770 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
1f780 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
1f790 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
1f7a0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
1f7b0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
1f7c0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
1f7d0 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
1f7e0 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
1f7f0 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
1f800 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1f810 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
1f820 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
1f830 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
1f840 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
1f850 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
1f860 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
1f870 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1f880 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
1f890 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
1f8a0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
1f8b0 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
1f8c0 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
1f8d0 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
1f8e0 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
1f8f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f900 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
1f910 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
1f920 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73  .  testcase( m.s
1f930 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
1f940 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1f950 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
1f960 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f970 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
1f980 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
1f990 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
1f9a0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
1f9b0 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
1f9c0 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
1f9d0 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
1f9e0 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
1f9f0 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
1fa00 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
1fa10 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
1fa20 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1fa30 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
1fa40 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
1fa50 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
1fa60 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
1fa70 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1fa80 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
1fa90 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
1faa0 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
1fab0 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
1fac0 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
1fad0 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
1fae0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
1faf0 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
1fb00 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1fb10 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
1fb20 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
1fb30 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
1fb40 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
1fb50 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
1fb60 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
1fb70 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
1fb80 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
1fb90 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
1fba0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1fbb0 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
1fbc0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1fbf0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1fc00 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
1fc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
1fc30 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
1fc40 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
1fc50 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
1fc60 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61  d,       /* Unpa
1fc70 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cked version of 
1fc80 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  key */.  int *re
1fc90 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1fca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1fcb0 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
1fcc0 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
1fcd0 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
1fce0 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
1fcf0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
1fd00 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  ur = pC->pCursor
1fd10 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73  ;.  Mem m;..  as
1fd20 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1fd30 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
1fd40 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f  pCur) );.  VVA_O
1fd50 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65  NLY(rc =) sqlite
1fd60 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
1fd70 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
1fd80 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1fd90 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a  LITE_OK );    /*
1fda0 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
1fdb0 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
1fdc0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
1fdd0 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
1fde0 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
1fdf0 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
1fe00 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
1fe10 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68   the way.  ** th
1fe20 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
1fe30 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
1fe40 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
1fe50 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
1fe60 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
1fe70 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
1fe80 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
1fe90 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
1fea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1feb0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1fec0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
1fed0 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
1fee0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1fef0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
1ff00 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
1ff10 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
1ff20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
1ff30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1ff40 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20  c;.  }.  *res = 
1ff50 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1ff60 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e  dCompare(m.n, m.
1ff70 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  z, pUnpacked);. 
1ff80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1ff90 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
1ffa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ffb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1ffc0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
1ffd0 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
1ffe0 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
1fff0 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
20000 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
20010 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20020 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
20030 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
20040 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
20050 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
20060 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
20070 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
20080 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
20090 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
200a0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
200b0 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
200c0 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
200d0 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
200e0 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
200f0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
20100 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
20110 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
20120 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
20130 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
20140 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
20150 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
20160 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
20170 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
20180 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
20190 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
201a0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
201b0 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
201c0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
201d0 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
201e0 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
201f0 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
20200 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
20210 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
20220 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
20230 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
20240 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
20250 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
20260 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
20270 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
20280 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
20290 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
202a0 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
202b0 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
202c0 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
202d0 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
202e0 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
202f0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
20300 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
20310 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
20320 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
20330 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
20340 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
20350 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
20360 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
20370 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
20380 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
20390 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
203a0 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
203b0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
203c0 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
203d0 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
203e0 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
203f0 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >db;.}../*.** Re
20400 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
20410 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
20420 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
20430 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
20440 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
20450 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
20460 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
20470 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
20480 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
20490 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
204a0 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
204b0 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
204c0 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
204d0 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
204e0 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
204f0 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
20500 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
20510 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
20520 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
20530 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
20540 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
20550 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
20560 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
20570 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
20580 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  dValue(Vdbe *v, 
20590 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
205a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
205b0 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
205c0 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
205d0 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
205e0 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  1];.    if( 0==(
205f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
20600 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20  M_Null) ){.     
20610 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
20620 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61  pRet = sqlite3Va
20630 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20  lueNew(v->db);. 
20640 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b       if( pRet ){
20650 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20660 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d  VdbeMemCopy((Mem
20670 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a   *)pRet, pMem);.
20680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
20690 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
206a0 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c  y(pRet, aff, SQL
206b0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
206c0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
206d0 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pRet;.    }.  }.
206e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
206f0 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53  *.** Configure S
20700 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72  QL variable iVar
20710 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67   so that binding
20720 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20   a new value to 
20730 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f  it signals.** to
20740 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d   sqlite3_reoptim
20750 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72  ize() that re-pr
20760 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74  eparing the stat
20770 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74  ement may result
20780 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20  .** in a better 
20790 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76  query plan..*/.v
207a0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
207b0 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a  etVarmask(Vdbe *
207c0 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20  v, int iVar){.  
207d0 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
207e0 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20  ;.  if( iVar>32 
207f0 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
20800 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  k = 0xffffffff;.
20810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e    }else{.    v->
20820 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32  expmask |= ((u32
20830 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b  )1 << (iVar-1));
20840 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
20850 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
20860 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54  UALTABLE./*.** T
20870 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65  ransfer error me
20880 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20  ssage text from 
20890 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  an sqlite3_vtab.
208a0 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
208b0 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
208c0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
208d0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
208e0 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72  into a Vdbe.zErr
208f0 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
20900 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
20910 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
20920 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f  te3DbMalloc)..*/
20930 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
20940 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64  bImportErrmsg(Vd
20950 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  be *p, sqlite3_v
20960 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73  tab *pVtab){.  s
20970 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
20980 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  db;.  sqlite3DbF
20990 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
209a0 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
209b0 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  g = sqlite3DbStr
209c0 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a  Dup(db, pVtab->z
209d0 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
209e0 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
209f0 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
20a00 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d  ->zErrMsg = 0;.}
20a10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
20a20 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
20a30 42 4c 45 20 2a 2f 0a                             BLE */.