/ Hex Artifact Content
Login

Artifact 65d2516652fa8d171085a2ae4a04f76545c633c1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   );.  return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
0420: 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  r the SQL string
0430: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 20   for a prepared 
0440: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
0450: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
0460: 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f  tSql(Vdbe *p, co
0470: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
0480: 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70 61 72   n, int isPrepar
0490: 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74 28 20  eV2){.  assert( 
04a0: 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31 20 7c  isPrepareV2==1 |
04b0: 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 30  | isPrepareV2==0
04c0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
04d0: 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64 65 66   return;.#if def
04e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
04f0: 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
0500: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
0510: 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66 28 20  E_SQLLOG).  if( 
0520: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0530: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0540: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0550: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0560: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0570: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0580: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0590: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
05a0: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
05b0: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
05c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
05f0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
0600: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
0610: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0620: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0630: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0640: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0650: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0660: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0670: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0680: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0690: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06a0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06b0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06c0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
06d0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
06e0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
06f0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
0700: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
0710: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0720: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0730: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0740: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0750: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0760: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0770: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0780: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0790: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
07a0: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
07b0: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
07c0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
07d0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
07e0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f  sPrepareV2;.}../
07f0: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0800: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0810: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
0820: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e  least nOp elemen
0830: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68  ts larger .** th
0840: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  an its current s
0850: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72  ize. nOp is guar
0860: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73  anteed to be les
0870: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
0880: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f  ** to 1024/sizeo
0890: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f(Op)..**.** If 
08a0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
08b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
08c0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
08d0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a   array, return.*
08e0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  * SQLITE_NOMEM. 
08f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62  In this case Vdb
0900: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e  e.aOp and Parse.
0910: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0920: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0930: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0940: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0950: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0960: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0970: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0980: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0990: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
09a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
09b0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
09c0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
09d0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
09e0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
09f0: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0a00: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0a10: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0a20: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0a30: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0a40: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0a50: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0a60: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0a70: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0a80: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0a90: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0aa0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
0ab0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0ac0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
0ad0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
0ae0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
0af0: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
0b00: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
0b10: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
0b20: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
0b30: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
0b40: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
0b50: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
0b60: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
0b70: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
0b80: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0b90: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
0ba0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
0bb0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
0bc0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
0bd0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
0be0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
0bf0: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
0c00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
0c10: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
0c20: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e   int nNew = (p->
0c30: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
0c40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0c50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0c60: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
0c70: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0c80: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? p->nOpAlloc*
0c90: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
0ca0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
0cb0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0cc0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
0cd0: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30  assert( nOp<=(10
0ce0: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29  24/sizeof(Op)) )
0cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
0d00: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e  >=(p->nOpAlloc+n
0d10: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op) );.  pNew = 
0d20: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0d30: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20  (p->db, v->aOp, 
0d40: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0d50: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0d60: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
0d70: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0d80: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65  cSize(p->db, pNe
0d90: 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20  w)/sizeof(Op);. 
0da0: 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77     v->aOp = pNew
0db0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
0dc0: 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  pNew ? SQLITE_OK
0dd0: 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   : SQLITE_NOMEM)
0de0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
0df0: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
0e00: 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74   routine is just
0e10: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
0e20: 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
0e30: 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c  akpoint that wil
0e40: 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20  l.** fire after 
0e50: 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69  each opcode is i
0e60: 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70  nserted and disp
0e70: 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22  layed using.** "
0e80: 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f  PRAGMA vdbe_addo
0e90: 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73  ptrace=on"..*/.s
0ea0: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
0eb0: 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74  addop_breakpoint
0ec0: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
0ed0: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b   int n = 0;.  n+
0ee0: 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  +;.}.#endif../*.
0ef0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73  ** Add a new ins
0f00: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
0f10: 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74  list of instruct
0f20: 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20  ions current in 
0f30: 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65  the.** VDBE.  Re
0f40: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
0f50: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
0f60: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50  ruction..**.** P
0f70: 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a  arameters:.**.**
0f80: 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20      p           
0f90: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74      Pointer to t
0fa0: 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20  he VDBE.**.**   
0fb0: 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20   op             
0fc0: 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   The opcode for 
0fd0: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
0fe0: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32  .**.**    p1, p2
0ff0: 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e  , p3      Operan
1000: 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  ds.**.** Use the
1010: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1020: 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74  lveLabel() funct
1030: 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64  ion to fix an ad
1040: 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65  dress and.** the
1050: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1060: 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20  geP4() function 
1070: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  to change the va
1080: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a  lue of the P4.**
1090: 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74   operand..*/.int
10a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10b0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
10c0: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
10d0: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69  p2, int p3){.  i
10e0: 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a  nt i;.  VdbeOp *
10f0: 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e  pOp;..  i = p->n
1100: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  Op;.  assert( p-
1110: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
1120: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
1130: 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c  ert( op>0 && op<
1140: 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d  0xff );.  if( p-
1150: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
1160: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20  c<=i ){.    if( 
1170: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31  growOpArray(p, 1
1180: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1190: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
11a0: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70   p->nOp++;.  pOp
11b0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
11c0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28   pOp->opcode = (
11d0: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35  u8)op;.  pOp->p5
11e0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
11f0: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
1200: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
1210: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
1220: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
1230: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
1240: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
1250: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
1260: 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e  COMMENTS.  pOp->
1270: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
1280: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1290: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
12a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
12b0: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
12c0: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ace ){.    int j
12d0: 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65  j, kk;.    Parse
12e0: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
12f0: 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a  arse;.    for(jj
1300: 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45  =kk=0; jj<SQLITE
1310: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b  _N_COLCACHE; jj+
1320: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1330: 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20   yColCache *x = 
1340: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1350: 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66  e + jj;.      if
1360: 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72  ( x->iLevel>pPar
1370: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
1380: 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20  || x->iReg==0 ) 
1390: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13a0: 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b  printf(" r[%d]={
13b0: 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67  %d:%d}", x->iReg
13c0: 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e  , x->iTable, x->
13d0: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
13e0: 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kk++;.    }.    
13f0: 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28  if( kk ) printf(
1400: 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  "\n");.    sqlit
1410: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1420: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
1430: 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f  .    test_addop_
1440: 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20  breakpoint();.  
1450: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1460: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70  VDBE_PROFILE.  p
1470: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  Op->cycles = 0;.
1480: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a    pOp->cnt = 0;.
1490: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
14a0: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
14b0: 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69  GE.  pOp->iSrcLi
14c0: 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ne = 0;.#endif. 
14d0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74   return i;.}.int
14e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f0: 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p0(Vdbe *p, int 
1500: 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  op){.  return sq
1510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1520: 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b  p, op, 0, 0, 0);
1530: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1540: 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70  beAddOp1(Vdbe *p
1550: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
1560: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1570: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1580: 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a   op, p1, 0, 0);.
1590: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
15a0: 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c  eAddOp2(Vdbe *p,
15b0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
15c0: 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75   int p2){.  retu
15d0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
15e0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
15f0: 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  p2, 0);.}.../*.*
1600: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1610: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1620: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1630: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1650: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
1660: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1670: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1680: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1690: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
16a0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
16b0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16d0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
16e0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
16f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1700: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1710: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1720: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1730: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1740: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
1750: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
1760: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1770: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
1780: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
1790: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
17a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
17b0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
17c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
17d0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
17e0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
17f0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1800: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
1810: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
1820: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
1830: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
1840: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
1850: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
1860: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
1870: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
1880: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
1890: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
18a0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
18b0: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
18c0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
18d0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
18e0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
18f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1900: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
1910: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
1920: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
1930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1940: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
1950: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
1960: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
1970: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
1980: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1990: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
19a0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
19b0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
19c0: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
19d0: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
19e0: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
19f0: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
1a00: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
1a10: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
1a20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
1a30: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
1a40: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
1a50: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
1a60: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1a70: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1a80: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1a90: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1aa0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1ab0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1ae0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1b00: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1b10: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1b20: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1b30: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b50: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1b60: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
1b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b80: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
1b90: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1ba0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1bc0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1bd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1be0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1bf0: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
1c00: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
1c10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1c20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1c30: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
1c40: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
1c50: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
1c60: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
1c70: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
1c80: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
1c90: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1ca0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1cb0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1cc0: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
1cd0: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
1ce0: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
1cf0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
1d00: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
1d10: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
1d20: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1d30: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1d40: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1d50: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1d60: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1d70: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1d80: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
1d90: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
1da0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
1db0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
1dc0: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
1dd0: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
1de0: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
1df0: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
1e00: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
1e10: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
1e20: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1e30: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1e40: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1e50: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1e60: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1e70: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1e80: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
1e90: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
1ea0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
1eb0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
1ec0: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
1ed0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
1ee0: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
1ef0: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
1f00: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1f10: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
1f20: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
1f30: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1f40: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1f50: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1f60: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
1fa0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
1fb0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
1fc0: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1fd0: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
1fe0: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
1ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
2000: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
2010: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
2020: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2030: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
2040: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
2050: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
2060: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
2070: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
2080: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
2090: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20a0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
20b0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
20c0: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
20d0: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
20e0: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
20f0: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
2100: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
2110: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2120: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
2130: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69  p->nLabel );.  i
2140: 66 28 20 41 4c 57 41 59 53 28 6a 3e 3d 30 29 20  f( ALWAYS(j>=0) 
2150: 26 26 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  && p->aLabel ){.
2160: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
2170: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20   = v->nOp;.  }. 
2180: 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76   p->iFixedOp = v
2190: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a  ->nOp - 1;.}../*
21a0: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
21b0: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
21c0: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
21d0: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
21e0: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
21f0: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
2200: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
2210: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 1;.}..#ifdef
2220: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
2230: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2240: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
2250: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
2260: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
2270: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
2280: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2290: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
22a0: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
22b0: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
22c0: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
22d0: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
22e0: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
22f0: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
2300: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
2310: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
2320: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2330: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
2340: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
2350: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
2360: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
2370: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
2380: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
23b0: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
23c0: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
23d0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
23e0: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
23f0: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
2400: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
2410: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
2420: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
2430: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
2440: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2450: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
2460: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
2470: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
2480: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
2490: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
24a0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
24b0: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
24c0: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
24d0: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
24e0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
24f0: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
2500: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
2510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2520: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2530: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
2540: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
2550: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2560: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
2570: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
2580: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
25b0: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
25c0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
25d0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
25e0: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
25f0: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
2600: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
2610: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
2620: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
2630: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
2640: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
2650: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
2660: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
2670: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
2680: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
2690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26a0: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
26b0: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
26c0: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
26d0: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
26e0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
26f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
2700: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
2710: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
2720: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
2730: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
2740: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
2750: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
2760: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
2770: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
2780: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
2790: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
27a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
27b0: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
27c0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
27d0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
27e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
27f0: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
2800: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
2810: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
2820: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
2830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2840: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
2850: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
2860: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
2870: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
2880: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
2890: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
28a0: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
28b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
28c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
28d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
28e0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
28f0: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
2900: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
2910: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2920: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
2930: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
2940: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
2950: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
2960: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
2970: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
2980: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
2990: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
29a0: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
29b0: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
29c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
29d0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
29e0: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
29f0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
2a00: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
2a10: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
2a20: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
2a30: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
2a40: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
2a50: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
2a60: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2a70: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
2a80: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
2a90: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
2aa0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2ab0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
2ac0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
2ad0: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
2ae0: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
2af0: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
2b00: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
2b10: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
2b20: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2b30: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
2b40: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b  **.** Then check
2b50: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
2b60: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72  of Parse.mayAbor
2b70: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a  t is true if an.
2b80: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20  ** ABORT may be 
2b90: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65  thrown, or false
2ba0: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75   otherwise. Retu
2bb0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  rn true if it do
2bc0: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20  es.** match, or 
2bd0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2be0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2bf0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
2c00: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74   used as.** part
2c10: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74   of an assert st
2c20: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63  atement in the c
2c30: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72  ompiler. Similar
2c40: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73   to:.**.**   ass
2c50: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
2c60: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70  AssertMayAbort(p
2c70: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
2c80: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20  arse->mayAbort) 
2c90: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
2ca0: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
2cb0: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ort(Vdbe *v, int
2cc0: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e   mayAbort){.  in
2cd0: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a  t hasAbort = 0;.
2ce0: 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74    int hasFkCount
2cf0: 65 72 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  er = 0;.  Op *pO
2d00: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
2d10: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
2d20: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
2d30: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
2d40: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
2d50: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
2d60: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
2d70: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
2d80: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
2d90: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
2da0: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
2db0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2dc0: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
2dd0: 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20  P_VRename .     
2de0: 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f  || ((opcode==OP_
2df0: 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  Halt || opcode==
2e00: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a  OP_HaltIfNull) .
2e10: 20 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e        && ((pOp->
2e20: 70 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  p1&0xff)==SQLITE
2e30: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
2e40: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p2==OE_Abort
2e50: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
2e60: 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20  hasAbort = 1;.  
2e70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2e80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e90: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2ea0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
2eb0: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26  =OP_FkCounter &&
2ec0: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70   pOp->p1==0 && p
2ed0: 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20  Op->p2==1 ){.   
2ee0: 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20     hasFkCounter 
2ef0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
2f00: 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  f.  }.  sqlite3D
2f10: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
2f20: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a  er.apSub);..  /*
2f30: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2f40: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
2f50: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c  rt. Or if a mall
2f60: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
2f70: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
2f80: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
2f90: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
2fa0: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
2fb0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
2fc0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
2fd0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
2fe0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
2ff0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
3000: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
3010: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
3020: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
3030: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
3040: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
3050: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
3060: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
3070: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
3080: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
3090: 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e  ort || hasFkCoun
30a0: 74 65 72 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ter );.}.#endif 
30b0: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
30c0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
30d0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
30e0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
30f0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
3100: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
3110: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
3120: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
3130: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
3140: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
3150: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
3160: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
3170: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
3180: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
3190: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
31a0: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
31b0: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
31c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
31d0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
31e0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
31f0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
3200: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
3210: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
3220: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
3230: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
3240: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
3250: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
3260: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
3270: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
3280: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
3290: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
32a0: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
32b0: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
32c0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  rg[] array..**.*
32d0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73  * The Op.opflags
32e0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e   field is set on
32f0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f   all opcodes..*/
3300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
3310: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
3320: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
3330: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
3340: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
3350: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
3360: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
3370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
3380: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  p->pParse;.  int
3390: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73   *aLabel = pPars
33a0: 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  e->aLabel;.  p->
33b0: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
33c0: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30  p->bIsReader = 0
33d0: 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61  ;.  for(pOp=p->a
33e0: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
33f0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
3400: 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65  ){.    u8 opcode
3410: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
3420: 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65  .    /* NOTE: Be
3430: 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65 20   sure to update 
3440: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 77 68  mkopcodeh.awk wh
3450: 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d  en adding or rem
3460: 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73  oving.    ** cas
3470: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69  es from this swi
3480: 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77 69 74  tch! */.    swit
3490: 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20  ch( opcode ){.  
34a0: 20 20 20 20 63 61 73 65 20 4f 50 5f 46 75 6e 63      case OP_Func
34b0: 74 69 6f 6e 3a 0a 20 20 20 20 20 20 63 61 73 65  tion:.      case
34c0: 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20   OP_AggStep: {. 
34d0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
34e0: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p5>nMaxArgs ) nM
34f0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35  axArgs = pOp->p5
3500: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3520: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
3530: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  on: {.        if
3540: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
3550: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
3560: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
3570: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  thru */.      }.
3580: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75        case OP_Au
3590: 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20  toCommit:.      
35a0: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
35b0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  t: {.        p->
35c0: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
35d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
35e0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
35f0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
3600: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
3610: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
3620: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
3630: 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  uum:.      case 
3640: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20  OP_JournalMode: 
3650: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61  {.        p->rea
3660: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
3670: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
3680: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3690: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
36a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36b0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
36c0: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61     case OP_VUpda
36d0: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  te: {.        if
36e0: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
36f0: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
3700: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
3710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3720: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46        case OP_VF
3730: 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20  ilter: {.       
3740: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
3750: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
3760: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
3770: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
3780: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
3790: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
37a0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
37b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  .        if( n>n
37c0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
37d0: 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  gs = n;.        
37e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
37f0: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
3800: 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20   OP_Next:.      
3810: 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70  case OP_NextIfOp
3820: 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  en:.      case O
3830: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
3840: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
3850: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3860: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
3870: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3880: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
3890: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
38a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
38b0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
38c0: 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70  case OP_PrevIfOp
38d0: 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  en: {.        pO
38e0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
38f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
3900: 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70  vious;.        p
3910: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3920: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
3930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3940: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e      }..    pOp->
3950: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  opflags = sqlite
3960: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
3970: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28  opcode];.    if(
3980: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
3990: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
39a0: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
39b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31        assert( -1
39c0: 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73 65 2d  -pOp->p2<pParse-
39d0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
39e0: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
39f0: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
3a00: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
3a10: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
3a20: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b  pParse->aLabel);
3a30: 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  .  pParse->aLabe
3a40: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  l = 0;.  pParse-
3a50: 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >nLabel = 0;.  *
3a60: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
3a70: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
3a80: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
3a90: 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a  =0 || DbMaskAllZ
3aa0: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
3ab0: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ) );.}../*.** Re
3ac0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
3ad0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3ae0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
3af0: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
3b00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3b10: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
3b20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3b30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3b40: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
3b50: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
3b60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3b70: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
3b80: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
3b90: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69  f opcodes associ
3ba0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
3bb0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
3bc0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
3bd0: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  nt. It is the ca
3be0: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
3bf0: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e  lity.** to arran
3c00: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ge for the retur
3c10: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20  ned array to be 
3c20: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
3c30: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76   using the .** v
3c40: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29  dbeFreeOpArray()
3c50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
3c60: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
3c70: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20  g, *pnOp is set 
3c80: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
3c90: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
3ca0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61  returned.** arra
3cb0: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41  y. Also, *pnMaxA
3cc0: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  rg is set to the
3cd0: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63   larger of its c
3ce0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
3cf0: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20   .** the number 
3d00: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
3d10: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
3d20: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f  rray required to
3d30: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a   execute the .**
3d40: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61   returned progra
3d50: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  m..*/.VdbeOp *sq
3d60: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41  lite3VdbeTakeOpA
3d70: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
3d80: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e  t *pnOp, int *pn
3d90: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f  MaxArg){.  VdbeO
3da0: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
3db0: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26  .  assert( aOp &
3dc0: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  & !p->db->malloc
3dd0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20  Failed );..  /* 
3de0: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74  Check that sqlit
3df0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
3e00: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
3e10: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   on this VM */. 
3e20: 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41   assert( DbMaskA
3e30: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
3e40: 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ask) );..  resol
3e50: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e  veP2Values(p, pn
3e60: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70  MaxArg);.  *pnOp
3e70: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
3e80: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  aOp = 0;.  retur
3e90: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aOp;.}../*.** 
3ea0: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
3eb0: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
3ec0: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
3ed0: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74  stack.  Return t
3ee0: 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  he.** address of
3ef0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
3f00: 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69  tion added..*/.i
3f10: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
3f20: 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c  dOpList(Vdbe *p,
3f30: 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70   int nOp, VdbeOp
3f40: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c  List const *aOp,
3f50: 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20   int iLineno){. 
3f60: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
3f70: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
3f80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
3f90: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
3fa0: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65   nOp > p->pParse
3fb0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
3fc0: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70  owOpArray(p, nOp
3fd0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3fe0: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
3ff0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c  p->nOp;.  if( AL
4000: 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20  WAYS(nOp>0) ){. 
4010: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
4020: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
4030: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
4040: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
4050: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
4060: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
4070: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
4080: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
4090: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
40a0: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
40b0: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
40c0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
40d0: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p1;.      if( 
40e0: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p2<0 ){.        
40f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
4100: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
4110: 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  ut->opcode] & OP
4120: 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20  FLG_JUMP );.    
4130: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
4140: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a  ddr + ADDR(p2);.
4150: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4160: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
4170: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
4180: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
4190: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
41a0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
41b0: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75  TUSED;.      pOu
41c0: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
41d0: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
41e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
41f0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
4200: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70 4f 75  MMENTS.      pOu
4210: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
4220: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4230: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
4240: 41 47 45 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  AGE.      pOut->
4250: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
4260: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20  no+i;.#else.    
4270: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
4280: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4290: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
42a0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
42b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
42c0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
42d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
42e0: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64  ePrintOp(0, i+ad
42f0: 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  dr, &p->aOp[i+ad
4300: 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  dr]);.      }.#e
4310: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
4320: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
4330: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
4340: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
4350: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
4360: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f  MT_SCANSTATUS)./
4370: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72  *.** Add an entr
4380: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  y to the array o
4390: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67  f counters manag
43a0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74  ed by sqlite3_st
43b0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e  mt_scanstatus().
43c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
43d0: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a  VdbeScanStatus(.
43e0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73    /* VM to add s
4410: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a  canstatus() to *
4420: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c  /.  int addrExpl
4430: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
4440: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4450: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72  f OP_Explain (or
4460: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64   0) */.  int add
4470: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  rLoop,          
4480: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
4490: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e  ess of loop coun
44a0: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64  ter */ .  int ad
44b0: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20  drVisit,        
44c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
44d0: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73  ress of rows vis
44e0: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ited counter */.
44f0: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20    LogEst nEst,  
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
4520: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
4530: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rows */.  const 
4540: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
4550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
4560: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e  e of table or in
4570: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  dex being scanne
4580: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  d */.){.  int nB
4590: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b  yte = (p->nScan+
45a0: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e  1) * sizeof(Scan
45b0: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53  Status);.  ScanS
45c0: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61  tatus *aNew;.  a
45d0: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75  New = (ScanStatu
45e0: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c  s*)sqlite3DbReal
45f0: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53  loc(p->db, p->aS
4600: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  can, nByte);.  i
4610: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53  f( aNew ){.    S
4620: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20  canStatus *pNew 
4630: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e  = &aNew[p->nScan
4640: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ++];.    pNew->a
4650: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64  ddrExplain = add
4660: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e  rExplain;.    pN
4670: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61  ew->addrLoop = a
4680: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65  ddrLoop;.    pNe
4690: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61  w->addrVisit = a
46a0: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e  ddrVisit;.    pN
46b0: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b  ew->nEst = nEst;
46c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  .    pNew->zName
46d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
46e0: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  up(p->db, zName)
46f0: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d  ;.    p->aScan =
4700: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   aNew;.  }.}.#en
4710: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
4720: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
4730: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
4740: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
4750: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
4760: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4770: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
4780: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
4790: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
47a0: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
47b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
47c0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
47d0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
47e0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
47f0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
4800: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4810: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
4820: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
4830: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
4840: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
4850: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
4860: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4870: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
4880: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4890: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
48a0: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
48b0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
48c0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
48d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
48e0: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
48f0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
4900: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
4910: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4920: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
4930: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
4940: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4950: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4960: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4970: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4980: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
4990: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
49a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
49b0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
49c0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
49d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
49e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
49f0: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
4a00: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
4a10: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4a20: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
4a30: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
4a40: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
4a50: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
4a60: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4a70: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
4a80: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
4a90: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
4aa0: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
4ab0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4ac0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
4ad0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
4ae0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
4af0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
4b00: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4b10: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
4b20: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
4b30: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
4b40: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4b50: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4b60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
4b70: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
4b80: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
4b90: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
4ba0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
4bb0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
4bc0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
4bd0: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
4be0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
4bf0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4c00: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
4c10: 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69  ;.  p->pParse->i
4c20: 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70  FixedOp = p->nOp
4c30: 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   - 1;.}.../*.** 
4c40: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
4c50: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
4c60: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
4c70: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
4c80: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
4c90: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
4ca0: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
4cb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4cc0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
4cd0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
4ce0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
4cf0: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
4d00: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66  Def) && (pDef->f
4d10: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
4d20: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
4d30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
4d40: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
4d50: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
4d60: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
4d70: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
4d80: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
4d90: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
4da0: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
4db0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4dc0: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
4dd0: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
4de0: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
4df0: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65  ( p4 ){.    asse
4e00: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77  rt( db );.    sw
4e10: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
4e20: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45        case P4_RE
4e30: 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  AL:.      case P
4e40: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63  4_INT64:.      c
4e50: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
4e60: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
4e70: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
4e80: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4e90: 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20  db, p4);.       
4ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4eb0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
4ec0: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 20  YINFO: {.       
4ed0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4ee0: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4ef0: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28  e3KeyInfoUnref((
4f00: 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20  KeyInfo*)p4);.  
4f10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4f20: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4f30: 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20  P4_MPRINTF: {.  
4f40: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4f50: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4f60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29  sqlite3_free(p4)
4f70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4f80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4f90: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
4fa0: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  {.        freeEp
4fb0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4fc0: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34  db, (FuncDef*)p4
4fd0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4fe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4ff0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
5000: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
5010: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
5020: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
5030: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
5040: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
5050: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5060: 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a  .          Mem *
5070: 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20  p = (Mem*)p4;.  
5080: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73          if( p->s
5090: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
50a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
50b0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
50c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
50d0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
50e0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
50f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5100: 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b  case P4_VTAB : {
5110: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
5120: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
5130: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e   ) sqlite3VtabUn
5140: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70  lock((VTable *)p
5150: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5160: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5170: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
5180: 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  ee the space all
5190: 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61  ocated for aOp a
51a0: 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73  nd any p4 values
51b0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
51c0: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f  he.** opcodes co
51d0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20  ntained within. 
51e0: 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55  If aOp is not NU
51f0: 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  LL it is assumed
5200: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20   to contain .** 
5210: 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f  nOp entries. .*/
5220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
5230: 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c  eFreeOpArray(sql
5240: 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f  ite3 *db, Op *aO
5250: 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69  p, int nOp){.  i
5260: 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70  f( aOp ){.    Op
5270: 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70   *pOp;.    for(p
5280: 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70  Op=aOp; pOp<&aOp
5290: 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20  [nOp]; pOp++){. 
52a0: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
52b0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
52c0: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
52d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
52e0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
52f0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5300: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ee(db, pOp->zCom
5310: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
5320: 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73    .    }.  }.  s
5330: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5340: 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   aOp);.}../*.** 
5350: 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67  Link the SubProg
5360: 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ram object passe
5370: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
5380: 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68  argument into th
5390: 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74  e linked.** list
53a0: 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f   at Vdbe.pSubPro
53b0: 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20  gram. This list 
53c0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74  is used to delet
53d0: 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61  e all sub-progra
53e0: 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65  m.** objects whe
53f0: 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c  n the VM is no l
5400: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
5410: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5420: 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61  dbeLinkSubProgra
5430: 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  m(Vdbe *pVdbe, S
5440: 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20  ubProgram *p){. 
5450: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62   p->pNext = pVdb
5460: 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70  e->pProgram;.  p
5470: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d  Vdbe->pProgram =
5480: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   p;.}../*.** Cha
5490: 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61  nge the opcode a
54a0: 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e  t addr into OP_N
54b0: 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  oop.*/.void sqli
54c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
54d0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
54e0: 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 61 64   addr){.  if( ad
54f0: 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  dr<p->nOp ){.   
5500: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
5510: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
5520: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5530: 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65 65 50  p->db;.    freeP
5540: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
5550: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
5560: 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30     memset(pOp, 0
5570: 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29  , sizeof(pOp[0])
5580: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f  );.    pOp->opco
5590: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
55a0: 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d 3e 6e    if( addr==p->n
55b0: 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b  Op-1 ) p->nOp--;
55c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
55d0: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65   the last opcode
55e0: 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20   is "op" and it 
55f0: 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65  is not a jump de
5600: 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68  stination,.** th
5610: 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52  en remove it.  R
5620: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
5630: 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63  d only if an opc
5640: 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e  ode was removed.
5650: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
5660: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
5670: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38  code(Vdbe *p, u8
5680: 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e   op){.  if( (p->
5690: 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73  nOp-1)>(p->pPars
56a0: 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20  e->iFixedOp) && 
56b0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
56c0: 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20  .opcode==op ){. 
56d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
56e0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d  angeToNoop(p, p-
56f0: 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65 74  >nOp-1);.    ret
5700: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
5710: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5720: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
5730: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
5740: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f  he P4 operand fo
5750: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
5760: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
5770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5780: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
5790: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
57a0: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
57b0: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
57c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
57d0: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
57e0: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
57f0: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
5800: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
5810: 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68  **.** If n>=0 th
5820: 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  en the P4 operan
5830: 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65  d is dynamic, me
5840: 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70  aning that a cop
5850: 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69  y of.** the stri
5860: 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20  ng is made into 
5870: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
5880: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
5890: 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75  loc()..** A valu
58a0: 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20  e of n==0 means 
58b0: 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50  copy bytes of zP
58c0: 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c  4 up to and incl
58d0: 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72  uding the.** fir
58e0: 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49  st null byte.  I
58f0: 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20  f n>0 then copy 
5900: 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34  n+1 bytes of zP4
5910: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
5920: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
5930: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
5940: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
5950: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
5960: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
5970: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
5980: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
5990: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
59a0: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
59b0: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
59c0: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
59d0: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
59e0: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
59f0: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
5a00: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
5a10: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
5a20: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
5a30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5a40: 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62  VdbeChangeP4(Vdb
5a50: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
5a60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
5a70: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
5a80: 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Op;.  sqlite3 *d
5a90: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  b;.  assert( p!=
5aa0: 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  0 );.  db = p->d
5ab0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
5ac0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5ad0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
5ae0: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d  p->aOp==0 || db-
5af0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
5b00: 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56  .    if( n!=P4_V
5b10: 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72 65  TAB ){.      fre
5b20: 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64  eP4(db, n, (void
5b30: 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29  *)*(char**)&zP4)
5b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
5b50: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
5b60: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
5b70: 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e  assert( addr<p->
5b80: 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64  nOp );.  if( add
5b90: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
5ba0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
5bb0: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
5bc0: 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65 72  p[addr];.  asser
5bd0: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
5be0: 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20 20  P4_NOTUSED.     
5bf0: 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65    || pOp->p4type
5c00: 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20 20  ==P4_INT32.     
5c10: 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65    || pOp->p4type
5c20: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a  ==P4_KEYINFO );.
5c30: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
5c40: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
5c50: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  4.p);.  pOp->p4.
5c60: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d  p = 0;.  if( n==
5c70: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
5c80: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
5c90: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
5ca0: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
5cb0: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
5cc0: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
5cd0: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
5ce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
5cf0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
5d00: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
5d10: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
5d20: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
5d30: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
5d40: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
5d50: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
5d60: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5d70: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P4_NOTUSED;.  }
5d80: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
5d90: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4f  EYINFO ){.    pO
5da0: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
5db0: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5dc0: 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e  4type = P4_KEYIN
5dd0: 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FO;.  }else if( 
5de0: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20  n==P4_VTAB ){.  
5df0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5e00: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5e10: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56  p->p4type = P4_V
5e20: 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  TAB;.    sqlite3
5e30: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
5e40: 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73   *)zP4);.    ass
5e50: 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29  ert( ((VTable *)
5e60: 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20  zP4)->db==p->db 
5e70: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
5e80: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 ){.    pOp->p
5e90: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
5ea0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5eb0: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
5ec0: 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )n;.  }else{.   
5ed0: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20   if( n==0 ) n = 
5ee0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5ef0: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
5f00: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
5f10: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
5f20: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
5f30: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
5f40: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  MIC;.  }.}../*.*
5f50: 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20  * Set the P4 on 
5f60: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
5f70: 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74  y added opcode t
5f80: 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f  o the KeyInfo fo
5f90: 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67  r the.** index g
5fa0: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
5fb0: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
5fc0: 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
5fd0: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
5fe0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5ff0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6000: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
6010: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
6020: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
6030: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
6040: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
6050: 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
6060: 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20  Parse, pIdx),.  
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
6090: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
60a0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
60b0: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
60c0: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
60d0: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
60e0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
60f0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
6100: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
6110: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
6120: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
6130: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
6140: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
6150: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
6160: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
6170: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
6180: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
6190: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
61a0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
61b0: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
61c0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
61d0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
61e0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
61f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
6200: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
6210: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
6220: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
6230: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
6240: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
6250: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6260: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
6270: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
6280: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
6290: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
62a0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
62b0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
62c0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
62d0: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
62e0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
62f0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
6300: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
6310: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
6320: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
6330: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
6340: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6350: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
6360: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
6370: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
6380: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
6390: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
63a0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
63b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
63c0: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
63d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
63e0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
63f0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
6400: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
6410: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
6420: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
6430: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
6440: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
6450: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
6460: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
6470: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
6480: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
6490: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
64a0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
64b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
64c0: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
64d0: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
64e0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
64f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
6500: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6510: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
6520: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
6530: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
6540: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
6550: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
6560: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6570: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
6580: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
6590: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
65a0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
65b0: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
65c0: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
65d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
65e0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
65f0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
6600: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
6610: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
6620: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
6630: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
6640: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
6650: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
6660: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
6670: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
6680: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
6690: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
66a0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
66b0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
66c0: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
66d0: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
66e0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
66f0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
6700: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
6710: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
6720: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
6730: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
6740: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
6750: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
6760: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
6770: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6780: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
6790: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
67a0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
67b0: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
67c0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
67d0: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
67e0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
67f0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
6800: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
6810: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
6820: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
6830: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
6840: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
6850: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
6860: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
6870: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
6880: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
6890: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
68a0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
68b0: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
68c0: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
68d0: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
68e0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
68f0: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
6900: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
6910: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
6920: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
6930: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
6940: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
6950: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
6960: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
6970: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
6980: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
6990: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
69a0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
69b0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
69c0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
69d0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
69e0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
69f0: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
6a00: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
6a10: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
6a20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6a30: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
6a40: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
6a50: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
6a60: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
6a70: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
6a80: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
6a90: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
6aa0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
6ab0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
6ac0: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
6ad0: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
6ae0: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
6af0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
6b00: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
6b10: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
6b20: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
6b30: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
6b40: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
6b50: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
6b60: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
6b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
6b80: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
6b90: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
6ba0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
6bb0: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
6bc0: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
6bd0: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
6be0: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
6bf0: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
6c00: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
6c10: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
6c20: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
6c30: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
6c40: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
6c50: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
6c60: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
6c70: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
6c80: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
6c90: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
6ca0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
6cb0: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
6cc0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
6cd0: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
6ce0: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
6cf0: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
6d00: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
6d10: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
6d20: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
6d30: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
6d40: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
6d50: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
6d60: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
6d70: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
6d80: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
6d90: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
6da0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
6db0: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
6dc0: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
6dd0: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
6de0: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
6df0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
6e00: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
6e10: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
6e20: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
6e30: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
6e40: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
6e50: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
6e60: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
6e70: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
6e80: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
6e90: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
6ea0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6eb0: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
6ec0: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
6ed0: 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d  ii, jj;.  zOpNam
6ee0: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  e = sqlite3Opcod
6ef0: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
6f00: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20  e);.  nOpName = 
6f10: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6f20: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zOpName);.  if( 
6f30: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b  zOpName[nOpName+
6f40: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  1] ){.    int se
6f50: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63  enCom = 0;.    c
6f60: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f  har c;.    zSyno
6f70: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b  psis = zOpName +
6f80: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20  = nOpName + 1;. 
6f90: 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20     for(ii=jj=0; 
6fa0: 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63  jj<nTemp-1 && (c
6fb0: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d   = zSynopsis[ii]
6fc0: 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  )!=0; ii++){.   
6fd0: 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b     if( c=='P' ){
6fe0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79  .        c = zSy
6ff0: 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20  nopsis[++ii];.  
7000: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27        if( c=='4'
7010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7020: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7030: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
7040: 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20  j, "%s", zP4);. 
7050: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7060: 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20   c=='X' ){.     
7070: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7080: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7090: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
70a0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
70b0: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f            seenCo
70c0: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  m = 1;.        }
70d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
70e0: 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61  int v1 = transla
70f0: 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20  teP(c, pOp);.   
7100: 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20         int v2;. 
7110: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7120: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
7130: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
7140: 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20  d", v1);.       
7150: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
7160: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
7170: 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20  @P", 2)==0 ){.  
7180: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
7190: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  3;.            j
71a0: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
71b0: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d              v2 =
71d0: 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e   translateP(zSyn
71e0: 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b  opsis[ii], pOp);
71f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7200: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
7210: 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d  is+ii+1,"+1",2)=
7220: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7230: 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20      ii += 2;.   
7240: 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b             v2++;
7250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7260: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
7270: 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  2>1 ){.         
7280: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7290: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
72a0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22  zTemp+jj, "..%d"
72b0: 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20  , v1+v2-1);.    
72c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
72d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
72e0: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
72f0: 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29  ii+1, "..P3", 4)
7300: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ==0 && pOp->p3==
7310: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7320: 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20   ii += 4;.      
7330: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7340: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
7350: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7360: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d  emp+jj);.      }
7370: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54  else{.        zT
7380: 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20  emp[jj++] = c;. 
7390: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
73a0: 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26   if( !seenCom &&
73b0: 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70   jj<nTemp-5 && p
73c0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
73d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
73e0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
73f0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73   zTemp+jj, "; %s
7400: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
7410: 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  );.      jj += s
7420: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7430: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a  Temp+jj);.    }.
7440: 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70      if( jj<nTemp
7450: 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30   ) zTemp[jj] = 0
7460: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f  ;.  }else if( pO
7470: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
7480: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7490: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
74a0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
74b0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d  mment);.    jj =
74c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
74d0: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65  (zTemp);.  }else
74e0: 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d  {.    zTemp[0] =
74f0: 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a   0;.    jj = 0;.
7500: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b    }.  return jj;
7510: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7520: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23  ITE_DEBUG */...#
7530: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7540: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29  TE_OMIT_EXPLAIN)
7550: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45   || !defined(NDE
7560: 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64  BUG) \.     || d
7570: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
7580: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
7590: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
75a0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
75b0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
75c0: 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d  bes the P4 param
75d0: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f  eter for an opco
75e0: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70  de..** Use zTemp
75f0: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65   for any require
7600: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  d temporary buff
7610: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  er space..*/.sta
7620: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61  tic char *displa
7630: 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61  yP4(Op *pOp, cha
7640: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54  r *zTemp, int nT
7650: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  emp){.  char *zP
7660: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73  4 = zTemp;.  ass
7670: 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29  ert( nTemp>=20 )
7680: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d  ;.  switch( pOp-
7690: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63  >p4type ){.    c
76a0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
76b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
76c0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
76d0: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d  *pKeyInfo = pOp-
76e0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
76f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
7700: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
7710: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
7720: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7730: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25  emp, zTemp, "k(%
7740: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
7750: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
7760: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7770: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  (zTemp);.      f
7780: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
7790: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29  fo->nField; j++)
77a0: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
77b0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
77c0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
77d0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
77e0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  r *zColl = pColl
77f0: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
7800: 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20  : "nil";.       
7810: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
7820: 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b  Strlen30(zColl);
7830: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  .        if( n==
7840: 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c  6 && memcmp(zCol
7850: 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30  l,"BINARY",6)==0
7860: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43   ){.          zC
7870: 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20  oll = "B";.     
7880: 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
7890: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
78a0: 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b  ( i+n>nTemp-6 ){
78b0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
78c0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e  y(&zTemp[i],",..
78d0: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  .",4);.         
78e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
78f0: 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  }.        zTemp[
7900: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  i++] = ',';.    
7910: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
7920: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
7930: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65  ){.          zTe
7940: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20  mp[i++] = '-';. 
7950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7960: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
7970: 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a  ], zColl, n+1);.
7980: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a          i += n;.
7990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
79a0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
79b0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
79c0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
79d0: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
79e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
79f0: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
7a00: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
7a10: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
7a20: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
7a30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7a40: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7a50: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
7a60: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
7a70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7a80: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
7a90: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
7aa0: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
7ab0: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
7ac0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7ad0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7ae0: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
7af0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
7b00: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
7b10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7b20: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
7b30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7b40: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7b50: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
7b60: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
7b70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7b80: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
7b90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7ba0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7bb0: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
7bc0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
7bd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7be0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
7bf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7c00: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7c10: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  mp, "%.16g", *pO
7c20: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
7c30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7c40: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
7c50: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
7c60: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
7c70: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
7c80: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7c90: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
7ca0: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
7cb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
7cc0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7cd0: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
7ce0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7cf0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
7d00: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
7d10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7d20: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
7d30: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
7d40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d50: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7d60: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  p, "%.16g", pMem
7d70: 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
7d80: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
7d90: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
7da0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7db0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7dc0: 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29  , zTemp, "NULL")
7dd0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7de0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7df0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
7e00: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
7e10: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
7e20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7e30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
7e40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7e50: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
7e60: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
7e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
7e80: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
7e90: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
7ea0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
7eb0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7ec0: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
7ed0: 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74  :%p", pVtab, pVt
7ee0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20  ab->pModule);.  
7ef0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7f00: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
7f10: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
7f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7f30: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7f40: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29  emp, "intarray")
7f50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7f60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7f70: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
7f80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7f90: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7fa0: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  mp, "program");.
7fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7fc0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41   }.    case P4_A
7fd0: 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20  DVANCE: {.      
7fe0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
7ff0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8000: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
8010: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
8020: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
8030: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
8040: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
8050: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
8060: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
8070: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
8080: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
8090: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
80a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  if../*.** Declar
80b0: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
80c0: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
80d0: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
80e0: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  ] is used..**.**
80f0: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
8100: 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f  atements need to
8110: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65   know in advance
8120: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   the complete se
8130: 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  t of.** attached
8140: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
8150: 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20  will be use.  A 
8160: 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61  mask of these da
8170: 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61  tabases.** is ma
8180: 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62  intained in p->b
8190: 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70  treeMask.  The p
81a0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65  ->lockMask value
81b0: 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f   is the subset o
81c0: 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73  f.** p->btreeMas
81d0: 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74  k of databases t
81e0: 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65  hat will require
81f0: 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64   a lock..*/.void
8200: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
8210: 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69  Btree(Vdbe *p, i
8220: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28  nt i){.  assert(
8230: 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62   i>=0 && i<p->db
8240: 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29  ->nDb && i<(int)
8250: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a  sizeof(yDbMask)*
8260: 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  8 );.  assert( i
8270: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e  <(int)sizeof(p->
8280: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a  btreeMask)*8 );.
8290: 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62    DbMaskSet(p->b
82a0: 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  treeMask, i);.  
82b0: 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69  if( i!=1 && sqli
82c0: 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65  te3BtreeSharable
82d0: 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  (p->db->aDb[i].p
82e0: 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73  Bt) ){.    DbMas
82f0: 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  kSet(p->lockMask
8300: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  , i);.  }.}..#if
8310: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8320: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
8330: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
8340: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
8350: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f   If SQLite is co
8360: 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72  mpiled to suppor
8370: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
8380: 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68  ode and to be th
8390: 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69  readsafe,.** thi
83a0: 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e  s routine obtain
83b0: 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  s the mutex asso
83c0: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
83d0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
83e0: 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20  ure.** that may 
83f0: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
8400: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
8410: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20  an argument. In 
8420: 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f  doing so it also
8430: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53  .** sets the BtS
8440: 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20  hared.db member 
8450: 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42  of each of the B
8460: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
8470: 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20  es, ensuring.** 
8480: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
8490: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
84a0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
84b0: 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  d if required..*
84c0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
84d0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
84e0: 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72   but does suppor
84f0: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
8500: 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c  ode, then.** sql
8510: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
8520: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73   is invoked to s
8530: 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  et the BtShared.
8540: 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  db variables.** 
8550: 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72  of all of BtShar
8560: 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63  ed structures ac
8570: 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65  cessible via the
8580: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
8590: 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20   .** associated 
85a0: 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a  with the VM..**.
85b0: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
85c0: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61  not threadsafe a
85d0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  nd does not supp
85e0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
85f0: 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66   mode, this.** f
8600: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
8610: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d  op..**.** The p-
8620: 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64  >btreeMask field
8630: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
8640: 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74   all btrees that
8650: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a   the prepared .*
8660: 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69  * statement p wi
8670: 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65  ll ever use.  Le
8680: 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65  t N be the numbe
8690: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e  r of bits in p->
86a0: 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72  btreeMask.** cor
86b0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74  responding to bt
86c0: 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68  rees that use sh
86d0: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
86e0: 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66  n the runtime of
86f0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
8700: 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73   is N*N.  But as
8710: 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72   N is rarely mor
8720: 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73  e than 1, this s
8730: 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20  hould not.** be 
8740: 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
8750: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  id sqlite3VdbeEn
8760: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ter(Vdbe *p){.  
8770: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
8780: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
8790: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66  .  int nDb;.  if
87a0: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
87b0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
87c0: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
87d0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
87e0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
87f0: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
8800: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
8810: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
8820: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
8830: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
8840: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
8850: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
8860: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
8870: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
8880: 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ter(aDb[i].pBt);
8890: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
88a0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
88b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
88c0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
88d0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
88e0: 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  >0./*.** Unlock 
88f0: 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65  all of the btree
8900: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  s previously loc
8910: 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  ked by a call to
8920: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
8930: 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r()..*/.void sql
8940: 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64  ite3VdbeLeave(Vd
8950: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
8960: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8970: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
8980: 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61   nDb;.  if( DbMa
8990: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63  skAllZero(p->loc
89a0: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b  kMask) ) return;
89b0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
89c0: 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70  case */.  db = p
89d0: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
89e0: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
89f0: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
8a00: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
8a10: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
8a20: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
8a30: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
8a40: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
8a50: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
8a60: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44  te3BtreeLeave(aD
8a70: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
8a80: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
8a90: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
8aa0: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
8ab0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
8ac0: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
8ad0: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
8ae0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8af0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
8b00: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
8b10: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
8b20: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
8b30: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
8b40: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
8b50: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
8b60: 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d    char zCom[100]
8b70: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
8b80: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
8b90: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
8ba0: 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25   %4d %4d %-13s %
8bb0: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
8bc0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
8bd0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
8be0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
8bf0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
8c00: 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tr));.#ifdef SQL
8c10: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
8c20: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69  IN_COMMENTS.  di
8c30: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
8c40: 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a  , zP4, zCom, siz
8c50: 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73  eof(zCom));.#els
8c60: 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b  e.  zCom[0] = 0;
8c70: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a  .#endif.  /* NB:
8c80: 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63    The sqlite3Opc
8c90: 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69  odeName() functi
8ca0: 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
8cb0: 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65  d by code create
8cc0: 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b  d.  ** by the mk
8cd0: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20  opcodeh.awk and 
8ce0: 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63  mkopcodec.awk sc
8cf0: 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72  ripts which extr
8d00: 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66  act the.  ** inf
8d10: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
8d20: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
8d30: 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74  text */.  fprint
8d40: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
8d50: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
8d60: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
8d70: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
8d80: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
8d90: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
8da0: 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d  ->p5,.      zCom
8db0: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
8dc0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
8dd0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
8de0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
8df0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
8e00: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
8e10: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
8e20: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
8e30: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
8e40: 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20  *pEnd = &p[N];. 
8e50: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
8e60: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d   p->db;.    u8 m
8e70: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64  alloc_failed = d
8e80: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
8e90: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
8ea0: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
8eb0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
8ec0: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
8ed0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8ee0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
8ef0: 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b        }while( (+
8f00: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
8f10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8f20: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73      do{.      as
8f30: 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70  sert( (&p[1])==p
8f40: 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  End || p[0].db==
8f50: 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20  p[1].db );.     
8f60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8f70: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
8f80: 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20  riants(p) );..  
8f90: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
8fa0: 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69  k is really an i
8fb0: 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f  nlined version o
8fc0: 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  f sqlite3VdbeMem
8fd0: 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20  Release().      
8fe0: 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64  ** that takes ad
8ff0: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66  vantage of the f
9000: 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d  act that the mem
9010: 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69  ory cell value i
9020: 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  s .      ** bein
9030: 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66  g set to NULL af
9040: 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e  ter releasing an
9050: 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72  y dynamic resour
9060: 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ces..      **.  
9070: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69      ** The justi
9080: 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  fication for dup
9090: 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73  licating code is
90a0: 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20   that according 
90b0: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  to .      ** cal
90c0: 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75  lgrind, this cau
90d0: 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65  ses a certain te
90e0: 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74  st case to hit t
90f0: 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20  he CPU 4.7 .    
9100: 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73    ** percent les
9110: 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63  s (x86 linux, gc
9120: 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c  c version 4.1.2,
9130: 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20   -O6) than if . 
9140: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d       ** sqlite3M
9150: 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65  emRelease() were
9160: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72   called from her
9170: 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69  e. With -O2, thi
9180: 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a  s jumps.      **
9190: 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e   to 6.6 percent.
91a0: 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69   The test case i
91b0: 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30  s inserting 1000
91c0: 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62   rows into a tab
91d0: 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  le .      ** wit
91e0: 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69  h no indexes usi
91f0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70  ng a single prep
9200: 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74  ared INSERT stat
9210: 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20  ement, bind() . 
9220: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
9230: 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65  t(). Inserts are
9240: 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20   grouped into a 
9250: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
9260: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74     */.      test
9270: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
9280: 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20   MEM_Agg );.    
9290: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
92a0: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
92b0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
92c0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
92d0: 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  _Frame );.      
92e0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
92f0: 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20  gs & MEM_RowSet 
9300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
9310: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
9320: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65  EM_Dyn|MEM_Frame
9330: 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a  |MEM_RowSet) ){.
9340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9350: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
9360: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9370: 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b  ( p->szMalloc ){
9380: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9390: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
93a0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
93b0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  p->szMalloc = 0;
93c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
93d0: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  p->flags = MEM_U
93e0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77  ndefined;.    }w
93f0: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
9400: 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   );.    db->mall
9410: 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
9420: 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a  c_failed;.  }.}.
9430: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
9440: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
9450: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
9460: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
9470: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
9480: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
9490: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
94a0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
94b0: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
94c0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
94d0: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
94e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
94f0: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
9500: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
9510: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
9520: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
9530: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
9540: 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Mem];.  for(i=0;
9550: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
9560: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
9570: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
9580: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
9590: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
95a0: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
95b0: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
95c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
95d0: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
95e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
95f0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
9600: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
9610: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
9620: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
9630: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
9640: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
9650: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
9660: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
9670: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
9680: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
9690: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
96a0: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
96b0: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
96c0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
96d0: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
96e0: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
96f0: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
9700: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
9710: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
9720: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
9730: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
9740: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
9750: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
9760: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
9770: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
9780: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
9790: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
97a0: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
97b0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
97c0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
97d0: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
97e0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
97f0: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
9800: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
9810: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
9820: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
9830: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
9840: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
9850: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
9860: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9880: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
9890: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
98c0: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
98d0: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
98e0: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
98f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9900: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9910: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
9920: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
9930: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
9940: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
9950: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
9960: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
9970: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
99a0: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
99b0: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
99c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
99d0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
99e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
99f0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9a00: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9a30: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
9a40: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9a50: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
9a60: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
9a70: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
9a80: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  em = &p->aMem[1]
9a90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9aa0: 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65   First Mem of re
9ab0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61  sult set */..  a
9ac0: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
9ad0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
9ae0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
9af0: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
9b00: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
9b10: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
9b20: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
9b30: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
9b40: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
9b50: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
9b60: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
9b70: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
9b80: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
9b90: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
9ba0: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
9bb0: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
9bc0: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
9bd0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9be0: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
9bf0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
9c00: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
9c10: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
9c20: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
9c30: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
9c40: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
9c50: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
9c60: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
9c70: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
9c80: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
9c90: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
9ca0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
9cb0: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
9cc0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
9cd0: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
9ce0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9cf0: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
9d00: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
9d10: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
9d20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
9d30: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
9d40: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
9d50: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
9d60: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
9d70: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
9d80: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
9d90: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
9da0: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
9db0: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
9dc0: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
9dd0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
9de0: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
9df0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
9e00: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
9e10: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
9e20: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
9e30: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
9e40: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
9e50: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
9e60: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
9e70: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
9e80: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
9e90: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
9ea0: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
9eb0: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
9ec0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
9ed0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
9ee0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
9ef0: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
9f00: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
9f10: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
9f20: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
9f30: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
9f40: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
9f50: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
9f60: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
9f70: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
9f80: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
9f90: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
9fa0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
9fb0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
9fc0: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
9fd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9fe0: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
9ff0: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
a000: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
a010: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
a020: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
a030: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
a040: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
a050: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
a060: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
a070: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
a080: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
a090: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
a0a0: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
a0b0: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
a0c0: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
a0d0: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
a0e0: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
a0f0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
a100: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
a110: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
a120: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
a130: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
a140: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
a150: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
a160: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
a170: 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70  i<nRow && p->exp
a180: 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f  lain==2 && p->aO
a190: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
a1a0: 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  Explain );.  if(
a1b0: 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20   i>=nRow ){.    
a1c0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
a1d0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
a1e0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
a1f0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
a200: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
a210: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
a220: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
a230: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
a240: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
a250: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
a260: 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71  sg, db, "%s", sq
a270: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
a280: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
a290: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20    char *zP4;.   
a2a0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66   Op *pOp;.    if
a2b0: 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ( i<p->nOp ){.  
a2c0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
a2d0: 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  t line number is
a2e0: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68   small enough th
a2f0: 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  at we are still 
a300: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
a310: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f  main program. */
a320: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d  .      pOp = &p-
a330: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  >aOp[i];.    }el
a340: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  se{.      /* We 
a350: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69  are currently li
a360: 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d  sting subprogram
a370: 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  s.  Figure out w
a380: 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20  hich one and.   
a390: 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68     ** pick up th
a3a0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70  e appropriate op
a3b0: 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  code. */.      i
a3c0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d  nt j;.      i -=
a3d0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66   p->nOp;.      f
a3e0: 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62  or(j=0; i>=apSub
a3f0: 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a  [j]->nOp; j++){.
a400: 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53          i -= apS
a410: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[j]->nOp;.    
a420: 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20    }.      pOp = 
a430: 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69  &apSub[j]->aOp[i
a440: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
a450: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
a460: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
a470: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
a480: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
a490: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
a4c0: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  unter */.      p
a4d0: 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20  Mem++;.  .      
a4e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a4f0: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
a500: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
a510: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
a520: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
a530: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
a540: 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20  ; /* Opcode */. 
a550: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
a560: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
a570: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
a580: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
a590: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
a5a0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
a5b0: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
a5c0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
a5d0: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
a5e0: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
a5f0: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
a600: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
a610: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
a620: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
a630: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
a640: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
a650: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
a660: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
a670: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
a680: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
a690: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
a6a0: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
a6b0: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
a6c0: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
a6d0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a6e0: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
a6f0: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
a700: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
a710: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
a720: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
a730: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
a740: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
a750: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
a760: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
a770: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
a780: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
a790: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a7a0: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
a7b0: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
a7c0: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
a7d0: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
a7e0: 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20   nSub!=0) ){.   
a7f0: 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28         apSub = (
a800: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
a810: 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20  ub->z;.         
a820: 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d   apSub[nSub++] =
a830: 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61   pOp->p4.pProgra
a840: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  m;.          pSu
a850: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  b->flags |= MEM_
a860: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20  Blob;.          
a870: 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73  pSub->n = nSub*s
a880: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
a890: 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  *);.        }.  
a8a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a8b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a8c0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
a8d0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
a900: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
a910: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a920: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
a930: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
a940: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a960: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P2 */.    pMem++
a970: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
a980: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
a990: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
a9a0: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P3 */.    pMe
a9d0: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  m++;..    if( sq
a9e0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
a9f0: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
aa00: 20 33 32 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f   32) ){ /* P4 */
aa10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
aa20: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
aa30: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
aa40: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
aa50: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
aa60: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
aa70: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
aa80: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
aa90: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29  Op, pMem->z, 32)
aaa0: 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70  ;.    if( zP4!=p
aab0: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
aac0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
aad0: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
aae0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
aaf0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
ab00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
ab10: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
ab20: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
ab30: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
ab40: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
ab50: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
ab60: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
ab70: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
ab80: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
ab90: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
aba0: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
abb0: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29  dResize(pMem, 4)
abc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
abd0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
abe0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
abf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ac00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
ac10: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
ac20: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
ac30: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
ac40: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
ac50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ac60: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
ac70: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
ac80: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
ac90: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
aca0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
acb0: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
acc0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
acd0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
ace0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
acf0: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
ad00: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29  esize(pMem, 500)
ad10: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
ad20: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
ad30: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
ad40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ad50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
ad60: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
ad70: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
ad80: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
ad90: 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d  ->n = displayCom
ada0: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70  ment(pOp, zP4, p
adb0: 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20  Mem->z, 500);.  
adc0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
add0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c  SQLITE_UTF8;.#el
ade0: 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  se.      pMem->f
adf0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae10: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e         /* Commen
ae20: 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  t */.#endif.    
ae30: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
ae40: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
ae50: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
ae60: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
ae70: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20   &p->aMem[1];.  
ae80: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
ae90: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
aea0: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
aeb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
aec0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
aed0: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
aee0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
aef0: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
af00: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
af10: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
af20: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
af30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
af40: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
af50: 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63  e *p){.  const c
af60: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66  har *z = 0;.  if
af70: 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
af80: 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20   z = p->zSql;.  
af90: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70  }else if( p->nOp
afa0: 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  >=1 ){.    const
afb0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
afc0: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69  p->aOp[0];.    i
afd0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
afe0: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
aff0: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20  p4.z!=0 ){.     
b000: 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a   z = pOp->p4.z;.
b010: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
b020: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
b030: 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) z++;.    }.  }
b040: 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74  .  if( z ) print
b050: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
b060: 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   z);.}.#endif..#
b070: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
b080: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
b090: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
b0a0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
b0b0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
b0c0: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
b0d0: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
b0e0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
b0f0: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
b100: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
b110: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
b120: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
b130: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
b140: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
b150: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
b160: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
b170: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
b180: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
b190: 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70  P_Init && pOp->p
b1a0: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  4.z!=0 ){.    in
b1b0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
b1c0: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
b1d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
b1e0: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
b1f0: 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  ", pOp->p4.z);. 
b200: 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69     for(i=0; sqli
b210: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
b220: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72  ; i++){}.    for
b230: 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (j=0; z[i]; i++)
b240: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
b250: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29  te3Isspace(z[i])
b260: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
b270: 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20  z[i-1]!=' ' ){. 
b280: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
b290: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
b2a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b2b0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
b2c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
b2d0: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b   }.    z[j] = 0;
b2e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72  .    sqlite3IoTr
b2f0: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
b300: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
b310: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
b320: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
b330: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
b340: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  */../*.** Alloca
b350: 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20  te space from a 
b360: 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65  fixed size buffe
b370: 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  r and return a p
b380: 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61  ointer to.** tha
b390: 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73  t space.  If ins
b3a0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
b3b0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65  is available, re
b3c0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
b3d0: 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65   The pBuf parame
b3e0: 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69  ter is the initi
b3f0: 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f  al value of a po
b400: 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c  inter which will
b410: 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20  .** receive the 
b420: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75  new memory.  pBu
b430: 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55  f is normally NU
b440: 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20  LL.  If pBuf is 
b450: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20  not.** NULL, it 
b460: 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72  means that memor
b470: 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65  y space has alre
b480: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
b490: 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74  ed and that.** t
b4a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
b4b0: 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  ld not allocate 
b4c0: 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20  any new memory. 
b4d0: 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f   When pBuf is no
b4e0: 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79  t.** NULL simply
b4f0: 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f   return pBuf.  O
b500: 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77  nly allocate new
b510: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68   memory space wh
b520: 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55  en pBuf.** is NU
b530: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20  LL..**.** nByte 
b540: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b550: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
b560: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70  needed..**.** *p
b570: 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20  pFrom points to 
b580: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20  available space 
b590: 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20  and pEnd points 
b5a0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
b5b0: 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73  e.** available s
b5c0: 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63  pace.  When spac
b5d0: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20  e is allocated, 
b5e0: 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e  *ppFrom is advan
b5f0: 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ced past.** the 
b600: 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  end of the alloc
b610: 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a  ated space..**.*
b620: 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63  * *pnByte is a c
b630: 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75  ounter of the nu
b640: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
b650: 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65   space that have
b660: 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c   failed.** to al
b670: 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72  locate.  If ther
b680: 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e  e is insufficien
b690: 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72  t space in *ppFr
b6a0: 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  om to satisfy th
b6b0: 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68  e.** request, th
b6c0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  en increment *pn
b6d0: 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75  Byte by the amou
b6e0: 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  nt of the reques
b6f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
b700: 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20  d *allocSpace(. 
b710: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
b720: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72        /* Where r
b730: 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69  eturn pointer wi
b740: 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a  ll be stored */.
b750: 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
b760: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b770: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c   of bytes to all
b780: 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a  ocate */.  u8 **
b790: 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20  ppFrom,         
b7a0: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63  /* IN/OUT: Alloc
b7b0: 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d  ate from *ppFrom
b7c0: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20   */.  u8 *pEnd, 
b7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
b7e0: 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20  inter to 1 byte 
b7f0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
b800: 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a  *ppFrom buffer *
b810: 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20  /.  int *pnByte 
b820: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61           /* If a
b830: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  llocation cannot
b840: 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d   be made, increm
b850: 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29  ent *pnByte */.)
b860: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
b870: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
b880: 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69  (*ppFrom) );.  i
b890: 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e  f( pBuf ) return
b8a0: 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d   pBuf;.  nByte =
b8b0: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a   ROUND8(nByte);.
b8c0: 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29    if( &(*ppFrom)
b8d0: 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20  [nByte] <= pEnd 
b8e0: 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76  ){.    pBuf = (v
b8f0: 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20  oid*)*ppFrom;.  
b900: 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79    *ppFrom += nBy
b910: 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  te;.  }else{.   
b920: 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74   *pnByte += nByt
b930: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
b940: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
b950: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
b960: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
b970: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
b980: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
b990: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
b9a0: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
b9b0: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
b9c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
b9d0: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
b9e0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
b9f0: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
ba00: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
ba10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
ba20: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
ba30: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
ba40: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
ba50: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
ba60: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
ba70: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
ba80: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
ba90: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
baa0: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
bab0: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
bac0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
bad0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69  E_MAGIC_RUN;..#i
bae0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
baf0: 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  G.  for(i=1; i<p
bb00: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
bb10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
bb20: 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29  m[i].db==p->db )
bb30: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
bb40: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
bb50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bb60: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
bb70: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
bb80: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
bb90: 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e  AGIC_RUN;.  p->n
bba0: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d  Change = 0;.  p-
bbb0: 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20  >cacheCtr = 1;. 
bbc0: 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
bbd0: 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20  Format = 255;.  
bbe0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
bbf0: 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  0;.  p->nFkConst
bc00: 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65  raint = 0;.#ifde
bc10: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
bc20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
bc30: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d  Op; i++){.    p-
bc40: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
bc50: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
bc60: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23  ycles = 0;.  }.#
bc70: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
bc80: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
bc90: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
bca0: 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66  cution for the f
bcb0: 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a  irst time after.
bcc0: 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  ** creating the 
bcd0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
bce0: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
bcf0: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
bd00: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67  s allocating reg
bd10: 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69  isters and initi
bd20: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
bd30: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
bd40: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
bd50: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
bd60: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
bd70: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
bd80: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
bd90: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
bda0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e   .**.** This fun
bdb0: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
bdc0: 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  led exactly once
bdd0: 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c   on each virtual
bde0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74   machine..** Aft
bdf0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
be00: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d  is called the VM
be10: 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61   has been "packa
be20: 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64  ged" and is read
be30: 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66  y.** to run.  Af
be40: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
be50: 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74   is called, furt
be60: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  her calls to .**
be70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
be80: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  p() functions ar
be90: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54  e prohibited.  T
bea0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63  his routine disc
beb0: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56  onnects.** the V
bec0: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72  dbe from the Par
bed0: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  se object that h
bee0: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69  elped generate i
bef0: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  t so that the.**
bf00: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65   the Vdbe become
bf10: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74  s an independent
bf20: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20   entity and the 
bf30: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e  Parse object can
bf40: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64   be.** destroyed
bf50: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
bf60: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
bf70: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  d() procedure to
bf80: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75   restore a virtu
bf90: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a  al machine back.
bfa0: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61  ** to its initia
bfb0: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74  l state after it
bfc0: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a   has been run..*
bfd0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
bfe0: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
bff0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c010: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50   The VDBE */.  P
c020: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20  arse *pParse    
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c040: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
c050: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
c060: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
c070: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
c080: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
c090: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  on */.  int nVar
c0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c0b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c0c0: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a   of parameters *
c0d0: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c100: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  VM memory regist
c110: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ers */.  int nCu
c120: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
c130: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c140: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71  r of cursors req
c150: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
c160: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
c170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c180: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
c190: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20   in subprograms 
c1a0: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20  */.  int nOnce; 
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c1d0: 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63   OP_Once instruc
c1e0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tions */.  int n
c1f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c210: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
c220: 38 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20  8 *zCsr;        
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c240: 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   Memory availabl
c250: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
c260: 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20   */.  u8 *zEnd; 
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
c290: 74 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65  te past allocate
c2a0: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
c2b0: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c2d0: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d  How much extra m
c2e0: 65 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20  emory is needed 
c2f0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  */..  assert( p!
c300: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c310: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
c320: 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
c330: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
c340: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
c350: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
c360: 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70  rt( pParse==p->p
c370: 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20  Parse );.  db = 
c380: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
c390: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c3a0: 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d  d==0 );.  nVar =
c3b0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20   pParse->nVar;. 
c3c0: 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e   nMem = pParse->
c3d0: 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20  nMem;.  nCursor 
c3e0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a  = pParse->nTab;.
c3f0: 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d    nArg = pParse-
c400: 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63  >nMaxArg;.  nOnc
c410: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63  e = pParse->nOnc
c420: 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d  e;.  if( nOnce==
c430: 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f  0 ) nOnce = 1; /
c440: 2a 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73  * Ensure at leas
c450: 74 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d  t one byte in p-
c460: 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a  >aOnceFlag[] */.
c470: 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68    .  /* For each
c480: 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64   cursor required
c490: 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20  , also allocate 
c4a0: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d  a memory cell. M
c4b0: 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73  emory.  ** cells
c4c0: 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72   (nMem+1-nCursor
c4d0: 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69  )..nMem, inclusi
c4e0: 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ve, will never b
c4f0: 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74  e used by.  ** t
c500: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e  he vdbe program.
c510: 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72   Instead they ar
c520: 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  e used to alloca
c530: 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a  te space for.  *
c540: 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43  * VdbeCursor/BtC
c550: 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73  ursor structures
c560: 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  . The blob of me
c570: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
c580: 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f  with .  ** curso
c590: 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e  r 0 is stored in
c5a0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65   memory cell nMe
c5b0: 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28  m. Memory cell (
c5c0: 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f  nMem-1).  ** sto
c5d0: 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  res the blob of 
c5e0: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
c5f0: 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c  d with cursor 1,
c600: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
c610: 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61  See also: alloca
c620: 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f  teCursor()..  */
c630: 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73  .  nMem += nCurs
c640: 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  or;..  /* Alloca
c650: 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
c660: 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53  ory registers, S
c670: 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44  QL variables, VD
c680: 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a  BE cursors and .
c690: 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f    ** an array to
c6a0: 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e   marshal SQL fun
c6b0: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
c6c0: 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20  in..  */.  zCsr 
c6d0: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
c6e0: 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 20 20  ->nOp];         
c6f0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
c700: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  liable for alloc
c710: 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20  ation */.  zEnd 
c720: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70  = (u8*)&p->aOp[p
c730: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d  Parse->nOpAlloc]
c740: 3b 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65  ;  /* First byte
c750: 20 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73   past end of zCs
c760: 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76  r[] */..  resolv
c770: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
c780: 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74  rg);.  p->usesSt
c790: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  mtJournal = (u8)
c7a0: 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  (pParse->isMulti
c7b0: 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d  Write && pParse-
c7c0: 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66  >mayAbort);.  if
c7d0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
c7e0: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
c7f0: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
c800: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72   }.  memset(zCsr
c810: 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b  , 0, zEnd-zCsr);
c820: 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72  .  zCsr += (zCsr
c830: 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20   - (u8*)0)&7;.  
c840: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
c850: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73  TE_ALIGNMENT(zCs
c860: 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72  r) );.  p->expir
c870: 65 64 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 65 78  ed = 0;..  p->ex
c880: 70 69 72 65 64 20 3d 20 30 3b 0a 20 20 0a 20 20  pired = 0;.  .  
c890: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65  /* Memory for re
c8a0: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74  gisters, paramet
c8b0: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63  ers, cursor, etc
c8c0: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  , is allocated i
c8d0: 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  n two.  ** passe
c8e0: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
c8f0: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
c900: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70   reuse unused sp
c910: 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ace at the .  **
c920: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
c930: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
c940: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
c950: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
c960: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
c970: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
c980: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
c990: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
c9a0: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
c9b0: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
c9c0: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72   rest using a fr
c9d0: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  esh allocation. 
c9e0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
c9f0: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
ca00: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
ca10: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
ca20: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
ca30: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
ca40: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
ca50: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
ca60: 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66  array can signif
ca70: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
ca80: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
ca90: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
caa0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
cab0: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
cac0: 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30   {.    nByte = 0
cad0: 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  ;.    p->aMem = 
cae0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d  allocSpace(p->aM
caf0: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
cb00: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
cb10: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
cb20: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53  p->aVar = allocS
cb30: 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56  pace(p->aVar, nV
cb40: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  ar*sizeof(Mem), 
cb50: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
cb60: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41  yte);.    p->apA
cb70: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
cb80: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
cb90: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43  izeof(Mem*), &zC
cba0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
cbb0: 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  );.    p->azVar 
cbc0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
cbd0: 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  azVar, nVar*size
cbe0: 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72  of(char*), &zCsr
cbf0: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
cc00: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  .    p->apCsr = 
cc10: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
cc20: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
cc30: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
cc40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73              &zCs
cc60: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
cc70: 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c  ;.    p->aOnceFl
cc80: 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ag = allocSpace(
cc90: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f  p->aOnceFlag, nO
cca0: 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  nce, &zCsr, zEnd
ccb0: 2c 20 26 6e 42 79 74 65 29 3b 0a 23 69 66 64 65  , &nByte);.#ifde
ccc0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ccd0: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
cce0: 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20      p->anExec = 
ccf0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e  allocSpace(p->an
cd00: 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a  Exec, p->nOp*siz
cd10: 65 6f 66 28 69 36 34 29 2c 20 26 7a 43 73 72 2c  eof(i64), &zCsr,
cd20: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
cd30: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 6e  #endif.    if( n
cd40: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  Byte ){.      p-
cd50: 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >pFree = sqlite3
cd60: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
cd70: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20   nByte);.    }. 
cd80: 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72     zCsr = p->pFr
cd90: 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26  ee;.    zEnd = &
cda0: 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d  zCsr[nByte];.  }
cdb0: 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20  while( nByte && 
cdc0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
cdd0: 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73  d );..  p->nCurs
cde0: 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
cdf0: 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e  p->nOnceFlag = n
ce00: 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61  Once;.  if( p->a
ce10: 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  Var ){.    p->nV
ce20: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
ce30: 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e  ;.    for(n=0; n
ce40: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
ce50: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
ce60: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
ce70: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
ce80: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
ce90: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56    }.  if( p->azV
cea0: 61 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 7a  ar && pParse->nz
ceb0: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e  Var>0 ){.    p->
cec0: 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  nzVar = pParse->
ced0: 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70  nzVar;.    memcp
cee0: 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72  y(p->azVar, pPar
cef0: 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a  se->azVar, p->nz
cf00: 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a  Var*sizeof(p->az
cf10: 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65  Var[0]));.    me
cf20: 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56  mset(pParse->azV
cf30: 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e  ar, 0, pParse->n
cf40: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72  zVar*sizeof(pPar
cf50: 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  se->azVar[0]));.
cf60: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65    }.  if( p->aMe
cf70: 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  m ){.    p->aMem
cf80: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
cf90: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
cfa0: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
cfb0: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e  nMem */.    p->n
cfc0: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20  Mem = nMem;     
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
cfe0: 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e       not from 0.
cff0: 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66  .nMem-1 */.    f
d000: 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b  or(n=1; n<=nMem;
d010: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
d020: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
d030: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
d040: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
d050: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
d060: 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20   }.  p->explain 
d070: 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
d080: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
d090: 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a  Rewind(p);.}../*
d0a0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
d0b0: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
d0c0: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
d0d0: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
d0e0: 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
d0f0: 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
d100: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
d110: 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
d120: 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
d130: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
d140: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d150: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
d160: 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20  terClose(p->db, 
d170: 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d  pCx);.  if( pCx-
d180: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
d190: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
d1a0: 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20  x->pBt);.    /* 
d1b0: 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  The pCx->pCursor
d1c0: 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61   will be close a
d1d0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66  utomatically, if
d1e0: 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20   it exists, by. 
d1f0: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
d200: 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65  bove. */.  }else
d210: 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f   if( pCx->pCurso
d220: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
d230: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
d240: 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pCx->pCursor);.
d250: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
d260: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
d270: 41 42 4c 45 0a 20 20 65 6c 73 65 20 69 66 28 20  ABLE.  else if( 
d280: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
d290: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
d2a0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
d2b0: 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e  abCursor = pCx->
d2c0: 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20  pVtabCursor;.   
d2d0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
d2e0: 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
d2f0: 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
d300: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
d310: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
d320: 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75  d = 1;.    pModu
d330: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
d340: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e  Cursor);.    p->
d350: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30  inVtabMethod = 0
d360: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
d370: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76  /*.** Copy the v
d380: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
d390: 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74  the VdbeFrame st
d3a0: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56  ructure to its V
d3b0: 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  dbe. This.** is 
d3c0: 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
d3d0: 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65  e, when a trigge
d3e0: 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73  r sub-program is
d3f0: 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f   halted to resto
d400: 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f  re.** control to
d410: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
d420: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
d430: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
d440: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72  e(VdbeFrame *pFr
d450: 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ame){.  Vdbe *v 
d460: 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 23 69 66  = pFrame->v;.#if
d470: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d480: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
d490: 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20  S.  v->anExec = 
d4a0: 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a  pFrame->anExec;.
d4b0: 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 6e 63  #endif.  v->aOnc
d4c0: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
d4d0: 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  aOnceFlag;.  v->
d4e0: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  nOnceFlag = pFra
d4f0: 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->nOnceFlag;. 
d500: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
d510: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
d520: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
d530: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
d540: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
d550: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
d560: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
d570: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
d580: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
d590: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
d5a0: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
d5b0: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
d5c0: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
d5d0: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
d5e0: 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e  hange;.  v->db->
d5f0: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
d600: 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 72  ->nDbChange;.  r
d610: 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
d620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
d630: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
d640: 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
d650: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
d660: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
d670: 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
d680: 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
d690: 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
d6a0: 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
d6b0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
d6c0: 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
d6d0: 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
d6e0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
d6f0: 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
d700: 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
d710: 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
d720: 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
d730: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
d740: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
d750: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
d760: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
d770: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
d780: 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
d790: 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
d7a0: 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
d7b0: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
d7c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d7d0: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
d7e0: 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46  rame);.    p->pF
d7f0: 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rame = 0;.    p-
d800: 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  >nFrame = 0;.  }
d810: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46  .  assert( p->nF
d820: 72 61 6d 65 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  rame==0 );..  if
d830: 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
d840: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
d850: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
d860: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
d870: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
d880: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
d890: 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
d8a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d8b0: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
d8c0: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
d8d0: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
d8e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
d8f0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
d900: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
d910: 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c  ray(&p->aMem[1],
d920: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
d930: 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
d940: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
d950: 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
d960: 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
d970: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
d980: 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
d990: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
d9a0: 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
d9b0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
d9c0: 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
d9d0: 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
d9e0: 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28   the VM */.  if(
d9f0: 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73   p->pAuxData ) s
da00: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
da10: 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30  AuxData(p, -1, 0
da20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
da30: 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d  pAuxData==0 );.}
da40: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
da50: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 61 20   the VM after a 
da60: 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73  single run..*/.s
da70: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
da80: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  up(Vdbe *p){.  s
da90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
daa0: 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  db;..#ifdef SQLI
dab0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
dac0: 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
dad0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
dae0: 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
daf0: 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
db00: 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
db10: 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
db20: 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
db30: 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69   up.  */.  int i
db40: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ;.  if( p->apCsr
db50: 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d   ) for(i=0; i<p-
db60: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61  >nCursor; i++) a
db70: 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b  ssert( p->apCsr[
db80: 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  i]==0 );.  if( p
db90: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f  ->aMem ){.    fo
dba0: 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65  r(i=1; i<=p->nMe
dbb0: 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  m; i++) assert( 
dbc0: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  p->aMem[i].flags
dbd0: 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20  ==MEM_Undefined 
dbe0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
dbf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
dc00: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
dc10: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
dc20: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
dc30: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
dc40: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
dc50: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
dc60: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
dc70: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
dc80: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
dc90: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
dca0: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
dcb0: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
dcc0: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
dcd0: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
dce0: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
dcf0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
dd00: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
dd10: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
dd20: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
dd30: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
dd40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
dd50: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
dd60: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
dd70: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
dd80: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
dd90: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
dda0: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c   = p->db;..  rel
ddb0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
ddc0: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
ddd0: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
dde0: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  N);.  sqlite3DbF
ddf0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
de00: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73  ame);.  n = nRes
de10: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
de20: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
de30: 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c  n = (u16)nResCol
de40: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
de50: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
de60: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
de70: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
de80: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
de90: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
dea0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
deb0: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
dec0: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
ded0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
dee0: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
def0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
df00: 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a  pColName++;.  }.
df10: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
df20: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
df30: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
df40: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
df50: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
df60: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
df70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
df80: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
df90: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
dfa0: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
dfb0: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
dfc0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
dfd0: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
dfe0: 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72  ** The final par
dff0: 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75  ameter, xDel, mu
e000: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c  st be one of SQL
e010: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c  ITE_DYNAMIC, SQL
e020: 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72  ITE_STATIC.** or
e030: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
e040: 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49  T. If it is SQLI
e050: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  TE_DYNAMIC, then
e060: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
e070: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61  ted.** to by zNa
e080: 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  me will be freed
e090: 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65   by sqlite3DbFre
e0a0: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
e0b0: 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a  e is destroyed..
e0c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
e0d0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20  beSetColName(.  
e0e0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63   /* Vdbe being c
e110: 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69  onfigured */.  i
e120: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
e150: 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73  mn zName applies
e160: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72   to */.  int var
e170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
e190: 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f   of the COLNAME_
e1a0: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
e1b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
e1c0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
e1d0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
e1e0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
e1f0: 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64  g name */.  void
e200: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e220: 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  Memory managemen
e230: 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a  t strategy for z
e240: 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Name */.){.  int
e250: 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c   rc;.  Mem *pCol
e260: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
e270: 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  idx<p->nResColum
e280: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  n );.  assert( v
e290: 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a  ar<COLNAME_N );.
e2a0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
e2b0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
e2c0: 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20   assert( !zName 
e2d0: 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f  || xDel!=SQLITE_
e2e0: 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72  DYNAMIC );.    r
e2f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e300: 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  EM;.  }.  assert
e310: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
e320: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
e330: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
e340: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
e350: 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73  lumn]);.  rc = s
e360: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
e370: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
e380: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
e390: 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61  UTF8, xDel);.  a
e3a0: 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20  ssert( rc!=0 || 
e3b0: 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e  !zName || (pColN
e3c0: 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54  ame->flags&MEM_T
e3d0: 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  erm)!=0 );.  ret
e3e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e3f0: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
e400: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
e410: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
e420: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
e430: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
e440: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
e450: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
e460: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
e470: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
e480: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
e490: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
e4a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
e4b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
e4c0: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
e4d0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e4e0: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
e4f0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
e500: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
e510: 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
e520: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
e530: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
e540: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
e550: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
e560: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
e570: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
e580: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
e590: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
e5a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
e5b0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
e5c0: 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f    /* With this o
e5d0: 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74  ption, sqlite3Vt
e5e0: 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69  abSync() is defi
e5f0: 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79  ned to be simply
e600: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   .  ** SQLITE_OK
e610: 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65   so p is not use
e620: 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  d. .  */.  UNUSE
e630: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
e640: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
e650: 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
e660: 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
e670: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
e680: 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
e690: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
e6a0: 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
e6b0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
e6c0: 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
e6d0: 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
e6e0: 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
e6f0: 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
e700: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
e710: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
e720: 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
e730: 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
e740: 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
e750: 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
e760: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
e770: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
e780: 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b  VtabSync(db, p);
e790: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
e7a0: 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20   determines (a) 
e7b0: 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  if the commit ho
e7c0: 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ok should be inv
e7d0: 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62  oked and.  ** (b
e7e0: 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62  ) how many datab
e7f0: 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f  ase files have o
e800: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
e810: 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a  ctions, not .  *
e820: 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
e830: 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28  temp database. (
e840: 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  b) is important 
e850: 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20  because if more 
e860: 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64  than .  ** one d
e870: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
e880: 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
e890: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61  ransaction, a ma
e8a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  ster journal.  *
e8b0: 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  * file is requir
e8c0: 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63  ed for an atomic
e8d0: 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20   commit..  */ . 
e8e0: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
e8f0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
e900: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
e910: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
e920: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
e930: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
e940: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
e950: 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63   ){.      needXc
e960: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
e970: 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61   if( i!=1 ) nTra
e980: 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  ns++;.      sqli
e990: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
e9a0: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
e9b0: 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
e9c0: 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33  siveLock(sqlite3
e9d0: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
e9e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
e9f0: 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
ea00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ea10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ea20: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
ea30: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
ea40: 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
ea50: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
ea60: 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
ea70: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
ea80: 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
ea90: 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
eaa0: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
eab0: 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
eac0: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
ead0: 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
eae0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
eaf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
eb00: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
eb10: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
eb20: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
eb30: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
eb40: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
eb50: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
eb60: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
eb70: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
eb80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
eb90: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
eba0: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
ebb0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
ebc0: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
ebd0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
ebe0: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
ebf0: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
ec00: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
ec10: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
ec20: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
ec30: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
ec40: 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
ec50: 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
ec60: 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
ec70: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
ec80: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
ec90: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
eca0: 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
ecb0: 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
ecc0: 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
ecd0: 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
ece0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
ecf0: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
ed00: 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
ed10: 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
ed20: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
ed30: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
ed40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
ed50: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
ed60: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
ed70: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
ed80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
ed90: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
eda0: 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
edb0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
edc0: 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
edd0: 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
ede0: 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
edf0: 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
ee00: 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
ee10: 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
ee20: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
ee30: 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
ee40: 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
ee50: 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
ee60: 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
ee70: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
ee80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
ee90: 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
eea0: 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
eeb0: 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
eec0: 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
eed0: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
eee0: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
eef0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
ef00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
ef10: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
ef20: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
ef30: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
ef40: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
ef50: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
ef60: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
ef70: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
ef80: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
ef90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
efa0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
efb0: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
efc0: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
efd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
efe0: 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
eff0: 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
f000: 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
f010: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
f020: 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
f030: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
f040: 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
f050: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f060: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
f070: 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  ed atomically.. 
f080: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
f090: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
f0a0: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
f0b0: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
f0c0: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
f0d0: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
f0e0: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
f0f0: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
f100: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
f110: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
f120: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
f130: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
f140: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
f150: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
f160: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
f170: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
f180: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
f190: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
f1a0: 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
f1b0: 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
f1c0: 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
f1d0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
f1e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f1f0: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
f200: 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
f210: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
f220: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
f230: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
f240: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
f250: 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69  XXXXX9XXz", zMai
f260: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
f270: 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74  zMaster==0 ) ret
f280: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
f290: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
f2a0: 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
f2b0: 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
f2c0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
f2d0: 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30  ( retryCount>100
f2e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f2f0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
f300: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74  _FULL, "MJ delet
f310: 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
f320: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
f330: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
f340: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
f350: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f360: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
f370: 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20  ( retryCount==1 
f380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
f390: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
f3a0: 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64  FULL, "MJ collid
f3b0: 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
f3c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f3d0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43    }.      retryC
f3e0: 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ount++;.      sq
f3f0: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
f400: 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
f410: 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
f420: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
f430: 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72  ntf(13, &zMaster
f440: 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d  [nMainFile], "-m
f450: 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20  j%06X9%02X",.   
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f470: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61              (iRa
f480: 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66  ndom>>8)&0xfffff
f490: 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29  f, iRandom&0xff)
f4a0: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;.      /* The a
f4b0: 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63  ntipenultimate c
f4c0: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
f4d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
f4e0: 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ame must.      *
f4f0: 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69  * be "9" to avoi
f500: 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e  d name collision
f510: 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33  s when using 8+3
f520: 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20   filenames. */. 
f530: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61       assert( zMa
f540: 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c  ster[sqlite3Strl
f550: 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d  en30(zMaster)-3]
f560: 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73  =='9' );.      s
f570: 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
f580: 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61  3(zMainFile, zMa
f590: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ster);.      rc 
f5a0: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
f5b0: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
f5c0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
f5d0: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
f5e0: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
f5f0: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
f600: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
f610: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f620: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
f630: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
f640: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f650: 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
f660: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
f670: 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
f680: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
f690: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
f6a0: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
f6b0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
f6c0: 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
f6d0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
f6e0: 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
f6f0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
f700: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f710: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f720: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
f730: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
f740: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
f750: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
f760: 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
f770: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
f780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
f790: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
f7a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f7b0: 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
f7c0: 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
f7d0: 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
f7e0: 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
f7f0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f800: 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
f810: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
f820: 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
f830: 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
f840: 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
f850: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
f860: 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
f870: 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
f880: 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
f890: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
f8a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
f8b0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
f8c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
f8d0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
f8e0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
f8f0: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
f900: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
f910: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
f920: 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
f930: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
f940: 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
f950: 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
f960: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
f970: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
f980: 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a  gnore TEMP and :
f990: 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
f9a0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
f9b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
f9c0: 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  File[0]!=0 );.  
f9d0: 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
f9e0: 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
f9f0: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
fa00: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
fa10: 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
fa20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fa30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fa40: 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
fa50: 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74  zFile, sqlite3St
fa60: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c  rlen30(zFile)+1,
fa70: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
fa80: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69    offset += sqli
fa90: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
faa0: 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66  e)+1;.        if
fab0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fac0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
fad0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
fae0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
faf0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
fb00: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
fb10: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
fb20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fb30: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
fb40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
fb50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fb60: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
fb70: 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
fb80: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
fb90: 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51  If the IOCAP_SEQ
fba0: 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20  UENTIAL device. 
fbb0: 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65     ** flag is se
fbc0: 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  t this is not re
fbd0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
fbe0: 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
fbf0: 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c  .     && 0==(sql
fc00: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
fc10: 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
fc20: 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
fc30: 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
fc40: 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
fc50: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
fc60: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
fc70: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
fc80: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
fc90: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
fca0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
fcb0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
fcc0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
fcd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
fce0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
fcf0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
fd00: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
fd10: 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
fd20: 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
fd30: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
fd40: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
fd50: 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
fd60: 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
fd70: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
fd80: 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
fd90: 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
fda0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
fdb0: 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
fdc0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
fdd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
fde0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
fdf0: 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
fe00: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
fe10: 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
fe20: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
fe30: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
fe40: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
fe50: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
fe60: 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
fe70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
fe80: 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
fe90: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
fea0: 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
feb0: 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
fec0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
fed0: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
fee0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
fef0: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
ff00: 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
ff10: 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
ff20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
ff30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
ff40: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
ff50: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
ff60: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
ff70: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
ff80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
ff90: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
ffa0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
ffb0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
ffc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
ffd0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
ffe0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
fff0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
10000 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
10010 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10020 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10030 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
10040 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
10050 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
10060 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
10070 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10080 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
10090 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
100a0 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
100b0 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
100c0 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
100d0 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
100e0 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
100f0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
10100 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
10110 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
10120 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
10130 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
10140 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
10150 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
10160 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
10170 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
10180 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
10190 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
101a0 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
101b0 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
101c0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
101d0 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
101e0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
101f0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
10200 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
10210 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
10220 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
10230 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
10240 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
10250 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
10260 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
10270 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
10280 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
10290 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
102a0 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
102b0 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
102c0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
102d0 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
102e0 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
102f0 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
10300 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
10310 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
10320 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
10330 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
10340 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
10350 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
10360 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10370 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
10380 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
10390 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
103a0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
103b0 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
103c0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
103d0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
103e0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
103f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
10400 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
10410 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
10420 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
10430 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
10440 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
10450 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
10460 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
10470 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
10480 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
10490 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
104a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
104b0 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
104c0 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
104d0 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
104e0 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
104f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
10500 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
10510 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
10520 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
10530 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
10540 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
10550 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
10560 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
10570 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
10580 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
10590 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
105a0 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
105b0 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
105c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
105d0 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
105e0 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
105f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
10600 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
10610 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
10620 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
10630 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
10640 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
10650 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
10660 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
10670 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
10680 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
10690 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
106a0 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  sy((sqlite3_stmt
106b0 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  *)p) ){.      cn
106c0 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
106d0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
106e0 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20  nWrite++;.      
106f0 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
10700 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20   ) nRead++;.    
10710 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
10720 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
10730 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65  ( cnt==db->nVdbe
10740 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65  Active );.  asse
10750 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
10760 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
10770 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64  assert( nRead==d
10780 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
10790 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
107a0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
107b0 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
107c0 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
107d0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
107e0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
107f0 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
10800 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
10810 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
10820 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
10830 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
10840 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
10850 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
10860 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
10870 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10880 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
10890 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
108a0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
108b0 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
108c0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
108d0 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
108e0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
108f0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
10900 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
10910 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
10920 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
10930 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
10940 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
10950 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
10960 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
10970 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
10980 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
10990 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
109a0 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
109b0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
109c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
109d0 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65  * If p->iStateme
109e0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
109f0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
10a00 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61  is Vdbe opened a
10a10 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74   .  ** statement
10a20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
10a30 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  t should be clos
10a40 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c  ed here. The onl
10a50 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a  y exception.  **
10a60 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65   is that an IO e
10a70 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63  rror may have oc
10a80 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20  curred, causing 
10a90 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
10aa0 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74  lback..  ** In t
10ab0 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53  his case (db->nS
10ac0 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e  tatement==0), an
10ad0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  d there is nothi
10ae0 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20  ng to do..  */. 
10af0 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d   if( db->nStatem
10b00 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
10b10 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ment ){.    int 
10b20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  i;.    const int
10b30 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
10b40 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
10b50 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d      assert( eOp=
10b60 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
10b70 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45  ACK || eOp==SAVE
10b80 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a  POINT_RELEASE);.
10b90 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
10ba0 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  nStatement>0 );.
10bb0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
10bc0 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e  Statement==(db->
10bd0 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
10be0 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20  Savepoint) );.. 
10bf0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
10c00 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
10c10 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
10c20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42  LITE_OK;.      B
10c30 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
10c40 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
10c50 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
10c60 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
10c70 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10c80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
10c90 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
10ca0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
10cb0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10cc0 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
10cd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10ce0 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
10cf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10d00 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
10d10 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
10d20 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  t, SAVEPOINT_REL
10d30 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
10d40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10d50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
10d60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10d70 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
10d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10d90 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53      }.    db->nS
10da0 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  tatement--;.    
10db0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
10dc0 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0;..    if( rc==
10dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10de0 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
10df0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
10e00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
10e10 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
10e20 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
10e30 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
10e40 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
10e50 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
10e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10e70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10e80 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
10e90 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
10ea0 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
10eb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10ec0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
10ed0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
10ee0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
10ef0 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
10f00 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20  restore the .   
10f10 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e   ** database han
10f20 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
10f30 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
10f40 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
10f50 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a   had when .    *
10f60 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
10f70 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
10f80 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20  opened.  */.    
10f90 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
10fa0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
10fb0 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
10fc0 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  edCons = p->nStm
10fd0 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20  tDefCons;.      
10fe0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
10ff0 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
11000 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d  efImmCons;.    }
11010 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11030 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11040 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
11050 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
11060 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
11070 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
11080 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
11090 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
110a0 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
110b0 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
110c0 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
110d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
110e0 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
110f0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
11100 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
11110 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
11120 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
11130 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
11140 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
11150 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
11160 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
11170 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
11180 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
11190 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
111a0 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
111b0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
111c0 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77  EIGNKEY.** and w
111d0 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
111e0 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
111f0 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
11200 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
11210 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
11220 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
11230 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
11240 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
11250 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
11260 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
11270 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
11280 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65  && (db->nDeferre
11290 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72  dCons+db->nDefer
112a0 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a  redImmCons)>0) .
112b0 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64     || (!deferred
112c0 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72   && p->nFkConstr
112d0 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20  aint>0) .  ){.  
112e0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
112f0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
11300 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65  IGNKEY;.    p->e
11310 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
11320 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  Abort;.    sqlit
11330 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
11340 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 46 4f  zErrMsg, db, "FO
11350 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
11360 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20  aint failed");. 
11370 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11380 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
11390 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
113a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
113b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
113c0 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
113d0 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
113e0 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
113f0 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
11400 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
11410 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
11420 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
11430 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
11440 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
11450 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
11460 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
11470 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11480 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
11490 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
114a0 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
114b0 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
114c0 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
114d0 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
114e0 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
114f0 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
11500 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
11510 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
11520 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
11530 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
11540 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
11550 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
11560 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
11570 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
11580 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
11590 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
115a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
115b0 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
115c0 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
115d0 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
115e0 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
115f0 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
11600 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
11610 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
11620 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
11640 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61  sed to store tra
11650 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f  nsient return co
11660 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  des */.  sqlite3
11670 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
11680 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
11690 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
116a0 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
116b0 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
116c0 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
116d0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
116e0 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
116f0 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
11700 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
11710 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
11720 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
11730 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
11740 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
11750 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
11760 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
11770 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
11780 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
11790 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
117a0 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
117b0 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
117c0 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
117d0 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
117e0 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
117f0 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
11800 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
11810 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
11820 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
11830 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
11840 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
11850 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
11860 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
11870 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
11880 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
11890 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
118a0 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70  n..  */..  if( p
118b0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
118c0 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
118d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
118e0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e    }.  if( p->aOn
118f0 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28  ceFlag ) memset(
11900 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c  p->aOnceFlag, 0,
11910 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a   p->nOnceFlag);.
11920 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
11930 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  s(p);.  if( p->m
11940 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
11950 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  _RUN ){.    retu
11960 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11970 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
11980 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f  dbeCnt(db);..  /
11990 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72  * No commit or r
119a0 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69  ollback needed i
119b0 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65  f the program ne
119c0 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 69  ver started or i
119d0 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73  f the.  ** SQL s
119e0 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  tatement does no
119f0 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  t read or write 
11a00 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
11a10 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
11a20 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61  >=0 && p->bIsRea
11a30 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  der ){.    int m
11a40 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79  rc;   /* Primary
11a50 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   error code from
11a60 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e   p->rc */.    in
11a70 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d  t eStatementOp =
11a80 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70   0;.    int isSp
11a90 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
11aa0 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
11ab0 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63   true if a 'spec
11ac0 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20  ial' error */.. 
11ad0 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62     /* Lock all b
11ae0 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68  trees used by th
11af0 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
11b00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e     sqlite3VdbeEn
11b10 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ter(p);..    /* 
11b20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66  Check for one of
11b30 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
11b40 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d  ors */.    mrc =
11b50 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20   p->rc & 0xff;. 
11b60 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f     isSpecialErro
11b70 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  r = mrc==SQLITE_
11b80 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
11b90 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20  LITE_IOERR.     
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bb0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
11bc0 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d  NTERRUPT || mrc=
11bd0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20  =SQLITE_FULL;.  
11be0 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45    if( isSpecialE
11bf0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rror ){.      /*
11c00 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61   If the query wa
11c10 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  s read-only and 
11c20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
11c30 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  s SQLITE_INTERRU
11c40 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  PT, .      ** no
11c50 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63   rollback is nec
11c60 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73  essary. Otherwis
11c70 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61  e, at least a sa
11c80 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
11c90 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  * transaction mu
11ca0 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
11cb0 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  k to restore the
11cc0 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a   database to a .
11cd0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74        ** consist
11ce0 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
11cf0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65   **.      ** Eve
11d00 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  n if the stateme
11d10 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  nt is read-only,
11d20 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
11d30 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20   to perform.    
11d40 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74    ** a statement
11d50 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   or transaction 
11d60 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
11d70 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
11d80 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72   .      ** occur
11d90 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  red while writin
11da0 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
11db0 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72  , sub-journal or
11dc0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
11dd0 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20  ** file as part 
11de0 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  of an effort to 
11df0 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70  free up cache sp
11e00 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f  ace (see functio
11e10 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72  n.      ** pager
11e20 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65  Stress() in page
11e30 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61  r.c), the rollba
11e40 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74  ck is required t
11e50 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20  o restore .     
11e60 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f   ** the pager to
11e70 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74   a consistent st
11e80 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
11e90 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
11ea0 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
11eb0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
11ec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72  .        if( (mr
11ed0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11ee0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
11ef0 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53  ULL) && p->usesS
11f00 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
11f10 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
11f20 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
11f30 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
11f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11f50 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
11f60 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
11f70 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
11f80 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
11f90 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
11fa0 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
11fb0 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
11fc0 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
11fd0 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
11fe0 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
11ff0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
12000 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
12010 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
12020 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
12030 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
12040 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
12050 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
12060 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
12070 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61           p->nCha
12080 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nge = 0;.       
12090 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
120a0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
120b0 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72  or immediate for
120c0 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69  eign key violati
120d0 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ons. */.    if( 
120e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
120f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12100 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
12110 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
12120 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
12130 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
12140 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74  et and this is t
12150 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77  he only active w
12160 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d  riter .    ** VM
12170 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74  , then we do eit
12180 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20  her a commit or 
12190 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20  rollback of the 
121a0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
121b0 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion. .    **.   
121c0 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62   ** Note: This b
121d0 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69  lock also runs i
121e0 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  f one of the spe
121f0 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64  cial errors hand
12200 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76  led .    ** abov
12210 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  e has occurred. 
12220 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12230 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79  !sqlite3VtabInSy
12240 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20  nc(db) .     && 
12250 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a  db->autoCommit .
12260 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62       && db->nVdb
12270 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64  eWrite==(p->read
12280 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b  Only==0) .    ){
12290 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
122a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
122b0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
122c0 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70  OE_Fail && !isSp
122d0 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20  ecialError) ){. 
122e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
122f0 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
12300 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
12310 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
12330 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e   NEVER(p->readOn
12340 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ly) ){.         
12350 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
12360 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
12370 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12380 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
12390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
123a0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
123b0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
123c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
123d0 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   .          /* T
123e0 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
123f0 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
12400 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
12410 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20  s successful .  
12420 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69          ** or hi
12430 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
12440 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
12450 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72  ere are no defer
12460 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20  red foreign.    
12470 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e        ** key con
12480 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64  straints to hold
12490 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
124a0 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
124b0 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
124c0 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
124d0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
124e0 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
124f0 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
12500 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
12510 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
12520 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  & p->readOnly ){
12530 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12540 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
12550 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12560 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
12570 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12590 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
125a0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
125b0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
125c0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
125d0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  K);.          p-
125e0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
125f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12600 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
12610 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
12620 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
12630 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30  erredImmCons = 0
12640 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
12650 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
12660 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20  _DeferFKs;.     
12670 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d       sqlite3Comm
12680 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
12690 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  s(db);.        }
126a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
126b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
126c0 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
126d0 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20  ITE_OK);.       
126e0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
126f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
12700 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
12710 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
12720 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30   eStatementOp==0
12730 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
12740 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
12750 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
12760 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
12770 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
12780 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  p = SAVEPOINT_RE
12790 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  LEASE;.      }el
127a0 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
127b0 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
127c0 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
127d0 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
127e0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
127f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12800 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
12810 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
12820 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
12830 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12840 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
12850 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
12860 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
12870 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68  ;.        p->nCh
12880 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
12890 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
128a0 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f  * If eStatementO
128b0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
128c0 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hen a statement 
128d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64  transaction need
128e0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63  s to.    ** be c
128f0 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
12900 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71  ed back. Call sq
12910 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
12920 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20  atement() to.   
12930 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68   ** do so. If th
12940 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74  is operation ret
12950 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61  urns an error, a
12960 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nd the current s
12970 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  tatement.    ** 
12980 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
12990 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54  LITE_OK or SQLIT
129a0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68  E_CONSTRAINT, th
129b0 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20  en promote the. 
129c0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74     ** current st
129d0 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f  atement error co
129e0 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  de..    */.    i
129f0 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  f( eStatementOp 
12a00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
12a10 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
12a20 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74  atement(p, eStat
12a30 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20  ementOp);.      
12a40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
12a50 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
12a60 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63  ITE_OK || (p->rc
12a70 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
12a80 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20  ONSTRAINT ){.   
12a90 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
12aa0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
12ab0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12ac0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
12ad0 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
12ae0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
12af0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
12b00 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
12b10 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
12b20 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
12b30 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
12b40 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
12b50 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
12b60 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  t = 1;.        p
12b70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
12b80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
12b90 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
12ba0 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50  as an INSERT, UP
12bb0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61  DATE or DELETE a
12bc0 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  nd no statement 
12bd0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
12be0 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c  ** has been roll
12bf0 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20  ed back, update 
12c00 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
12c10 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63  nection change-c
12c20 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a  ounter. .    */.
12c30 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67      if( p->chang
12c40 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20  eCntOn ){.      
12c50 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
12c60 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  !=SAVEPOINT_ROLL
12c70 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
12c80 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
12c90 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68  anges(db, p->nCh
12ca0 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ange);.      }el
12cb0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
12cc0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
12cd0 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  s(db, 0);.      
12ce0 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e  }.      p->nChan
12cf0 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ge = 0;.    }.. 
12d00 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
12d10 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
12d20 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
12d30 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65  p);.  }..  /* We
12d40 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
12d50 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
12d60 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
12d70 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
12d80 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
12d90 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64  0 ){.    db->nVd
12da0 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20  beActive--;.    
12db0 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
12dc0 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74   ) db->nVdbeWrit
12dd0 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  e--;.    if( p->
12de0 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e  bIsReader ) db->
12df0 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20  nVdbeRead--;.   
12e00 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
12e10 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56  beActive>=db->nV
12e20 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61  dbeRead );.    a
12e30 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
12e40 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57  Read>=db->nVdbeW
12e50 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65  rite );.    asse
12e60 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  rt( db->nVdbeWri
12e70 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70  te>=0 );.  }.  p
12e80 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
12e90 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65  AGIC_HALT;.  che
12ea0 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
12eb0 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  db);.  if( p->db
12ec0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12ed0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
12ee0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
12ef0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74  .  /* If the aut
12f00 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
12f10 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68   set to true, th
12f20 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61  en any locks tha
12f30 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a  t were held.  **
12f40 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   by connection d
12f50 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  b have now been 
12f60 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73  released. Call s
12f70 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
12f80 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a  Unlocked() .  **
12f90 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72   to invoke any r
12fa0 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e  equired unlock-n
12fb0 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
12fc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
12fd0 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
12fe0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
12ff0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b  ionUnlocked(db);
13000 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
13010 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
13020 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
13030 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53  mit==0 || db->nS
13040 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  tatement==0 );. 
13050 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
13060 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51  SQLITE_BUSY ? SQ
13070 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49  LITE_BUSY : SQLI
13080 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TE_OK);.}.../*.*
13090 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
130a0 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
130b0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
130c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
130d0 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
130e0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
130f0 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
13100 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
13110 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
13120 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
13130 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
13140 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
13150 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
13160 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  py the error cod
13170 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
13180 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
13190 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64   the VDBE passed
131a0 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
131b0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73   argument to its
131c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
131d0 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77   (so that they w
131e0 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72  ill be .** retur
131f0 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  ned by calls to 
13200 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
13210 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72  ) and sqlite3_er
13220 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54  rmsg())..**.** T
13230 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
13240 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20  s not clear the 
13250 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20  VDBE error code 
13260 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74  or message, just
13270 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20  .** copies them 
13280 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13290 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
132a0 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
132b0 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29  erError(Vdbe *p)
132c0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
132d0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
132e0 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
132f0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
13300 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c     u8 mallocFail
13310 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ed = db->mallocF
13320 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74  ailed;.    sqlit
13330 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
13340 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64  loc();.    if( d
13350 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d  b->pErr==0 ) db-
13360 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56  >pErr = sqlite3V
13370 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
13380 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
13390 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
133a0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
133b0 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
133c0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
133d0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
133e0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
133f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13400 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b   = mallocFailed;
13410 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65  .    db->errCode
13420 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = rc;.  }else{.
13430 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13440 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  (db, rc);.  }.  
13450 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
13460 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
13470 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20  LE_SQLLOG./*.** 
13480 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  If an SQLITE_CON
13490 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20  FIG_SQLLOG hook 
134a0 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e  is registered an
134b0 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
134c0 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b  n run, .** invok
134d0 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
134e0 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53  void vdbeInvokeS
134f0 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a  qllog(Vdbe *v){.
13500 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
13510 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
13520 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49  g && v->rc==SQLI
13530 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c  TE_OK && v->zSql
13540 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && v->pc>=0 ){.
13550 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e      char *zExpan
13560 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ded = sqlite3Vdb
13570 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d  eExpandSql(v, v-
13580 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65  >zSql);.    asse
13590 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e  rt( v->db->init.
135a0 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69  busy==0 );.    i
135b0 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a  f( zExpanded ){.
135c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
135d0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
135e0 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  g(.          sql
135f0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
13600 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e  .pSqllogArg, v->
13610 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31  db, zExpanded, 1
13620 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
13630 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
13640 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b  >db, zExpanded);
13650 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
13660 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
13670 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a  InvokeSqllog(x).
13680 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
13690 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
136a0 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
136b0 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
136c0 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
136d0 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
136e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
136f0 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
13700 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
13710 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
13720 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
13730 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
13740 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
13750 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
13760 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
13770 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
13780 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
13790 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
137a0 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
137b0 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
137c0 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
137d0 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
137e0 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
137f0 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
13800 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
13810 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
13820 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
13830 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
13840 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
13850 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
13860 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
13870 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
13880 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
13890 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
138a0 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
138b0 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
138c0 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
138d0 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71  t now..  */.  sq
138e0 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
138f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
13900 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
13910 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
13920 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
13930 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
13940 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
13950 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
13960 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
13970 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
13980 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
13990 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
139a0 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
139b0 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
139c0 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
139d0 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
139e0 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
139f0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
13a00 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
13a10 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
13a20 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
13a30 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49  >=0 ){.    vdbeI
13a40 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a  nvokeSqllog(p);.
13a50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54      sqlite3VdbeT
13a60 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b  ransferError(p);
13a70 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
13a80 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
13a90 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
13aa0 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  sg = 0;.    if( 
13ab0 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29  p->runOnlyOnce )
13ac0 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
13ad0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
13ae0 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
13af0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
13b00 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
13b10 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
13b20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
13b30 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
13b40 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
13b50 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
13b60 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
13b70 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
13b80 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
13b90 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
13ba0 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
13bb0 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
13bc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
13bd0 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c  thMsg(db, p->rc,
13be0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25   p->zErrMsg ? "%
13bf0 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d  s" : 0, p->zErrM
13c00 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
13c10 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
13c20 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
13c30 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
13c40 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
13c50 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
13c60 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
13c70 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
13c80 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
13c90 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
13ca0 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
13cb0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
13cc0 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
13cd0 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
13ce0 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
13cf0 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
13d00 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
13d10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
13d20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
13d30 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
13d40 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
13d50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
13d60 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
13d70 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
13d80 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
13d90 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
13da0 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69  , "\n");.      i
13db0 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
13dc0 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63        char c, pc
13dd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70   = 0;.        fp
13de0 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
13df0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
13e00 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c  =0; (c = p->zSql
13e10 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
13e20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d           if( pc=
13e30 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
13e40 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
13e50 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f         putc(c, o
13e60 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ut);.          p
13e70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d  c = c;.        }
13e80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21  .        if( pc!
13e90 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
13ea0 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
13eb0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
13ec0 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
13ed0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
13ee0 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20  zHdr[100];.     
13ef0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
13f00 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29  ntf(sizeof(zHdr)
13f10 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32  , zHdr, "%6u %12
13f20 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20  llu %8llu ",.   
13f30 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
13f40 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
13f50 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
13f60 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
13f70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
13f80 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
13f90 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
13fa0 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
13fb0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
13fc0 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b  ut, "%s", zHdr);
13fd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13fe0 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
13ff0 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
14000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
14010 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
14020 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
14030 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d  ->iCurrentTime =
14040 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   0;.  p->magic =
14050 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
14060 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
14070 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
14080 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
14090 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
140a0 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
140b0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
140c0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
140d0 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
140e0 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
140f0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
14100 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
14110 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
14120 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
14130 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
14140 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14150 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
14160 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
14170 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
14180 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
14190 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
141a0 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
141b0 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
141c0 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
141d0 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
141e0 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
141f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14200 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  ./*.** If parame
14210 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20  ter iOp is less 
14220 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
14230 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  invoke the destr
14240 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c  uctor for.** all
14250 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
14260 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74  pointers current
14270 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65  ly cached by the
14280 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a   VM passed as.**
14290 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
142a0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ent..**.** Or, i
142b0 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72  f iOp is greater
142c0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
142d0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
142e0 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a   destructor is.*
142f0 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66  * only invoked f
14300 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61  or those auxilia
14310 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
14320 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
14330 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  user .** functio
14340 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  n invoked by the
14350 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63   OP_Function opc
14360 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69  ode at instructi
14370 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d  on iOp of .** VM
14380 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79   pVdbe, and only
14390 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   then if:.**.** 
143a0 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61     * the associa
143b0 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  ted function par
143c0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32  ameter is the 32
143d0 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75  nd or later (cou
143e0 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72  nting.**      fr
143f0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
14400 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ), or.**.**    *
14410 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
14420 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65  ng bit in argume
14430 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  nt mask is clear
14440 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73   (where the firs
14450 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69  t.**      functi
14460 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72  on parameter cor
14470 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20  responds to bit 
14480 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64  0 etc.)..*/.void
14490 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
144a0 74 65 41 75 78 44 61 74 61 28 56 64 62 65 20 2a  teAuxData(Vdbe *
144b0 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20  pVdbe, int iOp, 
144c0 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78  int mask){.  Aux
144d0 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64  Data **pp = &pVd
144e0 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20  be->pAuxData;.  
144f0 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20  while( *pp ){.  
14500 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20    AuxData *pAux 
14510 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28  = *pp;.    if( (
14520 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28  iOp<0).     || (
14530 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26  pAux->iOp==iOp &
14540 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31  & (pAux->iArg>31
14550 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53   || !(mask & MAS
14560 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72  KBIT32(pAux->iAr
14570 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
14580 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75     testcase( pAu
14590 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20  x->iArg==31 );. 
145a0 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
145b0 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
145c0 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
145d0 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
145e0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
145f0 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20   pAux->pNext;.  
14600 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14610 65 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75  e(pVdbe->db, pAu
14620 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
14630 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e       pp= &pAux->
14640 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
14650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
14660 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
14670 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
14680 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
14690 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
146a0 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20  ,.** except for 
146b0 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77  object itself, w
146c0 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65  hich is preserve
146d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  d..**.** The dif
146e0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
146f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
14700 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
14710 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
14720 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
14730 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
14740 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
14750 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
14760 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
14770 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14780 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68  ion and frees th
14790 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e  e object itself.
147a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
147b0 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
147c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
147d0 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67  e *p){.  SubProg
147e0 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78  ram *pSub, *pNex
147f0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
14800 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
14810 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
14820 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
14830 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61  (p->aVar, p->nVa
14840 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  r);.  releaseMem
14850 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
14860 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
14870 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
14880 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
14890 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
148a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
148b0 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
148c0 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
148d0 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
148e0 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
148f0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14900 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
14910 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61  .  for(i=p->nzVa
14920 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20  r-1; i>=0; i--) 
14930 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14940 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a  , p->azVar[i]);.
14950 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
14960 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d  y(db, p->aOp, p-
14970 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  >nOp);.  sqlite3
14980 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
14990 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
149a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
149b0 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
149c0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
149d0 72 65 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ree);.#ifdef SQL
149e0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
149f0 53 43 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72  SCANSTATUS.  for
14a00 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e  (i=0; i<p->nScan
14a10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
14a20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14a30 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29  >aScan[i].zName)
14a40 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
14a50 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
14a60 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  an);.#endif.}../
14a70 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
14a80 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
14a90 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
14aa0 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
14ab0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
14ac0 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
14ad0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
14ae0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
14af0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14b00 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
14b10 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
14b20 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62  beClearObject(db
14b30 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  , p);.  if( p->p
14b40 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
14b50 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
14b60 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
14b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
14b80 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
14b90 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e   db->pVdbe = p->
14ba0 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
14bb0 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
14bc0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
14bd0 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
14be0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
14bf0 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
14c00 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71   p->db = 0;.  sq
14c10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14c20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  p);.}../*.** The
14c30 20 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20   cursor "p" has 
14c40 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f  a pending seek o
14c50 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61  peration that ha
14c60 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a  s not yet been.*
14c70 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20  * carried out.  
14c80 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20  Seek the cursor 
14c90 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  now.  If an erro
14ca0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
14cb0 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
14cc0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ate error code..
14cd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
14ce0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61  LITE_NOINLINE ha
14cf0 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
14d00 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
14d10 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63  ){.  int res, rc
14d20 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
14d30 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
14d40 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
14d50 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
14d60 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65   assert( p->defe
14d70 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20  rredMoveto );.  
14d80 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
14d90 6c 65 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  le );.  rc = sql
14da0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
14db0 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73  npacked(p->pCurs
14dc0 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f  or, 0, p->moveto
14dd0 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29  Target, 0, &res)
14de0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
14df0 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65  urn rc;.  if( re
14e00 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  s!=0 ) return SQ
14e10 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
14e20 54 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  T;.#ifdef SQLITE
14e30 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
14e40 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
14e50 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65  #endif.  p->defe
14e60 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
14e70 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
14e80 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
14e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14ea0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  OK;.}../*.** Som
14eb0 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64  ething has moved
14ec0 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20   cursor "p" out 
14ed0 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65  of place.  Maybe
14ee0 20 74 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a   the row it was.
14ef0 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61  ** pointed to wa
14f00 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
14f10 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72  om under it.  Or
14f20 20 6d 61 79 62 65 20 74 68 65 20 62 74 72 65 65   maybe the btree
14f30 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63   was.** rebalanc
14f40 65 64 2e 20 20 57 68 61 74 65 76 65 72 20 74 68  ed.  Whatever th
14f50 65 20 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20  e cause, try to 
14f60 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74  restore "p" to t
14f70 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69  he place it.** i
14f80 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65  s supposed to be
14f90 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74   pointing.  If t
14fa0 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74  he row was delet
14fb0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
14fc0 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c  r the.** cursor,
14fd0 20 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20   set the cursor 
14fe0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55  to point to a NU
14ff0 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  LL row..*/.stati
15000 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
15010 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65  NLINE handleMove
15020 64 43 75 72 73 6f 72 28 56 64 62 65 43 75 72 73  dCursor(VdbeCurs
15030 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73  or *p){.  int is
15040 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63  DifferentRow, rc
15050 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
15060 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61  Cursor!=0 );.  a
15070 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
15080 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
15090 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 3b  d(p->pCursor) );
150a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
150b0 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
150c0 65 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 69  e(p->pCursor, &i
150d0 73 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a  sDifferentRow);.
150e0 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
150f0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
15100 20 20 69 66 28 20 69 73 44 69 66 66 65 72 65 6e    if( isDifferen
15110 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f  tRow ) p->nullRo
15120 77 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  w = 1;.  return 
15130 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
15140 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ck to ensure tha
15150 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
15160 76 61 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20  valid.  Restore 
15170 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66  the cursor.** if
15180 20 6e 65 65 64 20 62 65 2e 20 20 52 65 74 75 72   need be.  Retur
15190 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20  n any I/O error 
151a0 66 72 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65  from the restore
151b0 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69   operation..*/.i
151c0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
151d0 72 73 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65  rsorRestore(Vdbe
151e0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
151f0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
15200 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
15210 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
15220 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
15230 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
15240 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15250 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
15260 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73  ke sure the curs
15270 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f  or p is ready to
15280 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
15290 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20  he row to which 
152a0 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
152b0 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75  ositioned.  Retu
152c0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
152d0 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74   if an OOM fault
152e0 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a   or I/O error.**
152f0 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
15300 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68  m positioning th
15310 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20  e cursor to its 
15320 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e  correct position
15330 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ..**.** If a Mov
15340 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
15350 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
15360 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
15370 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
15380 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f  veTo now.  If no
15390 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67   move is pending
153a0 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
153b0 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65  f the row has be
153c0 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75  en.** deleted ou
153d0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
153e0 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69   cursor and if i
153f0 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20  t has, mark the 
15400 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c  row as.** a NULL
15410 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row..**.** If t
15420 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
15430 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
15440 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77   the correct row
15450 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61   and that row ha
15460 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65  s.** not been de
15470 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
15480 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c  nder the cursor,
15490 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
154a0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
154b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
154c0 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64  eCursorMoveto(Vd
154d0 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
154e0 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
154f0 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 72 65 74  oveto ){.    ret
15500 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72  urn handleDeferr
15510 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 7d  edMoveto(p);.  }
15520 0a 20 20 69 66 28 20 70 2d 3e 70 43 75 72 73 6f  .  if( p->pCurso
15530 72 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  r && sqlite3Btre
15540 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
15550 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  p->pCursor) ){. 
15560 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
15570 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
15580 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15590 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
155a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
155b0 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
155c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
155d0 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
155e0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
155f0 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
15600 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
15610 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
15620 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
15630 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
15640 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
15650 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
15660 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
15670 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
15680 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
15690 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
156a0 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
156b0 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
156c0 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
156d0 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
156e0 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
156f0 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
15700 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
15710 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
15720 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
15730 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
15740 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
15750 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
15760 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
15770 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
15780 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
15790 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
157a0 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
157b0 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
157c0 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
157d0 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
157e0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
157f0 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
15800 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
15810 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
15820 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
15830 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
15840 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
15850 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
15860 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
15870 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a  b separately..**
15880 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
15890 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
158a0 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
158b0 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
158c0 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
158d0 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
158e0 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
158f0 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
15900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
15910 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
15920 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
15930 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15950 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
15960 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
15990 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
159a0 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
159b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
159c0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
159d0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
159e0 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
159f0 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
15a00 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
15a10 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
15a40 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
15a50 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
15a60 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
15a70 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
15a80 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
15a90 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
15aa0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
15ab0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
15ac0 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ae0 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
15af0 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
15b00 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
15b10 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15b20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
15b30 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
15b60 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
15b70 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
15b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
15ba0 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
15bb0 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
15bc0 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
15bd0 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
15be0 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
15bf0 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
15c00 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
15c10 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
15c20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
15c30 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
15c40 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
15c50 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
15c60 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
15c70 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
15c80 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
15c90 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
15ca0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
15cb0 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
15cc0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
15cd0 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
15ce0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
15cf0 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
15d00 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
15d10 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
15d20 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32  em->flags;.  u32
15d30 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   n;..  if( flags
15d40 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
15d50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
15d60 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
15d70 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
15d80 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
15d90 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
15da0 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
15db0 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
15dc0 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
15dd0 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
15de0 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
15df0 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
15e00 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20   u;.    if( i<0 
15e10 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b  ){.      u = ~i;
15e20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15e30 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20    u = i;.    }. 
15e40 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b     if( u<=127 ){
15e50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28  .      return ((
15e60 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f  i&1)==i && file_
15e70 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28  format>=4) ? 8+(
15e80 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d  u32)u : 1;.    }
15e90 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
15ea0 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  7 ) return 2;.  
15eb0 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
15ec0 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
15ed0 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
15ee0 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  47 ) return 4;. 
15ef0 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
15f00 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a  YTE ) return 5;.
15f10 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
15f20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
15f30 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65  M_Real ){.    re
15f40 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73  turn 7;.  }.  as
15f50 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e  sert( pMem->db->
15f60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
15f70 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
15f80 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73  EM_Blob) );.  as
15f90 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30  sert( pMem->n>=0
15fa0 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70   );.  n = (u32)p
15fb0 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c  Mem->n;.  if( fl
15fc0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
15fd0 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d  {.    n += pMem-
15fe0 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20  >u.nZero;.  }.  
15ff0 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
16000 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
16010 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
16020 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16030 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
16040 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
16050 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
16060 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
16070 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
16080 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
16090 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
160a0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
160b0 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74  e>=12 ){.    ret
160c0 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
160d0 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
160e0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
160f0 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b  t u8 aSize[] = {
16100 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   0, 1, 2, 3, 4, 
16110 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30  6, 8, 8, 0, 0, 0
16120 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72  , 0 };.    retur
16130 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74  n aSize[serial_t
16140 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ype];.  }.}../*.
16150 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
16160 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
16170 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
16180 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
16190 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
161a0 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
161b0 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
161c0 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
161d0 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
161e0 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
161f0 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
16200 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
16210 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
16220 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
16230 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
16240 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
16250 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
16260 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
16270 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
16280 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
16290 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
162a0 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
162b0 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
162c0 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
162d0 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
162e0 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
162f0 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
16300 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
16310 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
16320 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
16330 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
16340 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
16350 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
16360 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
16370 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
16380 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
16390 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
163a0 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
163b0 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
163c0 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
163d0 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
163e0 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
163f0 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
16400 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
16410 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
16420 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
16430 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
16440 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
16450 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
16460 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
16470 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
16480 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
16490 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
164a0 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
164b0 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
164c0 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
164d0 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
164e0 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
164f0 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
16500 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
16510 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
16520 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
16530 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
16540 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
16550 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
16560 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
16570 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
16580 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
16590 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
165a0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
165b0 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
165c0 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
165d0 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
165e0 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
165f0 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
16600 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
16610 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
16620 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
16630 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
16640 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
16650 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
16660 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
16670 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
16680 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
16690 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
166a0 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
166b0 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
166c0 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
166d0 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
166e0 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
166f0 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
16700 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
16710 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
16720 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
16730 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
16740 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
16750 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
16760 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
16770 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
16780 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
16790 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
167a0 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
167b0 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
167c0 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
167d0 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
167e0 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
167f0 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
16800 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
16810 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
16820 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
16830 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
16840 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
16850 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
16860 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
16870 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
16880 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
16890 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
168a0 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
168b0 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
168c0 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
168d0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
168e0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
168f0 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
16900 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
16910 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
16920 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
16930 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
16940 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
16950 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
16960 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
16970 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
16980 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
16990 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
169a0 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
169b0 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
169c0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
169d0 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
169e0 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  [].  The caller 
169f0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a  is responsible.*
16a00 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67  * for allocating
16a10 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
16a20 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74   buf[] to hold t
16a30 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c  he entire field,
16a40 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66   exclusive.** of
16a50 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65   the pMem->u.nZe
16a60 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d  ro bytes for a M
16a70 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  EM_Zero value..*
16a80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16a90 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16aa0 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
16ab0 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
16ac0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
16ad0 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
16ae0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
16af0 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
16b00 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
16b10 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
16b20 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
16b30 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
16b40 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
16b50 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
16b60 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73  Mem *pMem, u32 s
16b70 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75  erial_type){.  u
16b80 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  32 len;..  /* In
16b90 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
16ba0 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
16bb0 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c  ype<=7 && serial
16bc0 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75  _type>0 ){.    u
16bd0 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b  64 v;.    u32 i;
16be0 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
16bf0 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
16c00 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
16c10 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  v)==sizeof(pMem-
16c20 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  >u.r) );.      m
16c30 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
16c40 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  >u.r, sizeof(v))
16c50 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
16c60 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
16c70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16c80 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
16c90 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
16ca0 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
16cb0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
16cc0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
16cd0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
16ce0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66     do{.      buf
16cf0 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30  [--i] = (u8)(v&0
16d00 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
16d10 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 8;.    }while(
16d20 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   i );.    return
16d30 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
16d40 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
16d50 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
16d60 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
16d70 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
16d80 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
16d90 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
16da0 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20  >u.nZero:0).    
16db0 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74           == (int
16dc0 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  )sqlite3VdbeSeri
16dd0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
16de0 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65  _type) );.    le
16df0 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  n = pMem->n;.   
16e00 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
16e10 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
16e20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
16e30 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
16e40 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
16e50 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
16e60 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73  ./* Input "x" is
16e70 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75   a sequence of u
16e80 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65  nsigned characte
16e90 72 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  rs that represen
16ea0 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61  t a.** big-endia
16eb0 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75  n integer.  Retu
16ec0 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  rn the equivalen
16ed0 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72  t native integer
16ee0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f  .*/.#define ONE_
16ef0 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
16f00 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66  (i8)(x)[0]).#def
16f10 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  ine TWO_BYTE_INT
16f20 28 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29  (x)    (256*(i8)
16f30 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29  ((x)[0])|(x)[1])
16f40 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42  .#define THREE_B
16f50 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35  YTE_INT(x)  (655
16f60 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  36*(i8)((x)[0])|
16f70 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[1]<<8)|(x)[
16f80 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52  2]).#define FOUR
16f90 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28  _BYTE_UINT(x)  (
16fa0 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34  ((u32)(x)[0]<<24
16fb0 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
16fc0 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
16fd0 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
16fe0 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37  BYTE_INT(x) (167
16ff0 37 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30  77216*(i8)((x)[0
17000 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c  ])|((x)[1]<<16)|
17010 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[2]<<8)|(x)[
17020 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72  3])../*.** Deser
17030 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20  ialize the data 
17040 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20  blob pointed to 
17050 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c  by buf as serial
17060 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70   type serial_typ
17070 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74  e.** and store t
17080 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65  he result in pMe
17090 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  m.  Return the n
170a0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
170b0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
170c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
170d0 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73  emented as two s
170e0 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73  eparate routines
170f0 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65   for performance
17100 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73  ..** The few cas
17110 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  es that require 
17120 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
17130 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69  are broken out i
17140 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a  nto a separate.*
17150 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  * routine so tha
17160 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20  t in most cases 
17170 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
17180 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b  moving the stack
17190 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61   pointer.** is a
171a0 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74  voided..*/ .stat
171b0 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f  ic u32 SQLITE_NO
171c0 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74  INLINE serialGet
171d0 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
171e0 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
171f0 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
17200 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
17210 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
17220 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
17230 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
17240 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
17250 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17270 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
17280 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
17290 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75  e into */.){.  u
172a0 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
172b0 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33  _UINT(buf);.  u3
172c0 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  2 y = FOUR_BYTE_
172d0 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78  UINT(buf+4);.  x
172e0 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a   = (x<<32) + y;.
172f0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
17300 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==6 ){.    /* E
17310 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39  VIDENCE-OF: R-29
17320 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20  851-52272 Value 
17330 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
17340 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77  64-bit.    ** tw
17350 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
17360 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d  teger. */.    pM
17370 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
17380 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  )&x;.    pMem->f
17390 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
173a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
173b0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d  em->u.i<0 );.  }
173c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49  else{.    /* EVI
173d0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34  DENCE-OF: R-5734
173e0 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73  3-49114 Value is
173f0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45   a big-endian IE
17400 45 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62  EE 754-2008 64-b
17410 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69  it.    ** floati
17420 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e  ng point number.
17430 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
17440 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
17450 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
17460 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
17470 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
17480 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
17490 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
174a0 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
174b0 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20  ame.    ** byte 
174c0 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74  order.  Or, that
174d0 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44   if SQLITE_MIXED
174e0 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
174f0 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  OAT is.    ** de
17500 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
17510 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
17520 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
17530 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20  re mixed.    ** 
17540 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  endian..    */. 
17550 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
17560 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
17570 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
17580 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
17590 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
175a0 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74  ;.    u64 t2 = t
175b0 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  1;.    swapMixed
175c0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
175d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
175e0 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28  eof(r1)==sizeof(
175f0 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72  t2) && memcmp(&r
17600 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72  1, &t2, sizeof(r
17610 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  1))==0 );.#endif
17620 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
17630 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
17640 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d  eof(pMem->u.r)==
17650 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78  8 );.    swapMix
17660 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
17670 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d  ;.    memcpy(&pM
17680 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a  em->u.r, &x, siz
17690 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65  eof(x));.    pMe
176a0 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
176b0 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e  e3IsNaN(pMem->u.
176c0 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20  r) ? MEM_Null : 
176d0 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20  MEM_Real;.  }.  
176e0 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20  return 8;.}.u32 
176f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17700 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
17710 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
17720 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
17730 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
17740 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
17750 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
17760 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
17770 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
17780 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
17790 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
177a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
177b0 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
177c0 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
177d0 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
177e0 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
177f0 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
17800 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
17810 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
17820 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
17830 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
17840 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
17850 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20  {  /* Null */.  
17860 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17870 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37  OF: R-24078-0937
17880 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c  5 Value is a NUL
17890 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  L. */.      pMem
178a0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
178b0 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
178c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
178d0 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  1: {.      /* EV
178e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38  IDENCE-OF: R-448
178f0 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69  85-25196 Value i
17900 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d  s an 8-bit twos-
17910 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20  complement.     
17920 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   ** integer. */.
17930 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
17940 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62  = ONE_BYTE_INT(b
17950 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
17960 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
17970 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17980 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
17990 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
179a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
179b0 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
179c0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
179d0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
179e0 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33  CE-OF: R-49794-3
179f0 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20  5026 Value is a 
17a00 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69  big-endian 16-bi
17a10 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
17a20 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
17a30 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
17a40 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54  m->u.i = TWO_BYT
17a50 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
17a60 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
17a70 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
17a80 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
17a90 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
17aa0 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
17ab0 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
17ac0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
17ad0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
17ae0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17af0 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75  37839-54301 Valu
17b00 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
17b10 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 24-bit.      *
17b20 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
17b30 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
17b40 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
17b50 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62  THREE_BYTE_INT(b
17b60 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
17b70 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
17b80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17b90 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
17ba0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b  .      return 3;
17bb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17bc0 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
17bd0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
17be0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
17bf0 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32  CE-OF: R-01849-2
17c00 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20  6079 Value is a 
17c10 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69  big-endian 32-bi
17c20 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
17c30 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
17c40 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
17c50 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
17c60 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
17c70 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
17c80 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
17c90 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
17ca0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
17cb0 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20  eturn 4;.    }. 
17cc0 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
17cd0 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
17ce0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
17cf0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17d00 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c  -50385-09674 Val
17d10 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
17d20 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20  an 48-bit.      
17d30 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
17d40 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
17d50 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
17d60 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
17d70 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29  buf+2) + (((i64)
17d80 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
17d90 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
17da0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
17db0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
17dc0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
17dd0 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
17de0 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
17df0 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
17e00 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
17e10 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
17e20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
17e30 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
17e40 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73       /* These us
17e50 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  e local variable
17e60 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e  s, so do them in
17e70 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74   a separate rout
17e80 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ine.      ** to 
17e90 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20  avoid having to 
17ea0 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70  move the frame p
17eb0 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f  ointer in the co
17ec0 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
17ed0 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c     return serial
17ee0 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74  Get(buf,serial_t
17ef0 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d  ype,pMem);.    }
17f00 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
17f10 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
17f20 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
17f30 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
17f40 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
17f50 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38  -OF: R-12976-228
17f60 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20  93 Value is the 
17f70 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20  integer 0. */.  
17f80 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17f90 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32  OF: R-18143-1212
17fa0 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  1 Value is the i
17fb0 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20  nteger 1. */.   
17fc0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
17fd0 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
17fe0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
17ff0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
18000 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
18010 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
18020 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
18030 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31  E-OF: R-14606-31
18040 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42  564 Value is a B
18050 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31  LOB that is (N-1
18060 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20  2)/2 bytes in.  
18070 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20      ** length.. 
18080 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
18090 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31  -OF: R-28401-001
180a0 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74  40 Value is a st
180b0 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74  ring in the text
180c0 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20   encoding and.  
180d0 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20      ** (N-13)/2 
180e0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
180f0 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
18100 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67   const u16 aFlag
18110 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c  [] = { MEM_Blob|
18120 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53  MEM_Ephem, MEM_S
18130 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a  tr|MEM_Ephem };.
18140 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
18150 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
18160 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65     pMem->n = (se
18170 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
18180 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
18190 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61  gs = aFlag[seria
181a0 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20  l_type&1];.     
181b0 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b   return pMem->n;
181c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
181d0 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54  urn 0;.}./*.** T
181e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
181f0 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
18200 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
18210 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64   for an Unpacked
18220 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74  Record.** struct
18230 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ure large enough
18240 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
18250 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
18260 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a  rdUnpack() if.**
18270 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
18280 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
18290 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75   to KeyInfo stru
182a0 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a  cture pKeyInfo..
182b0 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20  **.** The space 
182c0 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61  is either alloca
182d0 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
182e0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f  3DbMallocRaw() o
182f0 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a  r from within.**
18300 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62   the unaligned b
18310 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61  uffer passed via
18320 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20   the second and 
18330 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20  third arguments 
18340 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73  (presumably.** s
18350 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20  tack space). If 
18360 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e  the former, then
18370 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
18380 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61  to a pointer tha
18390 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65  t should.** be e
183a0 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
183b0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
183c0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
183d0 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  e(). Or, if the 
183e0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  .** allocation c
183f0 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53  omes from the pS
18400 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66  pace/szSpace buf
18410 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20  fer, *ppFree is 
18420 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62  set to NULL.** b
18430 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
18440 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
18450 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
18460 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
18470 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f  .*/.UnpackedReco
18480 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41  rd *sqlite3VdbeA
18490 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f  llocUnpackedReco
184a0 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  rd(.  KeyInfo *p
184b0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
184c0 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70        /* Descrip
184d0 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f  tion of the reco
184e0 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  rd */.  char *pS
184f0 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
18500 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69          /* Unali
18510 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c  gned space avail
18520 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  able */.  int sz
18530 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
18540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
18550 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e  e of pSpace[] in
18560 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
18570 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20   **ppFree       
18580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
18590 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c  UT: Caller shoul
185a0 64 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e  d free this poin
185b0 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61  ter */.){.  Unpa
185c0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20  ckedRecord *p;  
185d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
185e0 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74  npacked record t
185f0 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
18600 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t nOff;         
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18620 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63   Increment pSpac
18630 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69  e by nOff to ali
18640 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  gn it */.  int n
18650 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
18660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18670 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
18680 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f  quired for *p */
18690 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74  ..  /* We want t
186a0 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e  o shift the poin
186b0 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75  ter pSpace up su
186c0 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d  ch that it is 8-
186d0 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20  byte aligned..  
186e0 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64  ** Thus, we need
186f0 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20   to calculate a 
18700 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74  value, nOff, bet
18710 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f  ween 0 and 7, to
18720 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20   shift .  ** it 
18730 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69  by.  If pSpace i
18740 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65  s already 8-byte
18750 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73   aligned, nOff s
18760 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20  hould be zero.. 
18770 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20   */.  nOff = (8 
18780 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  - (SQLITE_PTR_TO
18790 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37  _INT(pSpace) & 7
187a0 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20  )) & 7;.  nByte 
187b0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
187c0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
187d0 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28   + sizeof(Mem)*(
187e0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
187f0 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  +1);.  if( nByte
18800 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b  >szSpace+nOff ){
18810 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  .    p = (Unpack
18820 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74  edRecord *)sqlit
18830 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b  e3DbMallocRaw(pK
18840 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74  eyInfo->db, nByt
18850 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  e);.    *ppFree 
18860 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20  = (char *)p;.   
18870 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
18880 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
18890 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
188a0 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f  cord*)&pSpace[nO
188b0 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65  ff];.    *ppFree
188c0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e   = 0;.  }..  p->
188d0 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28  aMem = (Mem*)&((
188e0 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28  char*)p)[ROUND8(
188f0 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
18900 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65  ecord))];.  asse
18910 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
18920 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
18930 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70   p->pKeyInfo = p
18940 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46  KeyInfo;.  p->nF
18950 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ield = pKeyInfo-
18960 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72  >nField + 1;.  r
18970 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
18980 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79  * Given the nKey
18990 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f  -byte encoding o
189a0 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b  f a record in pK
189b0 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74  ey[], populate t
189c0 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52  he .** UnpackedR
189d0 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20  ecord structure 
189e0 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
189f0 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74   fourth argument
18a00 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e   with the.** con
18a10 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63  tents of the dec
18a20 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20  oded record..*/ 
18a30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
18a40 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20  eRecordUnpack(. 
18a50 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
18a60 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  fo,     /* Infor
18a70 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
18a80 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a   record format *
18a90 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20  /.  int nKey,   
18aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
18ab0 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79  ze of the binary
18ac0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
18ad0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
18ae0 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72      /* The binar
18af0 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e  y record */.  Un
18b00 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20  packedRecord *p 
18b10 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
18b20 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
18b30 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
18b40 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  . */.){.  const 
18b50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
18b60 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  Key = (const uns
18b70 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
18b80 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75  y;.  int d; .  u
18b90 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  32 idx;         
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18bb0 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79  * Offset in aKey
18bc0 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  [] to read from 
18bd0 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20  */.  u16 u;     
18be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bf0 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
18c00 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
18c10 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
18c20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61  Mem *pMem = p->a
18c30 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75  Mem;..  p->defau
18c40 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73  lt_rc = 0;.  ass
18c50 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
18c60 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20  ALIGNMENT(pMem) 
18c70 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  );.  idx = getVa
18c80 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
18c90 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72  dr);.  d = szHdr
18ca0 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  u = 0;.  whi
18cb0 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26  le( idx<szHdr &&
18cc0 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20   d<=nKey ){.    
18cd0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
18ce0 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  ..    idx += get
18cf0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69  Varint32(&aKey[i
18d00 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx], serial_type
18d10 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  );.    pMem->enc
18d20 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
18d30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d  ;.    pMem->db =
18d40 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
18d50 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67     /* pMem->flag
18d60 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65  s = 0; // sqlite
18d70 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
18d80 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66   will set this f
18d90 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65  or us */.    pMe
18da0 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m->szMalloc = 0;
18db0 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65  .    d += sqlite
18dc0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
18dd0 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f  aKey[d], serial_
18de0 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  type, pMem);.   
18df0 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28   pMem++;.    if(
18e00 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c   (++u)>=p->nFiel
18e10 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  d ) break;.  }. 
18e20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
18e30 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
18e40 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
18e50 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  = u;.}..#if SQLI
18e60 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
18e70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
18e80 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20  pares two index 
18e90 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  or table record 
18ea0 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65  keys in the same
18eb0 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73   way.** as the s
18ec0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
18ed0 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e  Compare() routin
18ee0 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65  e. Unlike VdbeRe
18ef0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a  cordCompare(),.*
18f00 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
18f10 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64  deserializes and
18f20 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73   compares values
18f30 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
18f40 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
18f50 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
18f60 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e  MemCompare() fun
18f70 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73  ctions. It is us
18f80 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  ed.** in assert(
18f90 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
18fa0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
18fb0 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69  optimized code i
18fc0 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  n.** sqlite3Vdbe
18fd0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
18fe0 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20  returns results 
18ff0 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70  with these two p
19000 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a  rimitives..**.**
19010 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
19020 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
19030 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69  mparison is equi
19040 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65  valent to desire
19050 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75  dResult..** Retu
19060 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72  rn false if ther
19070 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d  e is a disagreem
19080 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
19090 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
190a0 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74  pareDebug(.  int
190b0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
190c0 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
190d0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  ft key */.  cons
190e0 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  t UnpackedRecord
190f0 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67   *pPKey2, /* Rig
19100 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
19110 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20  desiredResult   
19120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
19130 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29  rect answer */.)
19140 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
19150 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
19160 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
19170 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
19180 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
19190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
191a0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
191b0 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
191c0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
191d0 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
191e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
191f0 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
19200 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
19210 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  t rc = 0;.  cons
19220 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
19230 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
19240 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
19250 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f  pKey1;.  KeyInfo
19260 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65   *pKeyInfo;.  Me
19270 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49  m mem1;..  pKeyI
19280 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
19290 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b  eyInfo;.  if( pK
192a0 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20  eyInfo->db==0 ) 
192b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31  return 1;.  mem1
192c0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
192d0 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
192e0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
192f0 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
19300 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
19310 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
19320 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19330 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
19340 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
19350 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
19360 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
19370 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
19380 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
19390 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
193a0 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
193b0 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
193c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
193d0 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
193e0 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
193f0 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
19400 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
19410 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
19420 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
19430 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
19440 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69  ally be used uni
19450 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20  nitialized, and 
19460 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  doing .  ** the 
19470 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74  unnecessary init
19480 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61  ialization has a
19490 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61   measurable nega
194a0 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  tive performance
194b0 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69  .  ** impact, si
194c0 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
194d0 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20   is a very high 
194e0 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c  runner.  And so,
194f0 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20   we choose.  ** 
19500 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f  to ignore the co
19510 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
19520 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76  and leave this v
19530 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61  ariable uninitia
19540 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  lized..  */.  /*
19550 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20    mem1.u.i = 0; 
19560 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20   // not needed, 
19570 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20  here to silence 
19580 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
19590 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   */.  .  idx1 = 
195a0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
195b0 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31  1, szHdr1);.  d1
195c0 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73   = szHdr1;.  ass
195d0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
195e0 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e  Field+pKeyInfo->
195f0 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
19600 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55  >nField || CORRU
19610 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
19620 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
19630 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
19640 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
19650 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  ->nField>0 );.  
19660 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
19670 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
19680 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
19690 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
196a0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
196b0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
196c0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
196d0 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
196e0 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
196f0 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
19700 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
19710 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f  _type1 );..    /
19720 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
19730 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65  ere is enough ke
19740 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e  y space remainin
19750 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a  g to avoid.    *
19760 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72  * a buffer overr
19770 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65  ead.  The "d1+se
19780 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75  rial_type1+2" su
19790 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c  bexpression will
197a0 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62  .    ** always b
197b0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
197c0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
197d0 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65  mount of require
197e0 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20  d key space..   
197f0 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70   ** Use that app
19800 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76  roximation to av
19810 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70  oid the more exp
19820 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20  ensive call to. 
19830 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
19840 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
19850 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
19860 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
19870 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79  if( d1+serial_ty
19880 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31  pe1+2>(u32)nKey1
19890 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69  .     && d1+sqli
198a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
198b0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
198c0 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20  1)>(u32)nKey1 . 
198d0 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
198e0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
198f0 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
19900 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
19910 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
19920 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
19930 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
19940 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
19950 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
19960 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
19970 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
19980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
19990 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
199a0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
199b0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
199c0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
199d0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
199e0 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
199f0 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
19a00 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
19a10 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  /.      if( pKey
19a20 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
19a30 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
19a40 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76  c = -rc;  /* Inv
19a50 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66  ert the result f
19a60 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64  or DESC sort ord
19a70 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  er. */.      }. 
19a80 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43       goto debugC
19a90 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d  ompareEnd;.    }
19aa0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69  .    i++;.  }whi
19ab0 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
19ac0 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
19ad0 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  eld );..  /* No 
19ae0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
19af0 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
19b00 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
19b10 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
19b20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
19b30 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
19b40 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
19b50 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
19b60 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
19b70 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
19b80 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
19b90 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a  Release(&mem1)..
19ba0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
19bb0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
19bc0 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
19bd0 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
19be0 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
19bf0 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
19c00 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
19c10 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
19c20 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
19c30 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
19c40 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
19c50 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63   value.  */.  rc
19c60 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
19c70 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d  lt_rc;..debugCom
19c80 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64  pareEnd:.  if( d
19c90 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20  esiredResult==0 
19ca0 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72  && rc==0 ) retur
19cb0 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72  n 1;.  if( desir
19cc0 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63  edResult<0 && rc
19cd0 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
19ce0 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
19cf0 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72  lt>0 && rc>0 ) r
19d00 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43  eturn 1;.  if( C
19d10 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
19d20 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79  rn 1;.  if( pKey
19d30 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
19d40 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
19d50 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
19d60 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42  .#endif../*.** B
19d70 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a  oth *pMem1 and *
19d80 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74  pMem2 contain st
19d90 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d  ring values. Com
19da0 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c  pare the two val
19db0 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ues.** using the
19dc0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
19dd0 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73  nce pColl. As us
19de0 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65  ual, return a ne
19df0 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a  gative , zero.**
19e00 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c   or positive val
19e10 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20  ue if *pMem1 is 
19e20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
19e30 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74   to or greater t
19e40 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20  han .** *pMem2, 
19e50 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69  respectively. Si
19e60 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20  milar in spirit 
19e70 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31  to "rc = (*pMem1
19e80 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a  ) - (*pMem2);"..
19e90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
19ea0 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
19eb0 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  ng(.  const Mem 
19ec0 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20  *pMem1,.  const 
19ed0 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f  Mem *pMem2,.  co
19ee0 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
19ef0 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72  ll,.  u8 *prcErr
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f        /* If an O
19f20 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  OM occurs, set t
19f30 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a  o SQLITE_NOMEM *
19f40 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31  /.){.  if( pMem1
19f50 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e  ->enc==pColl->en
19f60 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  c ){.    /* The 
19f70 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65  strings are alre
19f80 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65  ady in the corre
19f90 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61  ct encoding.  Ca
19fa0 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63  ll the.     ** c
19fb0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
19fc0 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20  on directly */. 
19fd0 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d     return pColl-
19fe0 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
19ff0 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d  er,pMem1->n,pMem
1a000 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d  1->z,pMem2->n,pM
1a010 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65  em2->z);.  }else
1a020 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1a030 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31    const void *v1
1a040 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e  , *v2;.    int n
1a050 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63  1, n2;.    Mem c
1a060 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20  1;.    Mem c2;. 
1a070 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1a080 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31  mInit(&c1, pMem1
1a090 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  ->db, MEM_Null);
1a0a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a0b0 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65  MemInit(&c2, pMe
1a0c0 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  m1->db, MEM_Null
1a0d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a0e0 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1a0f0 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d  (&c1, pMem1, MEM
1a100 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c  _Ephem);.    sql
1a110 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c  ite3VdbeMemShall
1a120 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d  owCopy(&c2, pMem
1a130 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20  2, MEM_Ephem);. 
1a140 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56     v1 = sqlite3V
1a150 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
1a160 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43  3_value*)&c1, pC
1a170 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e  oll->enc);.    n
1a180 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20  1 = v1==0 ? 0 : 
1a190 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73  c1.n;.    v2 = s
1a1a0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1a1b0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
1a1c0 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c2, pColl->enc)
1a1d0 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30  ;.    n2 = v2==0
1a1e0 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20   ? 0 : c2.n;.   
1a1f0 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d   rc = pColl->xCm
1a200 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20  p(pColl->pUser, 
1a210 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b  n1, v1, n2, v2);
1a220 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a230 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b  MemRelease(&c1);
1a240 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a250 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b  MemRelease(&c2);
1a260 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20  .    if( (v1==0 
1a270 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63  || v2==0) && prc
1a280 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20  Err ) *prcErr = 
1a290 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1a2a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1a2b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1a2c0 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65  e two blobs.  Re
1a2d0 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1a2e0 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1a2f0 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   if the first.**
1a300 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1a310 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
1a320 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63  ter than the sec
1a330 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ond, respectivel
1a340 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f  y..** If one blo
1a350 62 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  b is a prefix of
1a360 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e   the other, then
1a370 20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20   the shorter is 
1a380 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73  the lessor..*/.s
1a390 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
1a3a0 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65  NLINE int sqlite
1a3b0 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e  3BlobCompare(con
1a3c0 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e  st Mem *pB1, con
1a3d0 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20  st Mem *pB2){.  
1a3e0 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70  int c = memcmp(p
1a3f0 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70  B1->z, pB2->z, p
1a400 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70  B1->n>pB2->n ? p
1a410 42 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b  B2->n : pB1->n);
1a420 0a 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72  .  if( c ) retur
1a430 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  n c;.  return pB
1a440 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d  1->n - pB2->n;.}
1a450 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
1a460 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74   the values cont
1a470 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f  ained by the two
1a480 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72   memory cells, r
1a490 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61  eturning.** nega
1a4a0 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f  tive, zero or po
1a4b0 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20  sitive if pMem1 
1a4c0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1a4d0 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1a4e0 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32  er.** than pMem2
1a4f0 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20  . Sorting order 
1a500 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c  is NULL's first,
1a510 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d   followed by num
1a520 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a  bers (integers.*
1a530 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72  * and reals) sor
1a540 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c  ted numerically,
1a550 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78   followed by tex
1a560 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65  t ordered by the
1a570 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
1a580 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64  quence pColl and
1a590 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20   finally blob's 
1a5a0 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d  ordered by memcm
1a5b0 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  p()..**.** Two N
1a5c0 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63  ULL values are c
1a5d0 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20  onsidered equal 
1a5e0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1a5f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a600 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  MemCompare(const
1a610 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e   Mem *pMem1, con
1a620 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63  st Mem *pMem2, c
1a630 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1a640 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20  oll){.  int f1, 
1a650 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e  f2;.  int combin
1a660 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20  ed_flags;..  f1 
1a670 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a  = pMem1->flags;.
1a680 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c    f2 = pMem2->fl
1a690 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f  ags;.  combined_
1a6a0 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20  flags = f1|f2;. 
1a6b0 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e   assert( (combin
1a6c0 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  ed_flags & MEM_R
1a6d0 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20  owSet)==0 );. . 
1a6e0 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1a6f0 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20   is NULL, it is 
1a700 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74  less than the ot
1a710 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c  her. If both val
1a720 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  ues.  ** are NUL
1a730 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  L, return 0..  *
1a740 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1a750 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  _flags&MEM_Null 
1a760 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66  ){.    return (f
1a770 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66  2&MEM_Null) - (f
1a780 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  1&MEM_Null);.  }
1a790 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
1a7a0 6c 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72 20  lue is a number 
1a7b0 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
1a7c0 20 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65 72   not, the number
1a7d0 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49   is less..  ** I
1a7e0 66 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62 65  f both are numbe
1a7f0 72 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20 72  rs, compare as r
1a800 65 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20 61  eals if one is a
1a810 20 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74   real, or as int
1a820 65 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f  egers.  ** if bo
1a830 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 69 6e  th values are in
1a840 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  tegers..  */.  i
1a850 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1a860 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  s&(MEM_Int|MEM_R
1a870 65 61 6c 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  eal) ){.    doub
1a880 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 69  le r1, r2;.    i
1a890 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45  f( (f1 & f2 & ME
1a8a0 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1a8b0 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1a8c0 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i < pMem2->u.i )
1a8d0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1a8e0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1a8f0 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   > pMem2->u.i ) 
1a900 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
1a910 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1a920 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f      if( (f1&MEM_
1a930 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1a940 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e 75 2e    r1 = pMem1->u.
1a950 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
1a960 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f1&MEM_Int)!=0
1a970 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 28   ){.      r1 = (
1a980 64 6f 75 62 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e  double)pMem1->u.
1a990 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
1a9a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a9b0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 26    }.    if( (f2&
1a9c0 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1a9d0 20 20 20 20 20 20 72 32 20 3d 20 70 4d 65 6d 32        r2 = pMem2
1a9e0 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65  ->u.r;.    }else
1a9f0 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74   if( (f2&MEM_Int
1aa00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32  )!=0 ){.      r2
1aa10 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 32   = (double)pMem2
1aa20 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ->u.i;.    }else
1aa30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
1aa40 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1aa50 20 72 31 3c 72 32 20 29 20 72 65 74 75 72 6e 20   r1<r2 ) return 
1aa60 2d 31 3b 0a 20 20 20 20 69 66 28 20 72 31 3e 72  -1;.    if( r1>r
1aa70 32 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  2 ) return 1;.  
1aa80 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1aa90 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
1aaa0 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61  ue is a string a
1aab0 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  nd the other is 
1aac0 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69  a blob, the stri
1aad0 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a  ng is less..  **
1aae0 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72   If both are str
1aaf0 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73  ings, compare us
1ab00 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ing the collatin
1ab10 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  g functions..  *
1ab20 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1ab30 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29  _flags&MEM_Str )
1ab40 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  {.    if( (f1 & 
1ab50 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
1ab60 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1ab70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32     }.    if( (f2
1ab80 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
1ab90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  {.      return -
1aba0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  1;.    }..    as
1abb0 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1abc0 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a  ==pMem2->enc );.
1abd0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1abe0 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1abf0 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  TF8 || .        
1ac00 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d      pMem1->enc==
1ac10 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c  SQLITE_UTF16LE |
1ac20 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51  | pMem1->enc==SQ
1ac30 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a  LITE_UTF16BE );.
1ac40 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c  .    /* The coll
1ac50 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d  ation sequence m
1ac60 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61  ust be defined a
1ac70 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76  t this point, ev
1ac80 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  en if.    ** the
1ac90 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68   user deletes th
1aca0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1acb0 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76  ence after the v
1acc0 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20  dbe program is. 
1acd0 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28     ** compiled (
1ace0 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77  this was not alw
1acf0 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20  ays the case).. 
1ad00 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1ad10 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c  ( !pColl || pCol
1ad20 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20  l->xCmp );..    
1ad30 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
1ad40 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f     return vdbeCo
1ad50 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70  mpareMemString(p
1ad60 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f  Mem1, pMem2, pCo
1ad70 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 0);.    }.  
1ad80 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70    /* If a NULL p
1ad90 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65  ointer was passe
1ada0 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65  d as the collate
1adb0 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20   function, fall 
1adc0 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74  through.    ** t
1add0 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20  o the blob case 
1ade0 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29  and use memcmp()
1adf0 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a  .  */.  }. .  /*
1ae00 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73   Both values mus
1ae10 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d  t be blobs.  Com
1ae20 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d  pare using memcm
1ae30 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  p().  */.  retur
1ae40 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  n sqlite3BlobCom
1ae50 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d  pare(pMem1, pMem
1ae60 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  2);.}.../*.** Th
1ae70 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1ae80 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1ae90 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65  function is a se
1aea0 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a  rial-type that.*
1aeb0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  * corresponds to
1aec0 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c   an integer - al
1aed0 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  l values between
1aee0 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69   1 and 9 inclusi
1aef0 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e  ve .** except 7.
1af00 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e   The second poin
1af10 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
1af20 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74  ontaining an int
1af30 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65  eger value.** se
1af40 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69  rialized accordi
1af50 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70  ng to serial_typ
1af60 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1af70 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a   deserializes.**
1af80 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
1af90 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
1afa0 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64  c i64 vdbeRecord
1afb0 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65  DecodeInt(u32 se
1afc0 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74  rial_type, const
1afd0 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
1afe0 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43  2 y;.  assert( C
1aff0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65  ORRUPT_DB || (se
1b000 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20  rial_type>=1 && 
1b010 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26  serial_type<=9 &
1b020 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37  & serial_type!=7
1b030 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  ) );.  switch( s
1b040 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1b050 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61    case 0:.    ca
1b060 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74  se 1:.      test
1b070 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1b080 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1b090 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  rn ONE_BYTE_INT(
1b0a0 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1b0b0 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  2:.      testcas
1b0c0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1b0d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b0e0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1b0f0 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a  y);.    case 3:.
1b100 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b110 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1b120 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52        return THR
1b130 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  EE_BYTE_INT(aKey
1b140 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b  );.    case 4: {
1b150 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b160 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1b170 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
1b180 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1b190 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1b1a0 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
1b1b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1b1c0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1b1d0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1b1e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46  ;.      return F
1b1f0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1b200 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
1b210 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1b220 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d  INT(aKey);.    }
1b230 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20  .    case 6: {. 
1b240 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55       u64 x = FOU
1b250 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1b260 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1b270 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1b280 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
1b290 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
1b2a0 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
1b2b0 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
1b2c0 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20  )*(i64*)&x;.    
1b2d0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1b2e0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38  (serial_type - 8
1b2f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1b300 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
1b310 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
1b320 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
1b330 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
1b340 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
1b350 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
1b360 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
1b370 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
1b380 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
1b390 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73  teger if key1 is
1b3a0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1b3b0 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
1b3c0 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20  ter than key2.  
1b3d0 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
1b3e0 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
1b3f0 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
1b400 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
1b410 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
1b420 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
1b430 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
1b440 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
1b450 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
1b460 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
1b470 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
1b480 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
1b490 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f  ment bSkip is no
1b4a0 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73  n-zero, it is as
1b4b0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
1b4c0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1b4d0 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  y.** determined 
1b4e0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66  that the first f
1b4f0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79  ields of the key
1b500 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a  s are equal..**.
1b510 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  ** Key1 and Key2
1b520 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
1b530 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
1b540 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1b550 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69  s. If all .** fi
1b560 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72  elds that appear
1b570 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72   in both keys ar
1b580 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50  e equal, then pP
1b590 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1b5a0 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1b5b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62  ..**.** If datab
1b5c0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
1b5d0 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65  s discovered, se
1b5e0 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  t pPKey2->errCod
1b5f0 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  e to .** SQLITE_
1b600 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75  CORRUPT and retu
1b610 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  rn 0. If an OOM 
1b620 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1b630 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32  ered, .** pPKey2
1b640 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  ->errCode is set
1b650 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
1b660 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e   and, if it is n
1b670 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20  ot NULL, the.** 
1b680 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c  malloc-failed fl
1b690 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61  ag set on databa
1b6a0 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79  se handle (pPKey
1b6b0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29  2->pKeyInfo->db)
1b6c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b6d0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1b6e0 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74  eWithSkip(.  int
1b6f0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1b700 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
1b710 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1b720 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1b730 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a  Key2,         /*
1b740 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1b750 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20  int bSkip       
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70  /* If true, skip
1b780 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1b790 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b   */.){.  u32 d1;
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1b7c0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1b7d0 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
1b7e0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b800 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1b810 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20  x of next field 
1b820 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
1b830 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72  /* Size of recor
1b860 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65  d header in byte
1b870 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  s */.  u32 idx1;
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1b8a0 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69   of first type i
1b8b0 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
1b8c0 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b8e0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1b8f0 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70  .  Mem *pRhs = p
1b900 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20  PKey2->aMem;    
1b910 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64     /* Next field
1b920 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f   of pPKey2 to co
1b930 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e  mpare */.  KeyIn
1b940 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
1b950 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
1b960 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1b970 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
1b980 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1b990 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
1b9a0 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20  Mem mem1;..  /* 
1b9b0 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65  If bSkip is true
1b9c0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
1b9d0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65  r has already de
1b9e0 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1b9f0 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f  e first.  ** two
1ba00 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
1ba10 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1ba20 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73   Fix the various
1ba30 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73   stack variables
1ba40 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
1ba50 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e  is routine begin
1ba60 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74  s comparing at t
1ba70 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e  he second field.
1ba80 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20   */.  if( bSkip 
1ba90 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20  ){.    u32 s1;. 
1baa0 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65     idx1 = 1 + ge
1bab0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1bac0 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a  [1], s1);.    sz
1bad0 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  Hdr1 = aKey1[0];
1bae0 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1baf0 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   + sqlite3VdbeSe
1bb00 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b  rialTypeLen(s1);
1bb10 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
1bb20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  pRhs++;.  }else{
1bb30 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56  .    idx1 = getV
1bb40 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
1bb50 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d  zHdr1);.    d1 =
1bb60 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28   szHdr1;.    if(
1bb70 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b   d1>(unsigned)nK
1bb80 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50  ey1 ){ .      pP
1bb90 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1bba0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1bbb0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
1bbc0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72  eturn 0;  /* Cor
1bbd0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
1bbe0 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a  .    i = 0;.  }.
1bbf0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
1bc00 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  1.szMalloc = 0; 
1bc10 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
1bc20 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
1bc30 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73  tements */.  ass
1bc40 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1bc50 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50  yInfo->nField+pP
1bc60 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1bc70 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
1bc80 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20  >nField .       
1bc90 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1bca0 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
1bcb0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  2->pKeyInfo->aSo
1bcc0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1bcd0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1bce0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1bcf0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1bd00 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
1bd10 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1bd20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
1bd30 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a  al_type;..    /*
1bd40 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67   RHS is an integ
1bd50 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52  er */.    if( pR
1bd60 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1bd70 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72  Int ){.      ser
1bd80 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1bd90 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65  [idx1];.      te
1bda0 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1bdb0 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1bdc0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1bdd0 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20  >=12 ){.        
1bde0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1bdf0 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1be00 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
1be10 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1be20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1be30 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
1be40 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73        double rhs
1be50 20 3d 20 28 64 6f 75 62 6c 65 29 70 52 68 73 2d   = (double)pRhs-
1be60 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 73 71  >u.i;.        sq
1be70 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1be80 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1be90 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1bea0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1beb0 6d 65 6d 31 2e 75 2e 72 3c 72 68 73 20 29 7b 0a  mem1.u.r<rhs ){.
1bec0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1bed0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1bee0 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 72 68   if( mem1.u.r>rh
1bef0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1bf00 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1bf10 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1bf20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d         i64 lhs =
1bf30 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
1bf40 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65  eInt(serial_type
1bf50 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20  , &aKey1[d1]);. 
1bf60 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d         i64 rhs =
1bf70 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20   pRhs->u.i;.    
1bf80 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
1bf90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1bfa0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1bfb0 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
1bfc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1bfd0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1bfe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1bff0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61     /* RHS is rea
1c000 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  l */.    else if
1c010 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1c020 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
1c030 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1c040 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1c050 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1c060 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20 20  pe>=12 ){.      
1c070 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1c080 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1c090 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
1c0a0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1c0b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c0c0 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20     double rhs = 
1c0d0 70 52 68 73 2d 3e 75 2e 72 3b 0a 20 20 20 20 20  pRhs->u.r;.     
1c0e0 20 20 20 64 6f 75 62 6c 65 20 6c 68 73 3b 0a 20     double lhs;. 
1c0f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1c100 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1c110 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1c120 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  ype, &mem1);.   
1c130 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1c140 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
1c150 20 20 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e       lhs = mem1.
1c160 75 2e 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  u.r;.        }el
1c170 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68  se{.          lh
1c180 73 20 3d 20 28 64 6f 75 62 6c 65 29 6d 65 6d 31  s = (double)mem1
1c190 2e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a  .u.i;.        }.
1c1a0 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c          if( lhs<
1c1b0 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1c1c0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1c1d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e    }else if( lhs>
1c1e0 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1c1f0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1c200 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c210 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1c220 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20   a string */.   
1c230 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
1c240 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
1c250 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  ){.      getVari
1c260 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
1c270 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
1c280 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c290 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1c2a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1c2b0 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a  rial_type<12 ){.
1c2c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1c2d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1c2e0 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26   !(serial_type &
1c2f0 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
1c300 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1c310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c320 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c  mem1.n = (serial
1c330 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
1c340 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1c350 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d  e( (d1+mem1.n)==
1c360 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1c370 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1c380 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b  ase( (d1+mem1.n+
1c390 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  1)==(unsigned)nK
1c3a0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ey1 );.        i
1c3b0 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e  f( (d1+mem1.n) >
1c3c0 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31   (unsigned)nKey1
1c3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1c3e0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1c3f0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1c400 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1c410 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1c420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1c430 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1c440 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1c450 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1c460 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ] ){.          m
1c470 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
1c480 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20  fo->enc;.       
1c490 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65     mem1.db = pKe
1c4a0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20  yInfo->db;.     
1c4b0 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20       mem1.flags 
1c4c0 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20  = MEM_Str;.     
1c4d0 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63       mem1.z = (c
1c4e0 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b  har*)&aKey1[d1];
1c4f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c500 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
1c510 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20  ring(.          
1c520 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c      &mem1, pRhs,
1c530 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1c540 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72  [i], &pPKey2->er
1c550 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20  rCode.          
1c560 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1c570 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1c580 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e  nCmp = MIN(mem1.
1c590 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  n, pRhs->n);.   
1c5a0 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
1c5b0 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
1c5c0 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
1c5d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1c5e0 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e  =0 ) rc = mem1.n
1c5f0 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20   - pRhs->n; .   
1c600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c610 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1c620 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
1c630 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1c640 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
1c650 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61  b ){.      getVa
1c660 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
1c670 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
1c680 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c690 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1c6a0 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1c6b0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c  serial_type<12 |
1c6c0 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26  | (serial_type &
1c6d0 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
1c6e0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1c6f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c700 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69  int nStr = (seri
1c710 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
1c720 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  2;.        testc
1c730 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d  ase( (d1+nStr)==
1c740 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1c750 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1c760 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29  ase( (d1+nStr+1)
1c770 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1c780 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
1c790 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e   (d1+nStr) > (un
1c7a0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
1c7b0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
1c7c0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1c7d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1c7e0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
1c7f0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1c800 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
1c810 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1c820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c830 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
1c840 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b  (nStr, pRhs->n);
1c850 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c860 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
1c870 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
1c880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1c890 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53   rc==0 ) rc = nS
1c8a0 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20  tr - pRhs->n;.  
1c8b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c8c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1c8d0 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  S is null */.   
1c8e0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72   else{.      ser
1c8f0 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1c900 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63  [idx1];.      rc
1c910 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21   = (serial_type!
1c920 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  =0);.    }..    
1c930 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1c940 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
1c950 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
1c960 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1c970 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1c980 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
1c990 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1c9a0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1c9b0 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20  PKey2, rc) );.  
1c9c0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1c9d0 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1c9e0 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1c9f0 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  below */.      r
1ca00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ca10 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52  .    i++;.    pR
1ca20 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20  hs++;.    d1 += 
1ca30 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1ca40 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1ca50 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20  type);.    idx1 
1ca60 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74  += sqlite3Varint
1ca70 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1ca80 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
1ca90 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72  <(unsigned)szHdr
1caa0 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
1cab0 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e  Field && d1<=(un
1cac0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1cad0 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
1cae0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
1caf0 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
1cb00 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
1cb10 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
1cb20 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
1cb30 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
1cb40 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
1cb50 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
1cb60 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
1cb70 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
1cb80 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1cb90 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61  (&mem1).  */.  a
1cba0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1cbb0 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
1cbc0 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
1cbd0 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f  s that one or bo
1cbe0 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  th of the keys r
1cbf0 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
1cc00 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
1cc10 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
1cc20 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
1cc30 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
1cc40 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
1cc50 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73   value.  */.  as
1cc60 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
1cc70 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65   .       || vdbe
1cc80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1cc90 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1cca0 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d   pPKey2, pPKey2-
1ccb0 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20  >default_rc) .  
1ccc0 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f       || pKeyInfo
1ccd0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1cce0 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  ed.  );.  return
1ccf0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1cd00 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _rc;.}.int sqlit
1cd10 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1cd20 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  are(.  int nKey1
1cd30 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1cd40 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
1cd50 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1cd60 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
1cd70 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1cd80 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74   key */.){.  ret
1cd90 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
1cda0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1cdb0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1cdc0 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  y2, 0);.}.../*.*
1cdd0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1cde0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1cdf0 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
1ce00 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1ce10 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
1ce20 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
1ce30 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
1ce40 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20  an integer, and 
1ce50 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65  (b) the .** size
1ce60 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
1ce70 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
1ce80 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
1ce90 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
1cea0 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69  .** byte (i.e. i
1ceb0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29  s less than 128)
1cec0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
1ced0 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20   concerns about 
1cee0 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
1cef0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1cf00 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f  s only used.** o
1cf10 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20  n schemas where 
1cf20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69  the maximum vali
1cf30 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  d header size is
1cf40 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73   63 bytes or les
1cf50 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1cf60 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1cf70 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65  reInt(.  int nKe
1cf80 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1cf90 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
1cfa0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1cfb0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
1cfc0 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1cfd0 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
1cfe0 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63   u8 *aKey = &((c
1cff0 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
1d000 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  *(const u8*)pKey
1d010 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74  1 & 0x3F];.  int
1d020 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28   serial_type = (
1d030 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1d040 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b  )[1];.  int res;
1d050 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20  .  u32 y;.  u64 
1d060 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b  x;.  i64 v = pPK
1d070 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69  ey2->aMem[0].u.i
1d080 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20  ;.  i64 lhs;..  
1d090 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70  assert( (*(u8*)p
1d0a0 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43  Key1)<=0x3F || C
1d0b0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73  ORRUPT_DB );.  s
1d0c0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
1d0d0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
1d0e0 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
1d0f0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1d100 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f        lhs = ONE_
1d110 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1d120 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d130 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1d140 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d150 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
1d160 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1d170 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1d180 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  = TWO_BYTE_INT(a
1d190 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1d1a0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1d1b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d1c0 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
1d1d0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
1d1e0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1d1f0 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59    lhs = THREE_BY
1d200 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1d210 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1d220 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1d230 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d240 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
1d250 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1d260 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   */.      y = FO
1d270 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1d280 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  y);.      lhs = 
1d290 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
1d2a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1d2b0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1d2c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d2d0 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
1d2e0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1d2f0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1d300 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1d310 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
1d320 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
1d330 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1d340 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1d350 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1d360 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d370 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74  se 6: { /* 8-byt
1d380 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1d390 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f   */.      x = FO
1d3a0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1d3b0 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  y);.      x = (x
1d3c0 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
1d3d0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
1d3e0 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36        lhs = *(i6
1d3f0 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73  4*)&x;.      tes
1d400 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1d410 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d420 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a   }.    case 8: .
1d430 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20        lhs = 0;. 
1d440 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d450 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68  case 9:.      lh
1d460 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  s = 1;.      bre
1d470 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ak;..    /* This
1d480 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72   case could be r
1d490 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63  emoved without c
1d4a0 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75  hanging the resu
1d4b0 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20  lts of running. 
1d4c0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e     ** this code.
1d4d0 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61   Including it ca
1d4e0 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65  uses gcc to gene
1d4f0 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77  rate a faster sw
1d500 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61  itch .    ** sta
1d510 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68  tement (since th
1d520 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63  e range of switc
1d530 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74  h targets now st
1d540 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64  arts at zero and
1d550 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69  .    ** is conti
1d560 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20  guous) but does 
1d570 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75  not cause any du
1d580 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20  plicate code to 
1d590 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20  be generated.   
1d5a0 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63   ** (as gcc is c
1d5b0 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20  lever enough to 
1d5c0 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20  combine the two 
1d5d0 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68  like cases). Oth
1d5e0 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69  er .    ** compi
1d5f0 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69  lers might be si
1d600 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20  milar.  */ .    
1d610 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a  case 0: case 7:.
1d620 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1d630 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1d640 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65  mpare(nKey1, pKe
1d650 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20  y1, pPKey2);..  
1d660 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1d670 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1d680 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d690 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1d6a0 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69  PKey2);.  }..  i
1d6b0 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20  f( v>lhs ){.    
1d6c0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
1d6d0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c  ;.  }else if( v<
1d6e0 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  lhs ){.    res =
1d6f0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d   pPKey2->r2;.  }
1d700 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d  else if( pPKey2-
1d710 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
1d720 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
1d730 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
1d740 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20  keys are equal. 
1d750 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 69  Compare the trai
1d760 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65  ling .    ** fie
1d770 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73  lds.  */.    res
1d780 20 3d 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d   = vdbeRecordCom
1d790 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
1d7a0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1d7b0 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2, 1);.  }else{.
1d7c0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
1d7d0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
1d7e0 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
1d7f0 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  l and there are 
1d800 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20  no trailing.    
1d810 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72  ** fields. Retur
1d820 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1d830 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73  t_rc in this cas
1d840 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  e. */.    res = 
1d850 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1d860 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rc;.  }..  asser
1d870 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1d880 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1d890 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1d8a0 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  res) );.  return
1d8b0 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   res;.}../*.** T
1d8c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d8d0 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
1d8e0 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
1d8f0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d900 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
1d910 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1d920 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73  of pPKey2 is a s
1d930 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20  tring, that (b) 
1d940 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
1d950 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ** uses the coll
1d960 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
1d970 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68  INARY and (c) th
1d980 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
1d990 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a  eader varint .**
1d9a0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1d9b0 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66   (pKey1/nKey1) f
1d9c0 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
1d9d0 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
1d9e0 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
1d9f0 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69  mpareString(.  i
1da00 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1da10 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1da20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1da30 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1da40 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
1da50 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
1da60 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31   const u8 *aKey1
1da70 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   = (const u8*)pK
1da80 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  ey1;.  int seria
1da90 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65  l_type;.  int re
1daa0 73 3b 0a 0a 20 20 67 65 74 56 61 72 69 6e 74 33  s;..  getVarint3
1dab0 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72  2(&aKey1[1], ser
1dac0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28  ial_type);.  if(
1dad0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1dae0 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1daf0 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a  ey2->r1;      /*
1db00 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69   (pKey1/nKey1) i
1db10 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20  s a number or a 
1db20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  null */.  }else 
1db30 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70  if( !(serial_typ
1db40 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20  e & 0x01) ){ .  
1db50 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1db60 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65  r2;      /* (pKe
1db70 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62  y1/nKey1) is a b
1db80 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  lob */.  }else{.
1db90 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20      int nCmp;.  
1dba0 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20    int nStr;.    
1dbb0 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79  int szHdr = aKey
1dbc0 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20  1[0];..    nStr 
1dbd0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
1dbe0 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20  2) / 2;.    if( 
1dbf0 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e  (szHdr + nStr) >
1dc00 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20   nKey1 ){.      
1dc10 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1dc20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1dc30 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1dc40 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
1dc50 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1dc60 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20     }.    nCmp = 
1dc70 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65  MIN( pPKey2->aMe
1dc80 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a  m[0].n, nStr );.
1dc90 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70      res = memcmp
1dca0 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20  (&aKey1[szHdr], 
1dcb0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
1dcc0 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69  z, nCmp);..    i
1dcd0 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
1dce0 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20     res = nStr - 
1dcf0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
1dd00 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  n;.      if( res
1dd10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
1dd20 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  f( pPKey2->nFiel
1dd30 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>1 ){.         
1dd40 20 72 65 73 20 3d 20 76 64 62 65 52 65 63 6f 72   res = vdbeRecor
1dd50 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1dd60 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1dd70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20  PKey2, 1);.     
1dd80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dd90 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1dda0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
1ddb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1ddc0 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
1ddd0 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
1dde0 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20  PKey2->r2;.     
1ddf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1de00 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
1de10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1de20 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
1de30 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
1de40 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c  ey2->r2;.    }el
1de50 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  se{.      res = 
1de60 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20  pPKey2->r1;.    
1de70 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1de80 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1de90 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1dea0 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65  Key1, pPKey2, re
1deb0 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  s).       || COR
1dec0 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c  RUPT_DB.       |
1ded0 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  | pPKey2->pKeyIn
1dee0 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
1def0 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75  iled.  );.  retu
1df00 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
1df10 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1df20 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56  r to an sqlite3V
1df30 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1df40 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75  () compatible fu
1df50 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62  nction.** suitab
1df60 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  le for comparing
1df70 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f   serialized reco
1df80 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63  rds to the unpac
1df90 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65  ked record passe
1dfa0 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79  d.** as the only
1dfb0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65   argument..*/.Re
1dfc0 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69  cordCompare sqli
1dfd0 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
1dfe0 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  re(UnpackedRecor
1dff0 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69  d *p){.  /* vari
1e000 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
1e010 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52  nt() and varintR
1e020 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1e030 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65  ng() both assume
1e040 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73  .  ** that the s
1e050 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
1e060 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73  rint that occurs
1e070 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1e080 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a   each record.  *
1e090 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  * fits in a sing
1e0a0 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73  le byte (i.e. is
1e0b0 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76   127 or less). v
1e0c0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
1e0d0 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73  reInt().  ** als
1e0e0 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  o assumes that i
1e0f0 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65  t is safe to ove
1e100 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62  rread a buffer b
1e110 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a  y at least the .
1e120 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73    ** maximum pos
1e130 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64  sible legal head
1e140 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62  er size plus 8 b
1e150 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68  ytes. Because th
1e160 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72  ere is.  ** guar
1e170 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20  anteed to be at 
1e180 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f  least 74 (but no
1e190 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20  t 136) bytes of 
1e1a0 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e  padding followin
1e1b0 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66  g each.  ** buff
1e1c0 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72  er passed to var
1e1d0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
1e1e0 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73  Int() this makes
1e1f0 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   it convenient t
1e200 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65  o.  ** limit the
1e210 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
1e220 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20  der to 64 bytes 
1e230 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74  in cases where t
1e240 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20  he first field. 
1e250 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65   ** is an intege
1e260 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
1e270 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
1e280 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d  enforce this lim
1e290 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65  it is to conside
1e2a0 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77  r only records w
1e2b0 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c  ith.  ** 13 fiel
1e2c0 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74  ds or less. If t
1e2d0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69  he first field i
1e2e0 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68  s an integer, th
1e2f0 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a  e maximum legal.
1e300 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65    ** header size
1e310 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20   is (12*5 + 1 + 
1e320 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20  1) bytes.  */.  
1e330 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f  if( (p->pKeyInfo
1e340 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b  ->nField + p->pK
1e350 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29  eyInfo->nXField)
1e360 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20  <=13 ){.    int 
1e370 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b  flags = p->aMem[
1e380 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66  0].flags;.    if
1e390 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ( p->pKeyInfo->a
1e3a0 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a  SortOrder[0] ){.
1e3b0 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b        p->r1 = 1;
1e3c0 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d  .      p->r2 = -
1e3d0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1e3e0 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a      p->r1 = -1;.
1e3f0 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b        p->r2 = 1;
1e400 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1e410 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
1e420 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e430 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1e440 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20  reInt;.    }.   
1e450 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
1e460 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20   & MEM_Real );. 
1e470 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
1e480 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  gs & MEM_Null );
1e490 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
1e4a0 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
1e4b0 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  );.    if( (flag
1e4c0 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45  s & (MEM_Real|ME
1e4d0 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29  M_Null|MEM_Blob)
1e4e0 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49  )==0 && p->pKeyI
1e4f0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30  nfo->aColl[0]==0
1e500 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1e510 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ( flags & MEM_St
1e520 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r );.      retur
1e530 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
1e540 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d  areString;.    }
1e550 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
1e560 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1e570 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  Compare;.}../*.*
1e580 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  * pCur points at
1e590 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
1e5a0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
1e5b0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1e5c0 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20  opcode..** Read 
1e5d0 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c  the rowid (the l
1e5e0 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65  ast field in the
1e5f0 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f   record) and sto
1e600 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e  re it in *rowid.
1e610 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1e620 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
1e630 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20  ng works, or an 
1e640 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
1e650 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  wise..**.** pCur
1e660 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69   might be pointi
1e670 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69  ng to text obtai
1e680 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75  ned from a corru
1e690 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
1e6a0 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74  ..** So the cont
1e6b0 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  ent cannot be tr
1e6c0 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f  usted.  Do appro
1e6d0 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e  priate checks on
1e6e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   the content..*/
1e6f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1e700 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33  IdxRowid(sqlite3
1e710 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a   *db, BtCursor *
1e720 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
1e730 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
1e740 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
1e750 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
1e760 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1e770 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
1e780 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
1e790 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
1e7a0 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
1e7b0 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
1e7c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1e7d0 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
1e7e0 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47  em m, v;..  /* G
1e7f0 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
1e800 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
1e810 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
1e820 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
1e830 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
1e840 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
1e850 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
1e860 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
1e870 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
1e880 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
1e890 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
1e8a0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
1e8b0 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
1e8c0 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
1e8d0 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
1e8e0 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
1e8f0 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
1e900 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
1e910 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1e920 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
1e930 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
1e940 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
1e950 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
1e960 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
1e970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
1e980 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20       /* pCur is 
1e990 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
1e9a0 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
1e9b0 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ail */.  assert(
1e9c0 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
1e9d0 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
1e9e0 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
1e9f0 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
1ea00 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
1ea10 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
1ea20 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1ea30 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c  3VdbeMemInit(&m,
1ea40 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20   db, 0);.  rc = 
1ea50 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
1ea60 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
1ea70 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
1ea80 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
1ea90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1eaa0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  c;.  }..  /* The
1eab0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73   index entry mus
1eac0 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68  t begin with a h
1ead0 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20  eader size */.  
1eae0 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
1eaf0 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64  2((u8*)m.z, szHd
1eb00 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  r);.  testcase( 
1eb10 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65  szHdr==3 );.  te
1eb20 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d  stcase( szHdr==m
1eb30 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  .n );.  if( unli
1eb40 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20  kely(szHdr<3 || 
1eb50 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20  (int)szHdr>m.n) 
1eb60 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
1eb70 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
1eb80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1eb90 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68  last field of th
1eba0 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62  e index should b
1ebb0 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74  e an integer - t
1ebc0 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56  he ROWID..  ** V
1ebd0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c  erify that the l
1ebe0 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79  ast entry really
1ebf0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   is an integer. 
1ec00 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61  */.  (void)getVa
1ec10 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a  rint32((u8*)&m.z
1ec20 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52  [szHdr-1], typeR
1ec30 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
1ec40 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20  e( typeRowid==1 
1ec50 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1ec60 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20  ypeRowid==2 );. 
1ec70 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1ec80 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73  owid==3 );.  tes
1ec90 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1eca0 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==4 );.  testcas
1ecb0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20  e( typeRowid==5 
1ecc0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1ecd0 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20  ypeRowid==6 );. 
1ece0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1ecf0 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73  owid==8 );.  tes
1ed00 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1ed10 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  ==9 );.  if( unl
1ed20 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c  ikely(typeRowid<
1ed30 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39  1 || typeRowid>9
1ed40 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37   || typeRowid==7
1ed50 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
1ed60 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
1ed70 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77  on;.  }.  lenRow
1ed80 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  id = sqlite3Vdbe
1ed90 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79  SerialTypeLen(ty
1eda0 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
1edb0 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d  case( (u32)m.n==
1edc0 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29  szHdr+lenRowid )
1edd0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
1ede0 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b  ((u32)m.n<szHdr+
1edf0 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  lenRowid) ){.   
1ee00 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
1ee10 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
1ee20 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20  .  /* Fetch the 
1ee30 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20  integer off the 
1ee40 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
1ee50 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
1ee60 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1ee70 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
1ee80 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
1ee90 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
1eea0 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
1eeb0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1eec0 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
1eed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
1eee0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
1eef0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1ef00 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
1ef10 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65   after m has bee
1ef20 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  n.  ** allocated
1ef30 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62  .  Free the m ob
1ef40 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
1ef50 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
1ef60 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  */.idx_rowid_cor
1ef70 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63  ruption:.  testc
1ef80 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21  ase( m.szMalloc!
1ef90 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
1efa0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1efb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1efc0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1efd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1efe0 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
1eff0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
1f000 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
1f010 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
1f020 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
1f030 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
1f040 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
1f050 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
1f060 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
1f070 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1f080 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
1f090 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1f0a0 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
1f0b0 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
1f0c0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1f0d0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
1f0e0 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
1f0f0 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
1f100 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
1f110 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
1f120 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
1f130 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
1f140 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
1f150 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
1f160 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
1f170 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
1f180 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
1f190 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
1f1a0 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
1f1b0 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
1f1c0 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
1f1d0 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
1f1e0 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
1f1f0 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
1f200 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
1f210 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69  yCompare(.  sqli
1f220 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f240 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1f250 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ion */.  VdbeCur
1f260 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
1f270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f280 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
1f290 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
1f2a0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1f2b0 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20  pUnpacked,      
1f2c0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
1f2d0 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20  sion of key */. 
1f2e0 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f300 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
1f310 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
1f320 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36   here */.){.  i6
1f330 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
1f340 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
1f350 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d  rsor *pCur = pC-
1f360 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20  >pCursor;.  Mem 
1f370 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  m;..  assert( sq
1f380 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1f390 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
1f3a0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
1f3b0 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
1f3c0 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
1f3d0 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
1f3e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f3f0 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  );    /* pCur is
1f400 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
1f410 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
1f420 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65  fail */.  /* nCe
1f430 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79  llKey will alway
1f440 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  s be between 0 a
1f450 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65  nd 0xffffffff be
1f460 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
1f470 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65  .  ** that btree
1f480 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
1f490 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nd sqlite3GetVar
1f4a0 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c  int32() are impl
1f4b0 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28  emented */.  if(
1f4c0 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20   nCellKey<=0 || 
1f4d0 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66  nCellKey>0x7ffff
1f4e0 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  fff ){.    *res 
1f4f0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1f500 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f510 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
1f520 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
1f530 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
1f540 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
1f550 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75  romBtree(pC->pCu
1f560 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  rsor, 0, (u32)nC
1f570 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
1f580 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f590 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1f5a0 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
1f5b0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1f5c0 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
1f5d0 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
1f5e0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1f5f0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
1f600 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1f610 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
1f620 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
1f630 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
1f640 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1f650 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
1f660 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
1f670 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
1f680 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
1f690 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
1f6a0 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
1f6b0 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
1f6c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f6d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
1f6e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
1f6f0 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
1f700 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
1f710 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
1f720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
1f730 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
1f740 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
1f750 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
1f760 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
1f770 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
1f780 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f790 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
1f7a0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
1f7b0 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
1f7c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
1f7d0 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
1f7e0 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
1f7f0 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
1f800 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
1f810 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
1f820 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
1f830 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
1f840 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
1f850 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
1f860 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
1f870 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
1f880 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
1f890 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
1f8a0 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
1f8b0 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
1f8c0 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
1f8d0 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
1f8e0 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
1f8f0 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
1f900 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
1f910 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
1f920 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
1f930 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
1f940 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
1f950 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
1f960 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
1f970 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
1f980 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
1f990 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
1f9a0 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
1f9b0 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
1f9c0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
1f9d0 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
1f9e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1f9f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
1fa00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1fa10 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
1fa20 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
1fa30 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
1fa40 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a  eturn v->db;.}..
1fa50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1fa60 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
1fa70 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
1fa80 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
1fa90 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a  the value bound.
1faa0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61  ** parameter iVa
1fab0 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70  r of VM v. Excep
1fac0 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  t, if the value 
1fad0 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20  is an SQL NULL, 
1fae0 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73  return .** 0 ins
1faf0 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20  tead. Unless it 
1fb00 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61  is NULL, apply a
1fb10 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65  ffinity aff (one
1fb20 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41   of the SQLITE_A
1fb30 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  FF_*.** constant
1fb40 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  s) to the value 
1fb50 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1fb60 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72   it..**.** The r
1fb70 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75  eturned value mu
1fb80 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
1fb90 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
1fba0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
1fbb0 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76  ()..*/.sqlite3_v
1fbc0 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62  alue *sqlite3Vdb
1fbd0 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56  eGetBoundValue(V
1fbe0 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
1fbf0 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73  , u8 aff){.  ass
1fc00 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
1fc10 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65   if( v ){.    Me
1fc20 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56  m *pMem = &v->aV
1fc30 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20  ar[iVar-1];.    
1fc40 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c  if( 0==(pMem->fl
1fc50 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20  ags & MEM_Null) 
1fc60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1fc70 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73  _value *pRet = s
1fc80 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76  qlite3ValueNew(v
1fc90 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
1fca0 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
1fcb0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
1fcc0 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c  opy((Mem *)pRet,
1fcd0 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20   pMem);.        
1fce0 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c  sqlite3ValueAppl
1fcf0 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20  yAffinity(pRet, 
1fd00 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  aff, SQLITE_UTF8
1fd10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1fd20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20   return pRet;.  
1fd30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1fd40 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   0;.}../*.** Con
1fd50 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61  figure SQL varia
1fd60 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74  ble iVar so that
1fd70 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76   binding a new v
1fd80 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61  alue to it signa
1fd90 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ls.** to sqlite3
1fda0 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68  _reoptimize() th
1fdb0 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20  at re-preparing 
1fdc0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61  the statement ma
1fdd0 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  y result.** in a
1fde0 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c   better query pl
1fdf0 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  an..*/.void sqli
1fe00 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73  te3VdbeSetVarmas
1fe10 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  k(Vdbe *v, int i
1fe20 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Var){.  assert( 
1fe30 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  iVar>0 );.  if( 
1fe40 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76  iVar>32 ){.    v
1fe50 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66  ->expmask = 0xff
1fe60 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b  ffffff;.  }else{
1fe70 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
1fe80 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69  |= ((u32)1 << (i
1fe90 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  Var-1));.  }.}..
1fea0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1feb0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1fec0 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20  ./*.** Transfer 
1fed0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
1fee0 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74  xt from an sqlit
1fef0 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20  e3_vtab.zErrMsg 
1ff00 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20  (text stored.** 
1ff10 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
1ff20 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
1ff30 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56  malloc) into a V
1ff40 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  dbe.zErrMsg (tex
1ff50 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
1ff60 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1ff70 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  rom sqlite3DbMal
1ff80 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  loc)..*/.void sq
1ff90 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45  lite3VtabImportE
1ffa0 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73  rrmsg(Vdbe *p, s
1ffb0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
1ffc0 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ab){.  sqlite3 *
1ffd0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71  db = p->db;.  sq
1ffe0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1fff0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
20000 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
20010 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
20020 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
20030 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
20040 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
20050 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
20060 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  g = 0;.}.#endif 
20070 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
20080 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a     IRTUALTABLE */.