/ Hex Artifact Content
Login

Artifact 2887d02721c540b25969d3260d0d3d5668d11583:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   );.  return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
0420: 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  r the SQL string
0430: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 20   for a prepared 
0440: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
0450: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
0460: 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f  tSql(Vdbe *p, co
0470: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
0480: 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70 61 72   n, int isPrepar
0490: 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74 28 20  eV2){.  assert( 
04a0: 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31 20 7c  isPrepareV2==1 |
04b0: 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 30  | isPrepareV2==0
04c0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
04d0: 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64 65 66   return;.#if def
04e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
04f0: 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
0500: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
0510: 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66 28 20  E_SQLLOG).  if( 
0520: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0530: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0540: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0550: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0560: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0570: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0580: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0590: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
05a0: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
05b0: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
05c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
05f0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
0600: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
0610: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0620: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0630: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0640: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0650: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0660: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0670: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0680: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0690: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06a0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06b0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06c0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
06d0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
06e0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
06f0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
0700: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
0710: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0720: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0730: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0740: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0750: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0760: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0770: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0780: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0790: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
07a0: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
07b0: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
07c0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
07d0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
07e0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f  sPrepareV2;.}../
07f0: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0800: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0810: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
0820: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e  least nOp elemen
0830: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68  ts larger .** th
0840: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  an its current s
0850: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72  ize. nOp is guar
0860: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73  anteed to be les
0870: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
0880: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f  ** to 1024/sizeo
0890: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f(Op)..**.** If 
08a0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
08b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
08c0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
08d0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a   array, return.*
08e0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  * SQLITE_NOMEM. 
08f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62  In this case Vdb
0900: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e  e.aOp and Parse.
0910: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0920: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0930: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0940: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0950: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0960: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0970: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0980: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0990: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
09a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
09b0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
09c0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
09d0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
09e0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
09f0: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0a00: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0a10: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0a20: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0a30: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0a40: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0a50: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0a60: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0a70: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0a80: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0a90: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0aa0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
0ab0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0ac0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
0ad0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
0ae0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
0af0: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
0b00: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
0b10: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
0b20: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
0b30: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
0b40: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
0b50: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
0b60: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
0b70: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
0b80: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0b90: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
0ba0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
0bb0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
0bc0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
0bd0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
0be0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
0bf0: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
0c00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
0c10: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
0c20: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e   int nNew = (p->
0c30: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
0c40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0c50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0c60: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
0c70: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0c80: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? p->nOpAlloc*
0c90: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
0ca0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
0cb0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0cc0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
0cd0: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30  assert( nOp<=(10
0ce0: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29  24/sizeof(Op)) )
0cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
0d00: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e  >=(p->nOpAlloc+n
0d10: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op) );.  pNew = 
0d20: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0d30: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20  (p->db, v->aOp, 
0d40: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0d50: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0d60: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
0d70: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0d80: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65  cSize(p->db, pNe
0d90: 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20  w)/sizeof(Op);. 
0da0: 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77     v->aOp = pNew
0db0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
0dc0: 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  pNew ? SQLITE_OK
0dd0: 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   : SQLITE_NOMEM)
0de0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
0df0: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
0e00: 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74   routine is just
0e10: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
0e20: 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
0e30: 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c  akpoint that wil
0e40: 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20  l.** fire after 
0e50: 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69  each opcode is i
0e60: 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70  nserted and disp
0e70: 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22  layed using.** "
0e80: 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f  PRAGMA vdbe_addo
0e90: 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73  ptrace=on"..*/.s
0ea0: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
0eb0: 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74  addop_breakpoint
0ec0: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
0ed0: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b   int n = 0;.  n+
0ee0: 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  +;.}.#endif../*.
0ef0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73  ** Add a new ins
0f00: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
0f10: 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74  list of instruct
0f20: 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20  ions current in 
0f30: 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65  the.** VDBE.  Re
0f40: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
0f50: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
0f60: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50  ruction..**.** P
0f70: 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a  arameters:.**.**
0f80: 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20      p           
0f90: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74      Pointer to t
0fa0: 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20  he VDBE.**.**   
0fb0: 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20   op             
0fc0: 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   The opcode for 
0fd0: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
0fe0: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32  .**.**    p1, p2
0ff0: 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e  , p3      Operan
1000: 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  ds.**.** Use the
1010: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1020: 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74  lveLabel() funct
1030: 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64  ion to fix an ad
1040: 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65  dress and.** the
1050: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1060: 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20  geP4() function 
1070: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  to change the va
1080: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a  lue of the P4.**
1090: 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74   operand..*/.int
10a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10b0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
10c0: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
10d0: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69  p2, int p3){.  i
10e0: 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a  nt i;.  VdbeOp *
10f0: 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e  pOp;..  i = p->n
1100: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  Op;.  assert( p-
1110: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
1120: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
1130: 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c  ert( op>0 && op<
1140: 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d  0xff );.  if( p-
1150: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
1160: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20  c<=i ){.    if( 
1170: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31  growOpArray(p, 1
1180: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1190: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
11a0: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70   p->nOp++;.  pOp
11b0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
11c0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28   pOp->opcode = (
11d0: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35  u8)op;.  pOp->p5
11e0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
11f0: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
1200: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
1210: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
1220: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
1230: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
1240: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
1250: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
1260: 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e  COMMENTS.  pOp->
1270: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
1280: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1290: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
12a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
12b0: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
12c0: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ace ){.    int j
12d0: 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65  j, kk;.    Parse
12e0: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
12f0: 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a  arse;.    for(jj
1300: 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45  =kk=0; jj<SQLITE
1310: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b  _N_COLCACHE; jj+
1320: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1330: 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20   yColCache *x = 
1340: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1350: 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66  e + jj;.      if
1360: 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72  ( x->iLevel>pPar
1370: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
1380: 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20  || x->iReg==0 ) 
1390: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13a0: 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b  printf(" r[%d]={
13b0: 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67  %d:%d}", x->iReg
13c0: 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e  , x->iTable, x->
13d0: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
13e0: 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kk++;.    }.    
13f0: 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28  if( kk ) printf(
1400: 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  "\n");.    sqlit
1410: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1420: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
1430: 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f  .    test_addop_
1440: 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20  breakpoint();.  
1450: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1460: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70  VDBE_PROFILE.  p
1470: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  Op->cycles = 0;.
1480: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a    pOp->cnt = 0;.
1490: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
14a0: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
14b0: 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69  GE.  pOp->iSrcLi
14c0: 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ne = 0;.#endif. 
14d0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74   return i;.}.int
14e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f0: 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p0(Vdbe *p, int 
1500: 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  op){.  return sq
1510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1520: 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b  p, op, 0, 0, 0);
1530: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1540: 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70  beAddOp1(Vdbe *p
1550: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
1560: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1570: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1580: 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a   op, p1, 0, 0);.
1590: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
15a0: 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c  eAddOp2(Vdbe *p,
15b0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
15c0: 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75   int p2){.  retu
15d0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
15e0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
15f0: 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  p2, 0);.}.../*.*
1600: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1610: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1620: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1630: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1650: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
1660: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1670: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1680: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1690: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
16a0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
16b0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16d0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
16e0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
16f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1700: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1710: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1720: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1730: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1740: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
1750: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
1760: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1770: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
1780: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
1790: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
17a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
17b0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
17c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
17d0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
17e0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
17f0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1800: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
1810: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
1820: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
1830: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
1840: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
1850: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
1860: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
1870: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
1880: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
1890: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
18a0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
18b0: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
18c0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
18d0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
18e0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
18f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1900: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
1910: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
1920: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
1930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1940: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
1950: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
1960: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
1970: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
1980: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1990: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
19a0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
19b0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
19c0: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
19d0: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
19e0: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
19f0: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
1a00: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
1a10: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
1a20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
1a30: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
1a40: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
1a50: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
1a60: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1a70: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1a80: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1a90: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1aa0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1ab0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1ae0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1b00: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1b10: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1b20: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1b30: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b50: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1b60: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
1b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b80: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
1b90: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1ba0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1bc0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1bd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1be0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1bf0: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
1c00: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
1c10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1c20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1c30: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
1c40: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
1c50: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
1c60: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
1c70: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
1c80: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
1c90: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1ca0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1cb0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1cc0: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
1cd0: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
1ce0: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
1cf0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
1d00: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
1d10: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
1d20: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1d30: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1d40: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1d50: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1d60: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1d70: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1d80: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
1d90: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
1da0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
1db0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
1dc0: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
1dd0: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
1de0: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
1df0: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
1e00: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
1e10: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
1e20: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1e30: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1e40: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1e50: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1e60: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1e70: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1e80: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
1e90: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
1ea0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
1eb0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
1ec0: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
1ed0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
1ee0: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
1ef0: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
1f00: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1f10: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
1f20: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
1f30: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1f40: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1f50: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1f60: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
1fa0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
1fb0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
1fc0: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1fd0: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
1fe0: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
1ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
2000: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
2010: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
2020: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2030: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
2040: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
2050: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
2060: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
2070: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
2080: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
2090: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20a0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
20b0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
20c0: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
20d0: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
20e0: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
20f0: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
2100: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
2110: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2120: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
2130: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69  p->nLabel );.  i
2140: 66 28 20 41 4c 57 41 59 53 28 6a 3e 3d 30 29 20  f( ALWAYS(j>=0) 
2150: 26 26 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  && p->aLabel ){.
2160: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
2170: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20   = v->nOp;.  }. 
2180: 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76   p->iFixedOp = v
2190: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a  ->nOp - 1;.}../*
21a0: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
21b0: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
21c0: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
21d0: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
21e0: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
21f0: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
2200: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
2210: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 1;.}..#ifdef
2220: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
2230: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2240: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
2250: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
2260: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
2270: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
2280: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2290: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
22a0: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
22b0: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
22c0: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
22d0: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
22e0: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
22f0: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
2300: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
2310: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
2320: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2330: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
2340: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
2350: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
2360: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
2370: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
2380: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
23b0: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
23c0: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
23d0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
23e0: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
23f0: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
2400: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
2410: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
2420: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
2430: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
2440: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2450: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
2460: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
2470: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
2480: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
2490: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
24a0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
24b0: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
24c0: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
24d0: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
24e0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
24f0: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
2500: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
2510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2520: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2530: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
2540: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
2550: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2560: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
2570: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
2580: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
25b0: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
25c0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
25d0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
25e0: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
25f0: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
2600: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
2610: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
2620: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
2630: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
2640: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
2650: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
2660: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
2670: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
2680: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
2690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26a0: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
26b0: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
26c0: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
26d0: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
26e0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
26f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
2700: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
2710: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
2720: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
2730: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
2740: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
2750: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
2760: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
2770: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
2780: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
2790: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
27a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
27b0: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
27c0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
27d0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
27e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
27f0: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
2800: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
2810: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
2820: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
2830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2840: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
2850: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
2860: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
2870: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
2880: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
2890: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
28a0: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
28b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
28c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
28d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
28e0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
28f0: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
2900: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
2910: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2920: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
2930: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
2940: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
2950: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
2960: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
2970: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
2980: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
2990: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
29a0: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
29b0: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
29c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
29d0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
29e0: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
29f0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
2a00: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
2a10: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
2a20: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
2a30: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
2a40: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
2a50: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
2a60: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2a70: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
2a80: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
2a90: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
2aa0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2ab0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
2ac0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
2ad0: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
2ae0: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
2af0: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
2b00: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
2b10: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
2b20: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2b30: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
2b40: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b  **.** Then check
2b50: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
2b60: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72  of Parse.mayAbor
2b70: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a  t is true if an.
2b80: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20  ** ABORT may be 
2b90: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65  thrown, or false
2ba0: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75   otherwise. Retu
2bb0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  rn true if it do
2bc0: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20  es.** match, or 
2bd0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2be0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2bf0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
2c00: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74   used as.** part
2c10: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74   of an assert st
2c20: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63  atement in the c
2c30: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72  ompiler. Similar
2c40: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73   to:.**.**   ass
2c50: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
2c60: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70  AssertMayAbort(p
2c70: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
2c80: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20  arse->mayAbort) 
2c90: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
2ca0: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
2cb0: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ort(Vdbe *v, int
2cc0: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e   mayAbort){.  in
2cd0: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a  t hasAbort = 0;.
2ce0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62    Op *pOp;.  Vdb
2cf0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20  eOpIter sIter;. 
2d00: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
2d10: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
2d20: 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76  );.  sIter.v = v
2d30: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70  ;..  while( (pOp
2d40: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
2d50: 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20  Iter))!=0 ){.   
2d60: 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f   int opcode = pO
2d70: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69  p->opcode;.    i
2d80: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65  f( opcode==OP_De
2d90: 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d  stroy || opcode=
2da0: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
2db0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
2dc0: 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e .#ifndef SQLIT
2dd0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
2de0: 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f  EY.     || (opco
2df0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
2e00: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
2e10: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23  & pOp->p2==1) .#
2e20: 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28  endif.     || ((
2e30: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
2e40: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
2e50: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
2e60: 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78   && ((pOp->p1&0x
2e70: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
2e80: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
2e90: 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20  2==OE_Abort)).  
2ea0: 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62    ){.      hasAb
2eb0: 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ort = 1;.      b
2ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2ed0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2ee0: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
2ef0: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
2f00: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
2f10: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
2f20: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2f30: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
2f40: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
2f50: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
2f60: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
2f70: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
2f80: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
2f90: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2fa0: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
2fb0: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
2fc0: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
2fd0: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
2fe0: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
2ff0: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
3000: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
3010: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
3020: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
3030: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
3040: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
3050: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b  ort==mayAbort );
3060: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
3070: 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20  ITE_DEBUG - the 
3080: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
3090: 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e  Abort() function
30a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20   */../*.** Loop 
30b0: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
30c0: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
30d0: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
30e0: 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f  re negative.** o
30f0: 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  n jump instructi
3100: 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20  ons.  Each such 
3110: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
3120: 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a  .  Resolve the.*
3130: 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69  * label by setti
3140: 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ng the P2 value 
3150: 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e  to its correct n
3160: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  on-zero value..*
3170: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3180: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
3190: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
31a0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
31b0: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72  erted..**.** Var
31c0: 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41  iable *pMaxFuncA
31d0: 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  rgs is set to th
31e0: 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  e maximum value 
31f0: 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65  of any P2 argume
3200: 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f  nt .** to an OP_
3210: 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67  Function, OP_Agg
3220: 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74  Step or OP_VFilt
3230: 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20  er opcode. This 
3240: 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73  is used by .** s
3250: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
3260: 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68  ady() to size th
3270: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
3280: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rray..**.** The 
3290: 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c 64  Op.opflags field
32a0: 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20 6f   is set on all o
32b0: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  pcodes..*/.stati
32c0: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
32d0: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
32e0: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
32f0: 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  s){.  int i;.  i
3300: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
3310: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
3320: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
3330: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
3340: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
3350: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
3360: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
3370: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
3380: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f  Reader = 0;.  fo
3390: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
33a0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
33b0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
33c0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
33d0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f  ->opcode;..    /
33e0: 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20  * NOTE: Be sure 
33f0: 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f  to update mkopco
3400: 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64  deh.awk when add
3410: 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a  ing or removing.
3420: 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f      ** cases fro
3430: 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a  m this switch! *
3440: 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  /.    switch( op
3450: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  code ){.      ca
3460: 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a  se OP_Function:.
3470: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 67        case OP_Ag
3480: 67 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20 20  gStep: {.       
3490: 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61   if( pOp->p5>nMa
34a0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
34b0: 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20   = pOp->p5;.    
34c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
34d0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50   }.      case OP
34e0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a  _Transaction: {.
34f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
3500: 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64  >p2!=0 ) p->read
3510: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
3520: 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a    /* fall thru *
3530: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
3540: 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
3550: 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  it:.      case O
3560: 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20  P_Savepoint: {. 
3570: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61         p->bIsRea
3580: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
3590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
35a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35b0: 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63 61  MIT_WAL.      ca
35c0: 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  se OP_Checkpoint
35d0: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  :.#endif.      c
35e0: 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20  ase OP_Vacuum:. 
35f0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75       case OP_Jou
3600: 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20  rnalMode: {.    
3610: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
3620: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
3630: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
3640: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3650: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
3660: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
3670: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61 73  LTABLE.      cas
3680: 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a  e OP_VUpdate: {.
3690: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
36a0: 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p2>nMaxArgs ) n
36b0: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
36c0: 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  2;.        break
36d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36e0: 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a  case OP_VFilter:
36f0: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e   {.        int n
3700: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3710: 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20  ( p->nOp - i >= 
3720: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  3 );.        ass
3730: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
3740: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
3750: 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 70  );.        n = p
3760: 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20  Op[-1].p1;.     
3770: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
3780: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
3790: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
37a0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
37b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
37c0: 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  xt:.      case O
37d0: 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20  P_NextIfOpen:.  
37e0: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
37f0: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  erNext: {.      
3800: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
3810: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
3820: 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70  eNext;.        p
3830: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3840: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
3850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3860: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
3870: 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ev:.      case O
3880: 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a  P_PrevIfOpen: {.
3890: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
38a0: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
38b0: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
38c0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
38d0: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43  type = P4_ADVANC
38e0: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
38f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3900: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67  .    pOp->opflag
3910: 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  s = sqlite3Opcod
3920: 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65  eProperty[opcode
3930: 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d  ];.    if( (pOp-
3940: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
3950: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70  _JUMP)!=0 && pOp
3960: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->p2<0 ){.      
3970: 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e  assert( -1-pOp->
3980: 70 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  p2<pParse->nLabe
3990: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
39a0: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
39b0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
39c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
39d0: 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65  ee(p->db, pParse
39e0: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61  ->aLabel);.  pPa
39f0: 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b  rse->aLabel = 0;
3a00: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  .  pParse->nLabe
3a10: 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75  l = 0;.  *pMaxFu
3a20: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
3a30: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  s;.  assert( p->
3a40: 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20  bIsReader!=0 || 
3a50: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
3a60: 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d  >btreeMask) );.}
3a70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3a80: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
3a90: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
3aa0: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
3ab0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
3ac0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3ad0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
3ae0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
3af0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
3b00: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
3b10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
3b20: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
3b30: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
3b40: 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f  he array of opco
3b50: 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  des associated w
3b60: 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  ith.** the Vdbe 
3b70: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
3b80: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74  rst argument. It
3b90: 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
3ba0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a  responsibility.*
3bb0: 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72  * to arrange for
3bc0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72   the returned ar
3bd0: 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75  ray to be eventu
3be0: 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
3bf0: 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65   the .** vdbeFre
3c00: 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74  eOpArray() funct
3c10: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ion..**.** Befor
3c20: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e  e returning, *pn
3c30: 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Op is set to the
3c40: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
3c50: 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  es in the return
3c60: 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73  ed.** array. Als
3c70: 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20  o, *pnMaxArg is 
3c80: 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65  set to the large
3c90: 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74  r of its current
3ca0: 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74   value and .** t
3cb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
3cc0: 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65  ries in the Vdbe
3cd0: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72  .apArg[] array r
3ce0: 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75  equired to execu
3cf0: 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  te the .** retur
3d00: 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ned program..*/.
3d10: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
3d20: 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56  dbeTakeOpArray(V
3d30: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f  dbe *p, int *pnO
3d40: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67  p, int *pnMaxArg
3d50: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  ){.  VdbeOp *aOp
3d60: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73   = p->aOp;.  ass
3d70: 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e  ert( aOp && !p->
3d80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3d90: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
3da0: 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65  that sqlite3Vdbe
3db0: 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20  UsesBtree() was 
3dc0: 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  not called on th
3dd0: 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72  is VM */.  asser
3de0: 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  t( DbMaskAllZero
3df0: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29  (p->btreeMask) )
3e00: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
3e10: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
3e20: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
3e30: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
3e40: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
3e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
3e60: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
3e70: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
3e80: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
3e90: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
3ea0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
3eb0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
3ec0: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
3ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3ee0: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
3ef0: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
3f00: 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74 20 69  onst *aOp, int i
3f10: 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74 20 61  Lineno){.  int a
3f20: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
3f30: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3f40: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
3f50: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
3f60: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
3f70: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
3f80: 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20  ray(p, nOp) ){. 
3f90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3fa0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
3fb0: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e  ;.  if( ALWAYS(n
3fc0: 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  Op>0) ){.    int
3fd0: 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69   i;.    VdbeOpLi
3fe0: 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20  st const *pIn = 
3ff0: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
4000: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49  ; i<nOp; i++, pI
4010: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n++){.      int 
4020: 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20  p2 = pIn->p2;.  
4030: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74      VdbeOp *pOut
4040: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64   = &p->aOp[i+add
4050: 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  r];.      pOut->
4060: 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70  opcode = pIn->op
4070: 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74  code;.      pOut
4080: 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a  ->p1 = pIn->p1;.
4090: 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 29        if( p2<0 )
40a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
40b0: 28 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50  ( sqlite3OpcodeP
40c0: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
40d0: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
40e0: 4d 50 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  MP );.        pO
40f0: 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20  ut->p2 = addr + 
4100: 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20  ADDR(p2);.      
4110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
4120: 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  Out->p2 = p2;.  
4130: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74      }.      pOut
4140: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a  ->p3 = pIn->p3;.
4150: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79        pOut->p4ty
4160: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
4170: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  .      pOut->p4.
4180: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75  p = 0;.      pOu
4190: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
41a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
41b0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
41c0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  .      pOut->zCo
41d0: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  mment = 0;.#endi
41e0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
41f0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
4200: 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69      pOut->iSrcLi
4210: 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a  ne = iLineno+i;.
4220: 23 65 6c 73 65 0a 20 20 20 20 20 20 28 76 6f 69  #else.      (voi
4230: 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69  d)iLineno;.#endi
4240: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
4250: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
4260: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
4270: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
4280: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
4290: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
42a0: 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70  Op(0, i+addr, &p
42b0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a  ->aOp[i+addr]);.
42c0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
42d0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20     }.    p->nOp 
42e0: 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65  += nOp;.  }.  re
42f0: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69  turn addr;.}..#i
4300: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4310: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
4320: 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41  NSTATUS)./*.** A
4330: 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
4340: 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e  he array of coun
4350: 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20  ters managed by 
4360: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
4370: 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f  nstatus()..*/.vo
4380: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 63  id sqlite3VdbeSc
4390: 61 6e 43 6f 75 6e 74 65 72 28 0a 20 20 56 64 62  anCounter(.  Vdb
43a0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
43c0: 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74  VM to add scanst
43d0: 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69  atus() to */.  i
43e0: 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  nt addrExplain, 
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4400: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
4410: 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a  Explain (or 0) *
4420: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70  /.  int addrLoop
4430: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4440: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4450: 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  f loop counter *
4460: 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73  / .  int addrVis
4470: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
4480: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4490: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
44a0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 36 34  counter */.  i64
44b0: 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20   nEst,          
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
44d0: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
44e0: 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f   of rows */.  co
44f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4510: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f   Name of table o
4520: 72 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63  r index being sc
4530: 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  anned */.){.  in
4540: 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53  t nByte = (p->nS
4550: 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28  can+1) * sizeof(
4560: 53 63 61 6e 43 6f 75 6e 74 65 72 29 3b 0a 20 20  ScanCounter);.  
4570: 53 63 61 6e 43 6f 75 6e 74 65 72 20 2a 61 4e 65  ScanCounter *aNe
4580: 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53 63 61  w;.  aNew = (Sca
4590: 6e 43 6f 75 6e 74 65 72 2a 29 73 71 6c 69 74 65  nCounter*)sqlite
45a0: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62  3DbRealloc(p->db
45b0: 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74  , p->aScan, nByt
45c0: 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20 29  e);.  if( aNew )
45d0: 7b 0a 20 20 20 20 53 63 61 6e 43 6f 75 6e 74 65  {.    ScanCounte
45e0: 72 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b  r *pNew = &aNew[
45f0: 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20  p->nScan++];.   
4600: 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61   pNew->addrExpla
4610: 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e  in = addrExplain
4620: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
4630: 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b  Loop = addrLoop;
4640: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56  .    pNew->addrV
4650: 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74  isit = addrVisit
4660: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74  ;.    pNew->nEst
4670: 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65   = nEst;.    pNe
4680: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  w->zName = sqlit
4690: 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62  e3DbStrDup(p->db
46a0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  , zName);.    p-
46b0: 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20  >aScan = aNew;. 
46c0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
46d0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
46e0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f  alue of the P1 o
46f0: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
4700: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
4710: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
4720: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
4730: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
4740: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
4750: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
4760: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
4770: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
4780: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
4790: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
47a0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
47b0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
47c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
47d0: 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33  geP1(Vdbe *p, u3
47e0: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
47f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4800: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4810: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4820: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4830: 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p1 = val;.  }.}
4840: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4850: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4860: 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P2 operand for a
4870: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
4880: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
4890: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
48a0: 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a   for setting a j
48b0: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  ump destination.
48c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
48d0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62  VdbeChangeP2(Vdb
48e0: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
48f0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
4900: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
4910: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
4920: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4930: 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61  Op[addr].p2 = va
4940: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4950: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4960: 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61   of the P3 opera
4970: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
4980: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
4990: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
49a0: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
49b0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
49c0: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
49d0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( p!=0 );.  if( 
49e0: 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64  ((u32)p->nOp)>ad
49f0: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
4a00: 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b  [addr].p3 = val;
4a10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
4a20: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
4a30: 66 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64  f the P5 operand
4a40: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
4a50: 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20  cently.** added 
4a60: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  operation..*/.vo
4a70: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4a80: 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20  angeP5(Vdbe *p, 
4a90: 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  u8 val){.  asser
4aa0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( p!=0 );.  if(
4ab0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61   p->aOp ){.    a
4ac0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
4ad0: 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d  );.    p->aOp[p-
4ae0: 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c  >nOp-1].p5 = val
4af0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
4b00: 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65  hange the P2 ope
4b10: 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74  rand of instruct
4b20: 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74  ion addr so that
4b30: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
4b40: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
4b50: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
4b60: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64  tion to be coded
4b70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4b80: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64  3VdbeJumpHere(Vd
4b90: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
4ba0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  {.  sqlite3VdbeC
4bb0: 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c  hangeP2(p, addr,
4bc0: 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 70 2d 3e 70   p->nOp);.  p->p
4bd0: 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 20  Parse->iFixedOp 
4be0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a  = p->nOp - 1;.}.
4bf0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
4c00: 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72  nput FuncDef str
4c10: 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65  ucture is epheme
4c20: 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69  ral, then free i
4c30: 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75  t.  If.** the Fu
4c40: 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68  ncDef is not eph
4c50: 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e  ermal, then do n
4c60: 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  othing..*/.stati
4c70: 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d  c void freeEphem
4c80: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c  eralFunction(sql
4c90: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
4ca0: 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20  f *pDef){.  if( 
4cb0: 41 4c 57 41 59 53 28 70 44 65 66 29 20 26 26 20  ALWAYS(pDef) && 
4cc0: 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
4cd0: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
4ce0: 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20  PHEM)!=0 ){.    
4cf0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4d00: 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a  , pDef);.  }.}..
4d10: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
4d20: 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69  FreeOpArray(sqli
4d30: 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74  te3 *, Op *, int
4d40: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  );../*.** Delete
4d50: 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e   a P4 value if n
4d60: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
4d70: 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28  tic void freeP4(
4d80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
4d90: 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p4type, void *p
4da0: 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a  4){.  if( p4 ){.
4db0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29      assert( db )
4dc0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34  ;.    switch( p4
4dd0: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
4de0: 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20  se P4_REAL:.    
4df0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
4e00: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44  .      case P4_D
4e10: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61  YNAMIC:.      ca
4e20: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
4e30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4e40: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
4e50: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4e60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4e70: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
4e80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
4e90: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4ea0: 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   ) sqlite3KeyInf
4eb0: 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a  oUnref((KeyInfo*
4ec0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
4ed0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4ee0: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
4ef0: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  TF: {.        if
4f00: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4f10: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ed==0 ) sqlite3_
4f20: 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20  free(p4);.      
4f30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4f40: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46  .      case P4_F
4f50: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
4f60: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
4f70: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e  unction(db, (Fun
4f80: 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20  cDef*)p4);.     
4f90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4fa0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
4fb0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  MEM: {.        i
4fc0: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
4fd0: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eed==0 ){.      
4fe0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
4ff0: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
5000: 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  lue*)p4);.      
5010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5020: 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d     Mem *p = (Mem
5030: 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20  *)p4;.          
5040: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
5050: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
5060: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
5070: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
5080: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
5090: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
50a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
50b0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
50c0: 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 20  VTAB : {.       
50d0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
50e0: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
50f0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54  e3VtabUnlock((VT
5100: 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20  able *)p4);.    
5110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5120: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
5130: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73  /*.** Free the s
5140: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
5150: 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70  or aOp and any p
5160: 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74  4 values allocat
5170: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70  ed for the.** op
5180: 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  codes contained 
5190: 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69  within. If aOp i
51a0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73  s not NULL it is
51b0: 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
51c0: 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72  ain .** nOp entr
51d0: 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ies. .*/.static 
51e0: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
51f0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
5200: 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e  , Op *aOp, int n
5210: 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29  Op){.  if( aOp )
5220: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  {.    Op *pOp;. 
5230: 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20     for(pOp=aOp; 
5240: 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70  pOp<&aOp[nOp]; p
5250: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
5260: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
5270: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
5280: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5290: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
52a0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c  MMENTS.      sql
52b0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
52c0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
52d0: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
52e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
52f0: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
5300: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
5310: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
5320: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
5330: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5340: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
5350: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
5360: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
5370: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
5380: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
5390: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
53a0: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
53b0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
53c0: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
53d0: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
53e0: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
53f0: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
5400: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
5410: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
5420: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
5430: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
5440: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
5450: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
5460: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76  nto OP_Noop.*/.v
5470: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5480: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
5490: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
54a0: 20 20 69 66 28 20 61 64 64 72 3c 70 2d 3e 6e 4f    if( addr<p->nO
54b0: 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20  p ){.    VdbeOp 
54c0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61  *pOp = &p->aOp[a
54d0: 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  ddr];.    sqlite
54e0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
54f0: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
5500: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
5510: 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d 73 65  p4.p);.    memse
5520: 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pOp, 0, sizeof
5530: 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 70  (pOp[0]));.    p
5540: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
5550: 4e 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 61 64  Noop;.    if( ad
5560: 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 20 29 20 70  dr==p->nOp-1 ) p
5570: 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a  ->nOp--;.  }.}..
5580: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73  /*.** If the las
5590: 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22  t opcode is "op"
55a0: 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61   and it is not a
55b0: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
55c0: 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  n,.** then remov
55d0: 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72  e it.  Return tr
55e0: 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ue if and only i
55f0: 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20  f an opcode was 
5600: 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
5610: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
5620: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62  ePriorOpcode(Vdb
5630: 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20  e *p, u8 op){.  
5640: 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28  if( (p->nOp-1)>(
5650: 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65  p->pParse->iFixe
5660: 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b 70  dOp) && p->aOp[p
5670: 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d  ->nOp-1].opcode=
5680: 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  =op ){.    sqlit
5690: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
56a0: 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b  op(p, p->nOp-1);
56b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
56c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
56d0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
56e0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
56f0: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70  lue of the P4 op
5700: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
5710: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
5720: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
5730: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
5740: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
5750: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
5760: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
5770: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
5780: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
5790: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
57a0: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
57b0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
57c0: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
57d0: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
57e0: 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  4 operand is dyn
57f0: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
5800: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
5810: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
5820: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
5830: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5840: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
5850: 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d  * A value of n==
5860: 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74  0 means copy byt
5870: 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20  es of zP4 up to 
5880: 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  and including th
5890: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20  e.** first null 
58a0: 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68  byte.  If n>0 th
58b0: 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65  en copy n+1 byte
58c0: 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a  s of zP4..** .**
58d0: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
58e0: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
58f0: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
5900: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
5910: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
5920: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
5930: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
5940: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
5950: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
5960: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
5970: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
5980: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
5990: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
59a0: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
59b0: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
59c0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
59d0: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
59e0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
59f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5a00: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
5a10: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
5a20: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
5a30: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
5a40: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
5a50: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
5a60: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
5a70: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
5a80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
5a90: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d  ;.  if( p->aOp==
5aa0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
5ab0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
5ac0: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n!=P4_VTAB ){. 
5ad0: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
5ae0: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
5af0: 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a  **)&zP4);.    }.
5b00: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5b10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5b20: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
5b30: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
5b40: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
5b50: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
5b60: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20   - 1;.  }.  pOp 
5b70: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
5b80: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
5b90: 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53  p4type==P4_NOTUS
5ba0: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  ED.       || pOp
5bb0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
5bc0: 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  32.       || pOp
5bd0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59  ->p4type==P4_KEY
5be0: 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65 50 34  INFO );.  freeP4
5bf0: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
5c00: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
5c10: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
5c20: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
5c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
5c40: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
5c50: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
5c60: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
5c70: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
5c80: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
5c90: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
5ca0: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
5cb0: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
5cc0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
5cd0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5ce0: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
5cf0: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
5d00: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5d10: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
5d20: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
5d30: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
5d40: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
5d50: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5d60: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
5d70: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5d80: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65  P4_KEYINFO;.  }e
5d90: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54  lse if( n==P4_VT
5da0: 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  AB ){.    pOp->p
5db0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
5dc0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5dd0: 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20  e = P4_VTAB;.   
5de0: 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b   sqlite3VtabLock
5df0: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b  ((VTable *)zP4);
5e00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 56  .    assert( ((V
5e10: 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62  Table *)zP4)->db
5e20: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c  ==p->db );.  }el
5e30: 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  se if( n<0 ){.  
5e40: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5e50: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5e60: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67  p->p4type = (sig
5e70: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65  ned char)n;.  }e
5e80: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  lse{.    if( n==
5e90: 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  0 ) n = sqlite3S
5ea0: 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20  trlen30(zP4);.  
5eb0: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71    pOp->p4.z = sq
5ec0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
5ed0: 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  ->db, zP4, n);. 
5ee0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5ef0: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d   P4_DYNAMIC;.  }
5f00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5f10: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
5f20: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
5f30: 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65  opcode to the Ke
5f40: 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a  yInfo for the.**
5f50: 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f   index given..*/
5f60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5f70: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61  eSetP4KeyInfo(Pa
5f80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
5f90: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62  ex *pIdx){.  Vdb
5fa0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5fb0: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
5fc0: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
5fd0: 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 73  ( pIdx!=0 );.  s
5fe0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5ff0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
6000: 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f  )sqlite3KeyInfoO
6010: 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
6020: 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Idx),.          
6030: 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
6040: 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64  EYINFO);.}..#ifd
6050: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6060: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
6070: 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  S./*.** Change t
6080: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
6090: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
60a0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
60b0: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
60c0: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
60d0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
60e0: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
60f0: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
6100: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
6110: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
6120: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
6130: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
6140: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
6150: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
6160: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
6170: 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  beVComment(Vdbe 
6180: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
6190: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
61a0: 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   ap){.  assert( 
61b0: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
61c0: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
61d0: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
61e0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
61f0: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
6200: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
6210: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
6220: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nOp ){.    asser
6230: 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  t( p->aOp );.   
6240: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6250: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ->db, p->aOp[p->
6260: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29  nOp-1].zComment)
6270: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
6280: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20  nOp-1].zComment 
6290: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
62a0: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
62b0: 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  , ap);.  }.}.voi
62c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
62d0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
62e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
62f0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
6300: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
6310: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
6320: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
6330: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
6340: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
6350: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
6360: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
6370: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
6380: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
6390: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
63a0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
63b0: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
63c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
63d0: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
63e0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
63f0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
6400: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
6410: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
6420: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
6430: 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e  }.}.#endif  /* N
6440: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
6450: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
6460: 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ERAGE./*.** Set 
6470: 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65  the value if the
6480: 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20   iSrcLine field 
6490: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
64a0: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
64b0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
64c0: 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65  lite3VdbeSetLine
64d0: 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20  Number(Vdbe *v, 
64e0: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71  int iLine){.  sq
64f0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
6500: 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  ,-1)->iSrcLine =
6510: 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66   iLine;.}.#endif
6520: 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f   /* SQLITE_VDBE_
6530: 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a  COVERAGE */../*.
6540: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
6550: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
6560: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
6570: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
6580: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
6590: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
65a0: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
65b0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
65c0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
65d0: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
65e0: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
65f0: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
6600: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
6610: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
6620: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
6630: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
6640: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
6650: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
6660: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
6670: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
6680: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
6690: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
66a0: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
66b0: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
66c0: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
66d0: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
66e0: 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  fter an OOM faul
66f0: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
6700: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
6710: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
6720: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
6730: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
6740: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
6750: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
6760: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
6770: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
6780: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
6790: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
67a0: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
67b0: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
67c0: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
67d0: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
67e0: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
67f0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
6800: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
6810: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
6820: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
6830: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
6840: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
6850: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
6860: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
6870: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
6880: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
6890: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
68a0: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
68b0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
68c0: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
68d0: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
68e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
68f0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
6900: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
6910: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
6920: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
6930: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
6940: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
6950: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
6960: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6970: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
6980: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
6990: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
69a0: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
69b0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
69c0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
69d0: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
69e0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
69f0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
6a00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
6a10: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
6a20: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
6a30: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
6a40: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
6a50: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
6a60: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
6a70: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
6a80: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
6a90: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
6aa0: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
6ab0: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
6ac0: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
6ad0: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
6ae0: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
6af0: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
6b00: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
6b10: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
6b20: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
6b30: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
6b40: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
6b50: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
6b60: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
6b70: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
6b80: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
6b90: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
6ba0: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
6bb0: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
6bc0: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
6bd0: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
6be0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
6bf0: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
6c00: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
6c10: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
6c20: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
6c30: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
6c40: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
6c50: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
6c60: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
6c70: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
6c80: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
6c90: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
6ca0: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
6cb0: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
6cc0: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
6cd0: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
6ce0: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
6cf0: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
6d00: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
6d10: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
6d20: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
6d30: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
6d40: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
6d50: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
6d60: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
6d70: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
6d80: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
6d90: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
6da0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6db0: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
6dc0: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
6dd0: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
6de0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
6df0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
6e00: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
6e10: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
6e20: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
6e30: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
6e40: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
6e50: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
6e60: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
6e70: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
6e80: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
6e90: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
6ea0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
6eb0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
6ec0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
6ed0: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
6ee0: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
6ef0: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
6f00: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
6f10: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
6f20: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
6f30: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
6f40: 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e + 1;.    for(i
6f50: 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70  i=jj=0; jj<nTemp
6f60: 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f  -1 && (c = zSyno
6f70: 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69  psis[ii])!=0; ii
6f80: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  ++){.      if( c
6f90: 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20  =='P' ){.       
6fa0: 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b   c = zSynopsis[+
6fb0: 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii];.        if
6fc0: 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20  ( c=='4' ){.    
6fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6fe0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
6ff0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
7000: 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d   zP4);.        }
7010: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20  else if( c=='X' 
7020: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7030: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7040: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7050: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
7060: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  mment);.        
7070: 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20    seenCom = 1;. 
7080: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7090: 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d          int v1 =
70a0: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70   translateP(c, p
70b0: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Op);.          i
70c0: 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20  nt v2;.         
70d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
70e0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
70f0: 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b  p+jj, "%d", v1);
7100: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
7110: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
7120: 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d  +ii+1, "@P", 2)=
7130: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7140: 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20    ii += 3;.     
7150: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
7160: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
7170: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20  mp+jj);.        
7180: 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61      v2 = transla
7190: 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69  teP(zSynopsis[ii
71a0: 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  ], pOp);.       
71b0: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
71c0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
71d0: 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "+1",2)==0 ){.  
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
71f0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
7200: 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20     v2++;.       
7210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7220: 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20     if( v2>1 ){. 
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7240: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7250: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7260: 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d  , "..%d", v1+v2-
7270: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
7280: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
7290: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
72a0: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e  ynopsis+ii+1, ".
72b0: 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70  .P3", 4)==0 && p
72c0: 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20  Op->p3==0 ){.   
72d0: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34           ii += 4
72e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
72f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7300: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
7310: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
7320: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7330: 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b        zTemp[jj++
7340: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = c;.      }. 
7350: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
7360: 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d  enCom && jj<nTem
7370: 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d  p-5 && pOp->zCom
7380: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ment ){.      sq
7390: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
73a0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
73b0: 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e  j, "; %s", pOp->
73c0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
73d0: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
73e0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
73f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7400: 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70  jj<nTemp ) zTemp
7410: 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  [jj] = 0;.  }els
7420: 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e if( pOp->zComm
7430: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
7440: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7450: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20  p, zTemp, "%s", 
7460: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
7470: 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33      jj = sqlite3
7480: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
7490: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
74a0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
74b0: 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  jj = 0;.  }.  re
74c0: 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69  turn jj;.}.#endi
74d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
74e0: 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65 66 69  G */...#if !defi
74f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7500: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
7510: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
7520: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
7530: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
7540: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
7550: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
7560: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
7570: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
7580: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
7590: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
75a0: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
75b0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
75c0: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
75d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
75e0: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
75f0: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
7600: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
7610: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
7620: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
7630: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
7640: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
7650: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
7660: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
7670: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
7680: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
7690: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
76a0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
76b0: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
76c0: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
76d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
76e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
76f0: 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79  mp, "k(%d", pKey
7700: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
7710: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33       i = sqlite3
7720: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
7730: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
7740: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
7750: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
7760: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7770: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
7780: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
7790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
77a0: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
77b0: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b  ->zName : "nil";
77c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
77d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
77e0: 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  (zColl);.       
77f0: 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d   if( n==6 && mem
7800: 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52  cmp(zColl,"BINAR
7810: 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Y",6)==0 ){.    
7820: 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42        zColl = "B
7830: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  ";.          n =
7840: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7850: 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54        if( i+n>nT
7860: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
7870: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
7880: 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20  [i],",...",4);. 
7890: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
78a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
78b0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
78c0: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ,';.        if( 
78d0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
78e0: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
78f0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
7900: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d  = '-';.        }
7910: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
7920: 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c  &zTemp[i], zColl
7930: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , n+1);.        
7940: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  i += n;.      }.
7950: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
7960: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
7970: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
7980: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
7990: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
79a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
79b0: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
79c0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
79d0: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
79e0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
79f0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7a00: 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30  p, zTemp, "(%.20
7a10: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
7a20: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
7a30: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7a40: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
7a50: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
7a60: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
7a70: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
7a80: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7a90: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
7aa0: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
7ab0: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
7ac0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7ad0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
7ae0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7af0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7b00: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
7b10: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
7b20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7b30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7b40: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
7b50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7b60: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
7b70: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
7b80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7b90: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
7ba0: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
7bb0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7bc0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
7bd0: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
7be0: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
7bf0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7c00: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
7c10: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
7c20: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
7c30: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
7c40: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
7c50: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
7c60: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
7c70: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
7c80: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
7c90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7ca0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7cb0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
7cc0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
7cd0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
7ce0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
7cf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7d00: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7d10: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
7d20: 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a  g", pMem->u.r);.
7d30: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7d40: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
7d50: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  M_Null ){.      
7d60: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7d70: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7d80: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20   "NULL");.      
7d90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
7da0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
7db0: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
7dc0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
7dd0: 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d  (blob)";.      }
7de0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7df0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
7e00: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7e10: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34  ABLE.    case P4
7e20: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
7e30: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
7e40: 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
7e50: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
7e60: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7e70: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7e80: 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56  "vtab:%p:%p", pV
7e90: 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64  tab, pVtab->pMod
7ea0: 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ule);.      brea
7eb0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
7ec0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
7ed0: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
7ee0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7ef0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e  Temp, zTemp, "in
7f00: 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20  tarray");.      
7f10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7f20: 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47   case P4_SUBPROG
7f30: 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAM: {.      sql
7f40: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7f50: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f  emp, zTemp, "pro
7f60: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
7f70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7f80: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
7f90: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
7fa0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
7fb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
7fc0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
7fd0: 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  4 = pOp->p4.z;. 
7fe0: 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20       if( zP4==0 
7ff0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
8000: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   zTemp;.        
8010: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
8020: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8030: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
8040: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
8050: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
8060: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
8070: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
8080: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
8090: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
80a0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65  d..**.** The pre
80b0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
80c0: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e   need to know in
80d0: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d   advance the com
80e0: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20  plete set of.** 
80f0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
8100: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
8110: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20  use.  A mask of 
8120: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a  these databases.
8130: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ** is maintained
8140: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
8150: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61  .  The p->lockMa
8160: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  sk value is the 
8170: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e  subset of.** p->
8180: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74  btreeMask of dat
8190: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
81a0: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e   require a lock.
81b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
81c0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
81d0: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
81e0: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
81f0: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
8200: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
8210: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
8220: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
8230: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
8240: 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b  k)*8 );.  DbMask
8250: 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  Set(p->btreeMask
8260: 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31  , i);.  if( i!=1
8270: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
8280: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
8290: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
82a0: 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e     DbMaskSet(p->
82b0: 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  lockMask, i);.  
82c0: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
82d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
82e0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
82f0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
8300: 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  >0./*.** If SQLi
8310: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
8320: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
8330: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
8340: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
8350: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
8360: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
8370: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
8380: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
8390: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
83a0: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
83b0: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
83c0: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
83d0: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
83e0: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
83f0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
8400: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
8410: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
8420: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
8430: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
8440: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
8450: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
8460: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
8470: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
8480: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
8490: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
84a0: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
84b0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
84c0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
84d0: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
84e0: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
84f0: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
8500: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
8510: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
8520: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
8530: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
8540: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
8550: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
8560: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
8570: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
8580: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
8590: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
85a0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
85b0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
85c0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
85d0: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
85e0: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
85f0: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
8600: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
8610: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
8620: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
8630: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
8640: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
8650: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
8660: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
8670: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
8680: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
8690: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
86a0: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
86b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
86c0: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
86d0: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
86e0: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
86f0: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
8700: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
8710: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
8720: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
8730: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
8740: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
8750: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
8760: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
8770: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
8780: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
8790: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
87a0: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
87b0: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
87c0: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
87d0: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
87e0: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
87f0: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
8800: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
8810: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
8820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8830: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
8840: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
8850: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
8860: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8870: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
8880: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
8890: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
88a0: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
88b0: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
88c0: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
88d0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
88e0: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
88f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8900: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
8910: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
8920: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
8930: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
8940: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
8950: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
8960: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
8970: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
8980: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
8990: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
89a0: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
89b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
89c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
89d0: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
89e0: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
89f0: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
8a00: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
8a10: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8a20: 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74  Leave(aDb[i].pBt
8a30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
8a40: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
8a50: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
8a60: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
8a70: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
8a80: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
8a90: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
8aa0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
8ab0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
8ac0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8ad0: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
8ae0: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
8af0: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
8b00: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
8b10: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a  tr[50];.  char z
8b20: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74  Com[100];.  stat
8b30: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
8b40: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
8b50: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
8b60: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e   %-13s %.2X %s\n
8b70: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
8b80: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
8b90: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
8ba0: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
8bb0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69  izeof(zPtr));.#i
8bc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8bd0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
8be0: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d  NTS.  displayCom
8bf0: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a  ment(pOp, zP4, z
8c00: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d  Com, sizeof(zCom
8c10: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d  ));.#else.  zCom
8c20: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
8c30: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
8c40: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
8c50: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
8c60: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
8c70: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
8c80: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
8c90: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
8ca0: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
8cb0: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
8cc0: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
8cd0: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
8ce0: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
8cf0: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
8d00: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
8d10: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
8d20: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
8d30: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
8d40: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
8d50: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
8d60: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
8d70: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
8d80: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
8d90: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
8da0: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
8db0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8dc0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
8dd0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
8de0: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
8df0: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20      Mem *pEnd = 
8e00: 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74  &p[N];.    sqlit
8e10: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
8e20: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
8e30: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
8e40: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
8e50: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
8e60: 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  d ){.      do{. 
8e70: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a         if( p->sz
8e80: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
8e90: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
8ea0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77  alloc);.      }w
8eb0: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
8ec0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
8ed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
8ee0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
8ef0: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
8f00: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
8f10: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8f20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
8f30: 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70  kMemInvariants(p
8f40: 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ) );..      /* T
8f50: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
8f60: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
8f70: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
8f80: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
8f90: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
8fa0: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
8fb0: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
8fc0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
8fd0: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
8fe0: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
8ff0: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
9000: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
9010: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
9020: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
9030: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
9040: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
9050: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
9060: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
9070: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
9080: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
9090: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
90a0: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
90b0: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
90c0: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
90d0: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
90e0: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
90f0: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
9100: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
9110: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
9120: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
9130: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
9140: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
9150: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
9160: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
9170: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
9180: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
9190: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
91a0: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
91b0: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
91c0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
91d0: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
91e0: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
91f0: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
9200: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
9210: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
9220: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
9230: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67  >flags & MEM_Agg
9240: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9250: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
9260: 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20  EM_Dyn );.      
9270: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
9280: 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29  gs & MEM_Frame )
9290: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
92a0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
92b0: 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20  _RowSet );.     
92c0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
92d0: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d  EM_Agg|MEM_Dyn|M
92e0: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77  EM_Frame|MEM_Row
92f0: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Set) ){.        
9300: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
9310: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
9320: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d  }else if( p->szM
9330: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
9340: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9350: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
9360: 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c          p->szMal
9370: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  loc = 0;.      }
9380: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ..      p->flags
9390: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
93a0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b  ;.    }while( (+
93b0: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
93c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
93d0: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
93e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
93f0: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
9400: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
9410: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
9420: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
9430: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
9440: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
9450: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
9460: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
9470: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
9480: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
9490: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
94a0: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
94b0: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
94c0: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
94d0: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
94e0: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
94f0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
9500: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
9510: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
9520: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
9530: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
9540: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
9550: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
9560: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
9570: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
9580: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
9590: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
95a0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
95b0: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
95c0: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
95d0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
95e0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
95f0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
9600: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
9610: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
9620: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
9630: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
9640: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
9650: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
9660: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
9670: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
9680: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
9690: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
96a0: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
96b0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
96c0: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
96d0: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
96e0: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
96f0: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
9700: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
9710: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
9720: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
9730: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
9740: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
9750: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
9760: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
9770: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
9780: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a  UERY PLAN..**.**
9790: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
97a0: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
97b0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
97c0: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
97d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
97e0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
97f0: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
9800: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
9810: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
9820: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
9830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9840: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
9850: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9870: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
9880: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
9890: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
98a0: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
98d0: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
98e0: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
98f0: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9910: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
9920: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
9930: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9950: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
9960: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
9970: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
9980: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
99b0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
99c0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
99f0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
9a00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a20: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
9a30: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
9a40: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
9a50: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
9a60: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
9a70: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
9a80: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
9a90: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
9aa0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
9ab0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9ac0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
9ad0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
9ae0: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
9af0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
9b00: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
9b10: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
9b20: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
9b30: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
9b40: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
9b50: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
9b60: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
9b70: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
9b80: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
9b90: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
9ba0: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
9bb0: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
9bc0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
9bd0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
9be0: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
9bf0: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
9c00: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9c10: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
9c20: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
9c30: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
9c40: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
9c50: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9c60: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
9c70: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9c80: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
9c90: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
9ca0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
9cb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9cc0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
9cd0: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
9ce0: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
9cf0: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
9d00: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
9d10: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
9d20: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
9d30: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
9d40: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
9d50: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
9d60: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
9d70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
9d80: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
9d90: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
9da0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
9db0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
9dc0: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
9dd0: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
9de0: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
9df0: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
9e00: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
9e10: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
9e20: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
9e30: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
9e40: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
9e50: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
9e60: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
9e70: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
9e80: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
9e90: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
9ea0: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
9eb0: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
9ec0: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
9ed0: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
9ee0: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
9ef0: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
9f00: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
9f10: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
9f20: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
9f30: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
9f40: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
9f50: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
9f60: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
9f70: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
9f80: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
9f90: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
9fa0: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
9fb0: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
9fc0: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
9fd0: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
9fe0: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
9ff0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
a000: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
a010: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
a020: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
a030: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
a040: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
a050: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
a060: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
a070: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
a080: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
a090: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
a0a0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
a0b0: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
a0c0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
a0d0: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
a0e0: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
a0f0: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
a100: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
a110: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
a120: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
a130: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
a140: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
a150: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
a160: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
a170: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
a180: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
a190: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
a1a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
a1b0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
a1c0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
a1d0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
a1e0: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
a1f0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
a200: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
a210: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
a220: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
a230: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
a240: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
a250: 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  zP4;.    Op *pOp
a260: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  ;.    if( i<p->n
a270: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
a280: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
a290: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
a2a0: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
a2b0: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
a2c0: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
a2d0: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
a2e0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
a2f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a300: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
a310: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
a320: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
a330: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
a340: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
a350: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
a360: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
a370: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
a380: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
a390: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
a3a0: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
a3b0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
a3c0: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
a3d0: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
a3e0: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
a3f0: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
a400: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
a410: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
a420: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a430: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
a440: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
a470: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
a480: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
a490: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
a4a0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
a4b0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
a4c0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  m;.      pMem->z
a4d0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
a4e0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
a4f0: 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63  >opcode); /* Opc
a500: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ode */.      ass
a510: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
a520: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
a530: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a540: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
a550: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
a560: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
a570: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
a580: 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50   /* When an OP_P
a590: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73  rogram opcode is
a5a0: 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20   encounter (the 
a5b0: 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74  only opcode that
a5c0: 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20   has.      ** a 
a5d0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72  P4_SUBPROGRAM ar
a5e0: 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20  gument), expand 
a5f0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a600: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
a610: 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65  rams.      ** ke
a620: 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d  pt in p->aMem[9]
a630: 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  .z to hold the n
a640: 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73  ew program - ass
a650: 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72  uming this subpr
a660: 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68  ogram.      ** h
a670: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
a680: 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20  een seen..      
a690: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  */.      if( pOp
a6a0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
a6b0: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
a6c0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
a6d0: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
a6e0: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
a6f0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
a700: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
a710: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
a720: 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a       if( apSub[j
a730: 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  ]==pOp->p4.pProg
a740: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
a750: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a760: 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51  f( j==nSub && SQ
a770: 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33  LITE_OK==sqlite3
a780: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62  VdbeMemGrow(pSub
a790: 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30  , nByte, nSub!=0
a7a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
a7b0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
a7c0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
a7d0: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
a7e0: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
a7f0: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
a800: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
a810: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
a820: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
a830: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
a840: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
a850: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a860: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
a870: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
a880: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
a890: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
a8c0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
a8d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
a8e0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
a8f0: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
a920: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
a930: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a940: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
a950: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
a980: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
a990: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
a9a0: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
a9b0: 7a 65 28 70 4d 65 6d 2c 20 33 32 29 20 29 7b 20  ze(pMem, 32) ){ 
a9c0: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
a9d0: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
a9e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
a9f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aa00: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
aa10: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
aa20: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
aa30: 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73  m;.    zP4 = dis
aa40: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
aa50: 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66  ->z, 32);.    if
aa60: 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29  ( zP4!=pMem->z )
aa70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
aa80: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
aa90: 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49  m, zP4, -1, SQLI
aaa0: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20  TE_UTF8, 0);.   
aab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
aac0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
aad0: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
aae0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
aaf0: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
ab00: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
ab10: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
ab20: 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a   }.    pMem++;..
ab30: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
ab40: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
ab50: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
ab60: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
ab70: 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20  pMem, 4) ){.    
ab80: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
ab90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
aba0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
abb0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
abc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
abd0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
abe0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
abf0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b      pMem->n = 2;
ac00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
ac10: 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d  nprintf(3, pMem-
ac20: 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  >z, "%.2x", pOp-
ac30: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
ac40: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
ac50: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
ac60: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
ac70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ac80: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
ac90: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28  MMENTS.      if(
aca0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
acb0: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
acc0: 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20  em, 500) ){.    
acd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
ace0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
acf0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
ad00: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
ad10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
ad20: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
ad30: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
ad40: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69      pMem->n = di
ad50: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
ad60: 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  , zP4, pMem->z, 
ad70: 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  500);.      pMem
ad80: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
ad90: 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  TF8;.#else.     
ada0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
adb0: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
add0: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e  * Comment */.#en
ade0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  dif.    }..    p
adf0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
ae00: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
ae10: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73  -1);.    p->pRes
ae20: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
ae30: 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  m[1];.    p->rc 
ae40: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
ae50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
ae60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
ae70: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
ae80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
ae90: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
aea0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
aeb0: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
aec0: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
aed0: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
aee0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
aef0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
af00: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
af10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
af20: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71   0;.  if( p->zSq
af30: 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e  l ){.    z = p->
af40: 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  zSql;.  }else if
af50: 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20  ( p->nOp>=1 ){. 
af60: 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20     const VdbeOp 
af70: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30  *pOp = &p->aOp[0
af80: 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ];.    if( pOp->
af90: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
afa0: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
afb0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70  ){.      z = pOp
afc0: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68  ->p4.z;.      wh
afd0: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
afe0: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
aff0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
b000: 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20   ) printf("SQL: 
b010: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23  [%s]\n", z);.}.#
b020: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
b030: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b040: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
b050: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
b060: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
b070: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
b080: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
b090: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
b0a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
b0b0: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
b0c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
b0d0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
b0e0: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
b0f0: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
b100: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
b110: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
b120: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
b130: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
b140: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
b150: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
b160: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
b170: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
b180: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
b190: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
b1a0: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
b1b0: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
b1c0: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
b1d0: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
b1e0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
b1f0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
b200: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
b210: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
b220: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
b230: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
b240: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
b250: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b260: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
b270: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
b280: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
b290: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
b2a0: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
b2b0: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
b2c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
b2d0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
b2e0: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
b2f0: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  IOTRACE */../*.*
b300: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
b310: 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69   from a fixed si
b320: 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65  ze buffer and re
b330: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b340: 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e  o.** that space.
b350: 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e    If insufficien
b360: 74 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  t space is avail
b370: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  able, return NUL
b380: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75  L..**.** The pBu
b390: 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  f parameter is t
b3a0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
b3b0: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68   of a pointer wh
b3c0: 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65  ich will.** rece
b3d0: 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f  ive the new memo
b3e0: 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72  ry.  pBuf is nor
b3f0: 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20  mally NULL.  If 
b400: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
b410: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
b420: 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  at memory space 
b430: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
b440: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
b450: 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hat.** this rout
b460: 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61  ine should not a
b470: 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20  llocate any new 
b480: 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42  memory.  When pB
b490: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
b4a0: 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  L simply return 
b4b0: 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f  pBuf.  Only allo
b4c0: 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20  cate new memory 
b4d0: 73 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a  space when pBuf.
b4e0: 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ** is NULL..**.*
b4f0: 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e  * nByte is the n
b500: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
b510: 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a  f space needed..
b520: 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f  **.** *ppFrom po
b530: 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c  ints to availabl
b540: 65 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64  e space and pEnd
b550: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65   points to the e
b560: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61  nd of the.** ava
b570: 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57  ilable space.  W
b580: 68 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c  hen space is all
b590: 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20  ocated, *ppFrom 
b5a0: 69 73 20 61 64 76 61 6e 63 65 64 20 70 61 73 74  is advanced past
b5b0: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
b5c0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  he allocated spa
b5d0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74  ce..**.** *pnByt
b5e0: 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f  e is a counter o
b5f0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
b600: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  bytes of space t
b610: 68 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a  hat have failed.
b620: 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20  ** to allocate. 
b630: 20 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73   If there is ins
b640: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
b650: 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61  in *ppFrom to sa
b660: 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71  tisfy the.** req
b670: 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65  uest, then incre
b680: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20  ment *pnByte by 
b690: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
b6a0: 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74  e request..*/.st
b6b0: 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63  atic void *alloc
b6c0: 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70  Space(.  void *p
b6d0: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Buf,          /*
b6e0: 20 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f   Where return po
b6f0: 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74  inter will be st
b700: 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ored */.  int nB
b710: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  yte,           /
b720: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
b730: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
b740: 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20  .  u8 **ppFrom, 
b750: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
b760: 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d  T: Allocate from
b770: 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38   *ppFrom */.  u8
b780: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
b790: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
b7a0: 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65   1 byte past the
b7b0: 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20   end of *ppFrom 
b7c0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
b7d0: 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  *pnByte         
b7e0: 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f   /* If allocatio
b7f0: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65  n cannot be made
b800: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  , increment *pnB
b810: 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  yte */.){.  asse
b820: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
b830: 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d  LIGNMENT(*ppFrom
b840: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20  ) );.  if( pBuf 
b850: 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20  ) return pBuf;. 
b860: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
b870: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28  nByte);.  if( &(
b880: 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20  *ppFrom)[nByte] 
b890: 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70  <= pEnd ){.    p
b8a0: 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70  Buf = (void*)*pp
b8b0: 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f  From;.    *ppFro
b8c0: 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65  m += nByte;.  }e
b8d0: 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65  lse{.    *pnByte
b8e0: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20   += nByte;.  }. 
b8f0: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a   return pBuf;.}.
b900: 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68  ./*.** Rewind th
b910: 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74  e VDBE back to t
b920: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20  he beginning in 
b930: 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a  preparation for.
b940: 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a  ** running it..*
b950: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b960: 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70  beRewind(Vdbe *p
b970: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
b980: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
b990: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
b9a0: 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23  FILE).  int i;.#
b9b0: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
b9c0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
b9d0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
b9e0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
b9f0: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
ba00: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
ba10: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
ba20: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
ba30: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
ba40: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
ba50: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
ba60: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
ba70: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
ba80: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
ba90: 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  RUN;..#ifdef SQL
baa0: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
bab0: 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=1; i<p->nMem; 
bac0: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
bad0: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d  ( p->aMem[i].db=
bae0: 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65  =p->db );.  }.#e
baf0: 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  ndif.  p->pc = -
bb00: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
bb10: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72  ITE_OK;.  p->err
bb20: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
bb30: 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ort;.  p->magic 
bb40: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
bb50: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
bb60: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
bb70: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
bb80: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
bb90: 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74   255;.  p->iStat
bba0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ement = 0;.  p->
bbb0: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  nFkConstraint = 
bbc0: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
bbd0: 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30  ROFILE.  for(i=0
bbe0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
bbf0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  {.    p->aOp[i].
bc00: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  cnt = 0;.    p->
bc10: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
bc20: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
bc30: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
bc40: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
bc50: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66   for execution f
bc60: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
bc70: 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74  e after.** creat
bc80: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20  ing the virtual 
bc90: 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69  machine.  This i
bca0: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
bcb0: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
bcc0: 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61  ting registers a
bcd0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
bce0: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
bcf0: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
bd00: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
bd10: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
bd20: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
bd30: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
bd40: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
bd50: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
bd60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
bd70: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
bd80: 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68  tly once on each
bd90: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
bda0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
bdb0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
bdc0: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
bdd0: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
bde0: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
bdf0: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
be00: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
be10: 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c  ed, further call
be20: 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s to .** sqlite3
be30: 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63  VdbeAddOp() func
be40: 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62  tions are prohib
be50: 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ited.  This rout
be60: 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a  ine disconnects.
be70: 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ** the Vdbe from
be80: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
be90: 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65  t that helped ge
bea0: 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61  nerate it so tha
beb0: 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62  t the.** the Vdb
bec0: 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64  e becomes an ind
bed0: 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20  ependent entity 
bee0: 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62  and the Parse ob
bef0: 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64  ject can be.** d
bf00: 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
bf10: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56  Use the sqlite3V
bf20: 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63  dbeRewind() proc
bf30: 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65  edure to restore
bf40: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
bf50: 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74  ne back.** to it
bf60: 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20  s initial state 
bf70: 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65  after it has bee
bf80: 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  n run..*/.void s
bf90: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
bfa0: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
bfd0: 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  E */.  Parse *pP
bfe0: 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20  arse            
bff0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
c000: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
c010: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
c040: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
c050: 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20  int nVar;       
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c070: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  * Number of para
c080: 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  meters */.  int 
c090: 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
c0a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c0b0: 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72  mber of VM memor
c0c0: 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  y registers */. 
c0d0: 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20   int nCursor;   
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
c100: 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f  sors required */
c110: 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
c140: 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70  rguments in subp
c150: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
c160: 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20   nOnce;         
c170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c180: 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65  umber of OP_Once
c190: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f   instructions */
c1a0: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
c1d0: 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b  r */.  u8 *zCsr;
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
c200: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
c210: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  location */.  u8
c220: 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *zEnd;         
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c240: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
c250: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
c260: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
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 48 6f 77 20 6d 75 63 68       /* How much
c290: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73   extra memory is
c2a0: 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73   needed */..  as
c2b0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
c2c0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
c2d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
c2e0: 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
c2f0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
c300: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
c310: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
c320: 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b  se==p->pParse );
c330: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
c340: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
c350: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a  locFailed==0 );.
c360: 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d    nVar = pParse-
c370: 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20  >nVar;.  nMem = 
c380: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
c390: 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  nCursor = pParse
c3a0: 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d  ->nTab;.  nArg =
c3b0: 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67   pParse->nMaxArg
c3c0: 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72  ;.  nOnce = pPar
c3d0: 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28  se->nOnce;.  if(
c3e0: 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63   nOnce==0 ) nOnc
c3f0: 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65  e = 1; /* Ensure
c400: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79   at least one by
c410: 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c  te in p->aOnceFl
c420: 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  ag[] */.  .  /* 
c430: 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20  For each cursor 
c440: 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61  required, also a
c450: 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79  llocate a memory
c460: 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20   cell. Memory.  
c470: 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31  ** cells (nMem+1
c480: 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c  -nCursor)..nMem,
c490: 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c   inclusive, will
c4a0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62   never be used b
c4b0: 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20  y.  ** the vdbe 
c4c0: 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64  program. Instead
c4d0: 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74   they are used t
c4e0: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
c4f0: 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75   for.  ** VdbeCu
c500: 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74  rsor/BtCursor st
c510: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c  ructures. The bl
c520: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
c530: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20  ociated with .  
c540: 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73  ** cursor 0 is s
c550: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
c560: 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72  cell nMem. Memor
c570: 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a  y cell (nMem-1).
c580: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
c590: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
c5a0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
c5b0: 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20  ursor 1, etc..  
c5c0: 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
c5d0: 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  : allocateCursor
c5e0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20  ()..  */.  nMem 
c5f0: 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f  += nCursor;..  /
c600: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
c610: 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69   for memory regi
c620: 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61  sters, SQL varia
c630: 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f  bles, VDBE curso
c640: 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20  rs and .  ** an 
c650: 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c  array to marshal
c660: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72   SQL function ar
c670: 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f  guments in..  */
c680: 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26  .  zCsr = (u8*)&
c690: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20  p->aOp[p->nOp]; 
c6a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
c6b0: 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66  mory avaliable f
c6c0: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
c6d0: 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26  .  zEnd = (u8*)&
c6e0: 70 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e  p->aOp[pParse->n
c6f0: 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69  OpAlloc];  /* Fi
c700: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 65 6e  rst byte past en
c710: 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a  d of zCsr[] */..
c720: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
c730: 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70  s(p, &nArg);.  p
c740: 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
c750: 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d  l = (u8)(pParse-
c760: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26  >isMultiWrite &&
c770: 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72   pParse->mayAbor
c780: 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  t);.  if( pParse
c790: 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65  ->explain && nMe
c7a0: 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d  m<10 ){.    nMem
c7b0: 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d   = 10;.  }.  mem
c7c0: 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e  set(zCsr, 0, zEn
c7d0: 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72 20  d-zCsr);.  zCsr 
c7e0: 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29  += (zCsr - (u8*)
c7f0: 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28 20  0)&7;.  assert( 
c800: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
c810: 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20  MENT(zCsr) );.  
c820: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
c830: 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72  .  /* Memory for
c840: 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61   registers, para
c850: 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20  meters, cursor, 
c860: 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65  etc, is allocate
c870: 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61  d in two.  ** pa
c880: 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69  sses.  On the fi
c890: 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79  rst pass, we try
c8a0: 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64   to reuse unused
c8b0: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20   space at the . 
c8c0: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f   ** end of the o
c8d0: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66  pcode array.  If
c8e0: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
c8f0: 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65  o satisfy all me
c900: 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72  mory.  ** requir
c910: 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e  ements by reusin
c920: 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  g the opcode arr
c930: 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68  ay tail, then th
c940: 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61  e second.  ** pa
c950: 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20  ss will fill in 
c960: 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61  the rest using a
c970: 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f   fresh allocatio
c980: 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
c990: 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70  his two-pass app
c9a0: 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65  roach that reuse
c9b0: 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  s as much memory
c9c0: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
c9d0: 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f  m.  ** the lefto
c9e0: 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65  ver space at the
c9f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
ca00: 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67  de array can sig
ca10: 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
ca20: 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e  reduce the amoun
ca30: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64  t of memory held
ca40: 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73   by a prepared s
ca50: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
ca60: 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20   do {.    nByte 
ca70: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  = 0;.    p->aMem
ca80: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
ca90: 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65  >aMem, nMem*size
caa0: 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20  of(Mem), &zCsr, 
cab0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
cac0: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c     p->aVar = all
cad0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c  ocSpace(p->aVar,
cae0: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
caf0: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
cb00: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
cb10: 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61  apArg = allocSpa
cb20: 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  ce(p->apArg, nAr
cb30: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20  g*sizeof(Mem*), 
cb40: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
cb50: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56  yte);.    p->azV
cb60: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
cb70: 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73  p->azVar, nVar*s
cb80: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a  izeof(char*), &z
cb90: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
cba0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72  e);.    p->apCsr
cbb0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
cbc0: 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a  >apCsr, nCursor*
cbd0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
cbe0: 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r*),.           
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
cc00: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
cc10: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63  te);.    p->aOnc
cc20: 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61  eFlag = allocSpa
cc30: 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c  ce(p->aOnceFlag,
cc40: 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a   nOnce, &zCsr, z
cc50: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
cc60: 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c    p->anExec = al
cc70: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e 45 78  locSpace(p->anEx
cc80: 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f  ec, p->nOp*sizeo
cc90: 66 28 69 36 34 29 2c 20 26 7a 43 73 72 2c 20 7a  f(i64), &zCsr, z
cca0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
ccb0: 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
ccc0: 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20       p->pFree = 
ccd0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
cce0: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
ccf0: 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d      }.    zCsr =
cd00: 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a   p->pFree;.    z
cd10: 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74  End = &zCsr[nByt
cd20: 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42  e];.  }while( nB
cd30: 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  yte && !db->mall
cd40: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70  ocFailed );..  p
cd50: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72  ->nCursor = nCur
cd60: 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46  sor;.  p->nOnceF
cd70: 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69  lag = nOnce;.  i
cd80: 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20  f( p->aVar ){.  
cd90: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56    p->nVar = (ynV
cda0: 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72  ar)nVar;.    for
cdb0: 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b  (n=0; n<nVar; n+
cdc0: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  +){.      p->aVa
cdd0: 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  r[n].flags = MEM
cde0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  _Null;.      p->
cdf0: 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aVar[n].db = db;
ce00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
ce10: 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20   p->azVar ){.   
ce20: 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72   p->nzVar = pPar
ce30: 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d  se->nzVar;.    m
ce40: 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20  emcpy(p->azVar, 
ce50: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70  pParse->azVar, p
ce60: 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70  ->nzVar*sizeof(p
ce70: 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20  ->azVar[0]));.  
ce80: 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d    memset(pParse-
ce90: 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73  >azVar, 0, pPars
cea0: 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28  e->nzVar*sizeof(
ceb0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d  pParse->azVar[0]
cec0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
ced0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e  >aMem ){.    p->
cee0: 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20  aMem--;         
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf00: 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d  aMem[] goes from
cf10: 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20   1..nMem */.    
cf20: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20  p->nMem = nMem; 
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f  /*       not fro
cf50: 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20  m 0..nMem-1 */. 
cf60: 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e     for(n=1; n<=n
cf70: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Mem; n++){.     
cf80: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67   p->aMem[n].flag
cf90: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
cfa0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  d;.      p->aMem
cfb0: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
cfc0: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c   }.  }.  p->expl
cfd0: 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78  ain = pParse->ex
cfe0: 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  plain;.  sqlite3
cff0: 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
d000: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
d010: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
d020: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
d030: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
d040: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
d050: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
d060: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
d070: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
d080: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
d090: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
d0a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
d0b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
d0c0: 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e  eSorterClose(p->
d0d0: 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20  db, pCx);.  if( 
d0e0: 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pCx->pBt ){.    
d0f0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
d100: 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pCx->pBt);.   
d110: 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75   /* The pCx->pCu
d120: 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f  rsor will be clo
d130: 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  se automatically
d140: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20  , if it exists, 
d150: 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  by.    ** the ca
d160: 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d  ll above. */.  }
d170: 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43  else if( pCx->pC
d180: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
d190: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
d1a0: 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f  rsor(pCx->pCurso
d1b0: 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  r);.  }.#ifndef 
d1c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
d1d0: 55 41 4c 54 41 42 4c 45 0a 20 20 65 6c 73 65 20  UALTABLE.  else 
d1e0: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
d1f0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
d200: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
d210: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
d220: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
d230: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
d240: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
d250: 6c 65 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72  le = pVtabCursor
d260: 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
d270: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
d280: 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70  ethod = 1;.    p
d290: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
d2a0: 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20  VtabCursor);.   
d2b0: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
d2c0: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
d2d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
d2e0: 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
d2f0: 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
d300: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
d310: 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
d320: 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
d330: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
d340: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
d350: 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
d360: 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
d370: 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
d380: 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
d390: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
d3a0: 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
d3b0: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
d3c0: 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
d3d0: 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70  .  v->anExec = p
d3e0: 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 20  Frame->anExec;. 
d3f0: 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20   v->aOnceFlag = 
d400: 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61  pFrame->aOnceFla
d410: 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61  g;.  v->nOnceFla
d420: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63  g = pFrame->nOnc
d430: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20  eFlag;.  v->aOp 
d440: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20  = pFrame->aOp;. 
d450: 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65   v->nOp = pFrame
d460: 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d  ->nOp;.  v->aMem
d470: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b   = pFrame->aMem;
d480: 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72  .  v->nMem = pFr
d490: 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->nMem;.  v->
d4a0: 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e  apCsr = pFrame->
d4b0: 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72  apCsr;.  v->nCur
d4c0: 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  sor = pFrame->nC
d4d0: 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e  ursor;.  v->db->
d4e0: 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61  lastRowid = pFra
d4f0: 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20  me->lastRowid;. 
d500: 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46   v->nChange = pF
d510: 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20  rame->nChange;. 
d520: 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20   v->db->nChange 
d530: 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61  = pFrame->nDbCha
d540: 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  nge;.  return pF
d550: 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a  rame->pc;.}../*.
d560: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
d570: 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  sors..**.** Also
d580: 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e   release any dyn
d590: 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64  amic memory held
d5a0: 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68   by the VM in th
d5b0: 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f  e Vdbe.aMem memo
d5c0: 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61  ry .** cell arra
d5d0: 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  y. This is neces
d5e0: 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f  sary as the memo
d5f0: 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61  ry cell array ma
d600: 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69  y contain.** poi
d610: 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61  nters to VdbeFra
d620: 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63  me objects, whic
d630: 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f  h may in turn co
d640: 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
d650: 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  o.** open cursor
d660: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
d670: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
d680: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  s(Vdbe *p){.  if
d690: 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
d6a0: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46     VdbeFrame *pF
d6b0: 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46  rame;.    for(pF
d6c0: 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
d6d0: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
d6e0: 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
d6f0: 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71  pParent);.    sq
d700: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
d710: 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
d720: 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30     p->pFrame = 0
d730: 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20  ;.    p->nFrame 
d740: 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
d750: 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20  t( p->nFrame==0 
d760: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  );..  if( p->apC
d770: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
d780: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d790: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
d7a0: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
d7b0: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
d7c0: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
d7d0: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
d7e0: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
d7f0: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
d800: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
d810: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
d820: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
d830: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
d840: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
d850: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
d860: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
d870: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
d880: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
d890: 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
d8a0: 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
d8b0: 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
d8c0: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
d8d0: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
d8e0: 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pDel);.  }..  /
d8f0: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78  * Delete any aux
d900: 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  data allocations
d910: 20 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20   made by the VM 
d920: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78  */.  if( p->pAux
d930: 44 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64  Data ) sqlite3Vd
d940: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
d950: 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73  p, -1, 0);.  ass
d960: 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61  ert( p->pAuxData
d970: 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
d980: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
d990: 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 72  after a single r
d9a0: 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  un..*/.static vo
d9b0: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
d9c0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
d9d0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66  db = p->db;..#if
d9e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
d9f0: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73  .  /* Execute as
da00: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
da10: 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
da20: 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b   the Vdbe.apCsr[
da30: 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65  ] and .  ** Vdbe
da40: 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68  .aMem[] arrays h
da50: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
da60: 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f   cleaned up.  */
da70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
da80: 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69  p->apCsr ) for(i
da90: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
daa0: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
dab0: 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
dac0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
dad0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  {.    for(i=1; i
dae0: 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20  <=p->nMem; i++) 
daf0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
db00: 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e  i].flags==MEM_Un
db10: 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  defined );.  }.#
db20: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
db30: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
db40: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
db50: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
db60: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
db70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
db80: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
db90: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
dba0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
dbb0: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
dbc0: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
dbd0: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
dbe0: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
dbf0: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
dc00: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
dc10: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
dc20: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
dc30: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
dc40: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
dc50: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
dc60: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
dc70: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
dc80: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
dc90: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
dca0: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
dcb0: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
dcc0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
dcd0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
dce0: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
dcf0: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
dd00: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
dd10: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
dd20: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
dd30: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
dd40: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
dd50: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
dd60: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
dd70: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
dd80: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
dd90: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
dda0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
ddb0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  o(db, sizeof(Mem
ddc0: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
ddd0: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
dde0: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
ddf0: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
de00: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
de10: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
de20: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
de30: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
de40: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
de50: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
de60: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
de70: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
de80: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
de90: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
dea0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
deb0: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
dec0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
ded0: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
dee0: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
def0: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
df00: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
df10: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
df20: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
df30: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
df40: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
df50: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
df60: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
df70: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
df80: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
df90: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
dfa0: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
dfb0: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
dfc0: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
dfd0: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
dfe0: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
dff0: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
e000: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
e010: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
e040: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
e050: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
e080: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
e090: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
e0a0: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
e0d0: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
e0e0: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
e0f0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
e100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
e110: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
e120: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
e130: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
e140: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
e150: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
e160: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
e170: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
e180: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
e190: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
e1a0: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
e1b0: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
e1c0: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
e1d0: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
e1e0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
e1f0: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
e200: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
e210: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
e220: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
e230: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
e240: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
e250: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
e260: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
e270: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
e280: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
e290: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
e2a0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
e2b0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
e2c0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
e2d0: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
e2e0: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
e2f0: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
e300: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
e310: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e320: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
e330: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
e340: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
e350: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
e360: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e370: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
e380: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
e390: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
e3a0: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
e3b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
e3c0: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
e3d0: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
e3e0: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
e3f0: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
e400: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
e410: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
e420: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
e430: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
e440: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
e450: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
e460: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
e470: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
e480: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
e490: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
e4a0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  action */.  int 
e4b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e4c0: 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
e4d0: 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
e4e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
e4f0: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
e500: 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
e510: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
e520: 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
e530: 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
e540: 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
e550: 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
e560: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
e570: 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
e580: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
e590: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
e5a0: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
e5b0: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
e5c0: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
e5d0: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
e5e0: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
e5f0: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
e600: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
e610: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
e620: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
e630: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e640: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
e650: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
e660: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
e670: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
e680: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
e690: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
e6a0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
e6b0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
e6c0: 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54  (db, p);..  /* T
e6d0: 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
e6e0: 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
e6f0: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
e700: 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
e710: 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
e720: 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
e730: 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
e740: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
e750: 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
e760: 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
e770: 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
e780: 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
e790: 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
e7a0: 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
e7b0: 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
e7c0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
e7d0: 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
e7e0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e7f0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
e800: 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
e810: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
e820: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
e830: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
e840: 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
e850: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
e860: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
e870: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
e880: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
e890: 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
e8a0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d  1;.      if( i!=
e8b0: 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20  1 ) nTrans++;.  
e8c0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e8d0: 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Enter(pBt);.    
e8e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
e8f0: 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
e900: 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
e910: 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20  er(pBt));.      
e920: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
e930: 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
e940: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
e950: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
e960: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
e970: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
e980: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
e990: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
e9a0: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
e9b0: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
e9c0: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
e9d0: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
e9e0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d   ){.    rc = db-
e9f0: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
ea00: 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
ea10: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
ea20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ea30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
ea40: 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d  OMMITHOOK;.    }
ea50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
ea60: 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
ea70: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
ea80: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
ea90: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
eaa0: 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
eab0: 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
eac0: 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
ead0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
eae0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
eaf0: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
eb00: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
eb10: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
eb20: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
eb30: 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
eb40: 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
eb50: 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
eb60: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
eb70: 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61  is :memory: or a
eb80: 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20   temp file.  In 
eb90: 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20  .  ** that case 
eba0: 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
ebb0: 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
ebc0: 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
ebd0: 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69  use the .  ** si
ebe0: 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74  mple case then t
ebf0: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
ec00: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
ec10: 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  0(sqlite3BtreeGe
ec20: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
ec30: 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c  b[0].pBt)).   ||
ec40: 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a   nTrans<=1.  ){.
ec50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
ec60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
ec70: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
ec80: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
ec90: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
eca0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
ecb0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
ecc0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
ecd0: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
ece0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ecf0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
ed00: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
ed10: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
ed20: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
ed30: 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
ed40: 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
ed50: 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
ed60: 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
ed70: 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
ed80: 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
ed90: 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
eda0: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
edb0: 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
edc0: 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
edd0: 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
ede0: 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
edf0: 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
ee00: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
ee10: 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
ee20: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
ee30: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
ee40: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
ee50: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
ee60: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
ee70: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
ee80: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
ee90: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
eea0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
eeb0: 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20  seTwo(pBt, 0);. 
eec0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
eed0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
eee0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
eef0: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
ef00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
ef10: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63  /* The complex c
ef20: 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61  ase - There is a
ef30: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74   multi-file writ
ef40: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
ef50: 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tive..  ** This 
ef60: 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65  requires a maste
ef70: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
ef80: 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61  o ensure the tra
ef90: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
efa0: 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69   committed atomi
efb0: 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  cally..  */.#ifn
efc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
efd0: 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20  DISKIO.  else{. 
efe0: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
eff0: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
f000: 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
f010: 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  c = 0;.    char 
f020: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
f030: 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72  /* File-name for
f040: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f050: 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  nal */.    char 
f060: 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65  const *zMainFile
f070: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
f080: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
f090: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
f0a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
f0b0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
f0c0: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
f0d0: 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
f0e0: 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d  int retryCount =
f0f0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69   0;.    int nMai
f100: 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  nFile;..    /* S
f110: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
f120: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
f130: 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c   */.    nMainFil
f140: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
f150: 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  n30(zMainFile);.
f160: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71      zMaster = sq
f170: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
f180: 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58   "%s-mjXXXXXX9XX
f190: 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  z", zMainFile);.
f1a0: 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d      if( zMaster=
f1b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
f1c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f  TE_NOMEM;.    do
f1d0: 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
f1e0: 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  ndom;.      if( 
f1f0: 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20  retryCount ){.  
f200: 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
f210: 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20  ount>100 ){.    
f220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
f230: 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
f240: 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20  MJ delete: %s", 
f250: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
f260: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
f270: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f280: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
f290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
f2a0: 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43  }else if( retryC
f2b0: 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ount==1 ){.     
f2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
f2d0: 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
f2e0: 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20  J collide: %s", 
f2f0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
f300: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f310: 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a    retryCount++;.
f320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
f330: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
f340: 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64  iRandom), &iRand
f350: 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  om);.      sqlit
f360: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20  e3_snprintf(13, 
f370: 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69  &zMaster[nMainFi
f380: 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30  le], "-mj%06X9%0
f390: 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2X",.           
f3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3b0: 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29      (iRandom>>8)
f3c0: 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64  &0xffffff, iRand
f3d0: 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20  om&0xff);.      
f3e0: 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c  /* The antipenul
f3f0: 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72  timate character
f400: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
f410: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
f420: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22  .      ** be "9"
f430: 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63   to avoid name c
f440: 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75  ollisions when u
f450: 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d  sing 8+3 filenam
f460: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  es. */.      ass
f470: 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c  ert( zMaster[sql
f480: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
f490: 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b  ster)-3]=='9' );
f4a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69  .      sqlite3Fi
f4b0: 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46  leSuffix3(zMainF
f4c0: 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ile, zMaster);. 
f4d0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f4e0: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
f4f0: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
f500: 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
f510: 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
f520: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f530: 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
f540: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f550: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
f560: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f570: 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
f580: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
f590: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
f5a0: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
f5b0: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
f5c0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
f5d0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
f5e0: 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
f5f0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
f600: 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
f610: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
f620: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
f630: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
f640: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f650: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f660: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
f670: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f680: 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
f690: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
f6a0: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
f6b0: 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
f6c0: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
f6d0: 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
f6e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
f6f0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
f700: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
f710: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
f720: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
f730: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
f740: 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
f750: 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
f760: 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
f770: 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
f780: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f790: 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
f7a0: 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
f7b0: 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
f7c0: 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
f7d0: 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
f7e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f7f0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
f800: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
f810: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f820: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
f830: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
f840: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
f850: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
f860: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
f870: 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
f880: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
f890: 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  f( zFile==0 ){. 
f8a0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
f8b0: 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45  e;  /* Ignore TE
f8c0: 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20  MP and :memory: 
f8d0: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
f8e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
f8f0: 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21  ssert( zFile[0]!
f900: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
f910: 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21  ( !needSync && !
f920: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
f930: 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b  Disabled(pBt) ){
f940: 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
f950: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
f960: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
f970: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
f980: 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  Master, zFile, s
f990: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f9a0: 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
f9b0: 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
f9c0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
f9d0: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20  n30(zFile)+1;.  
f9e0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
f9f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fa00: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
fa10: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
fa20: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
fa30: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
fa40: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
fa50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fa60: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
fa70: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
fa80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
fa90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
faa0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
fab0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
fac0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
fad0: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
fae0: 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
faf0: 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
fb00: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
fb10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
fb20: 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26  eedSync .     &&
fb30: 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65   0==(sqlite3OsDe
fb40: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
fb50: 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c  ics(pMaster)&SQL
fb60: 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
fb70: 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51  TIAL).     && SQ
fb80: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
fb90: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
fba0: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e  ster, SQLITE_SYN
fbb0: 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29  C_NORMAL)).    )
fbc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
fbd0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
fbe0: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
fbf0: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
fc00: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
fc10: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
fc20: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
fc30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
fc40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
fc50: 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66  ync all the db f
fc60: 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  iles involved in
fc70: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fc80: 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a  . The same call.
fc90: 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
fca0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
fcb0: 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69  ointer in each i
fcc0: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
fcd0: 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20  l. If.    ** an 
fce0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72  error occurs her
fcf0: 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  e, do not delete
fd00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
fd10: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
fd20: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65  .    ** If the e
fd30: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
fd40: 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ng the first cal
fd50: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
fd60: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
fd70: 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74  aseOne(), then t
fd80: 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65  here is a chance
fd90: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
fda0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
fdb0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70  file will be orp
fdc0: 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61  haned. But we ca
fdd0: 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a  nnot delete it,.
fde0: 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74      ** in case t
fdf0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
fe00: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20  l file name was 
fe10: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
fe20: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
fe30: 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
fe40: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
fe50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
fe60: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
fe70: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
fe80: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
fe90: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
fea0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
feb0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
fec0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
fed0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
fee0: 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65  eOne(pBt, zMaste
fef0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
ff00: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
ff10: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
ff20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
ff30: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
ff40: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
ff50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ff60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ff70: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
ff80: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ff90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
ffa0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
ffb0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
ffc0: 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61   commits the tra
ffd0: 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a  nsaction. After.
ffe0: 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69      ** doing thi
fff0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
10000 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20  is synced again 
10010 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76  before any indiv
10020 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61  idual.    ** tra
10030 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61  nsaction files a
10040 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  re deleted..    
10050 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
10060 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
10070 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20  , zMaster, 1);. 
10080 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10090 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
100a0 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
100b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
100c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
100d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
100e0 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
100f0 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
10100 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
10110 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
10120 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
10130 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
10140 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
10150 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20  re only closing 
10160 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a  files and.    **
10170 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
10180 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73  ncating journals
10190 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  . If something g
101a0 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a  oes wrong while.
101b0 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
101c0 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
101d0 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54  t really care. T
101e0 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
101f0 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
10200 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
10210 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75  y guaranteed, bu
10220 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f  t some stray 'co
10230 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20  ld' journals.   
10240 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67   ** may be lying
10250 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
10260 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
10270 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74   won't help matt
10280 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
10290 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
102a0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
102b0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
102c0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
102d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
102e0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
102f0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
10300 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
10310 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
10320 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10330 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
10340 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20  eTwo(pBt, 1);.  
10350 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10360 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
10370 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e  Malloc();.    en
10380 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
10390 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
103a0 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
103b0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
103c0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
103d0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
103e0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
103f0 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
10400 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e  nVdbeActive coun
10410 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
10420 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
10430 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
10440 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
10450 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
10460 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
10470 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
10480 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
10490 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
104a0 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73  atch..** This is
104b0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c   an internal sel
104c0 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69  f-check only - i
104d0 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65  t is not an esse
104e0 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ntial processing
104f0 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  .** step..**.** 
10500 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
10510 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  if NDEBUG is def
10520 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
10530 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76   NDEBUG.static v
10540 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56  oid checkActiveV
10550 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a  dbeCnt(sqlite3 *
10560 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
10570 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
10580 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b   int nWrite = 0;
10590 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30  .  int nRead = 0
105a0 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
105b0 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
105c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
105d0 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69  _stmt_busy((sqli
105e0 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a  te3_stmt*)p) ){.
105f0 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
10600 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e     if( p->readOn
10610 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b  ly==0 ) nWrite++
10620 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62  ;.      if( p->b
10630 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64  IsReader ) nRead
10640 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ++;.    }.    p 
10650 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
10660 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64    assert( cnt==d
10670 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
10680 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69  ;.  assert( nWri
10690 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  te==db->nVdbeWri
106a0 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
106b0 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65  nRead==db->nVdbe
106c0 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Read );.}.#else.
106d0 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74  #define checkAct
106e0 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65  iveVdbeCnt(x).#e
106f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
10700 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
10710 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
10720 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74  ment opened a st
10730 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
10740 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74  ion,.** close it
10750 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65   now. Argument e
10760 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  Op must be eithe
10770 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
10780 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50  BACK or.** SAVEP
10790 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66  OINT_RELEASE. If
107a0 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
107b0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
107c0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
107d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
107e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20  rolled back. If 
107f0 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54  eOp is SAVEPOINT
10800 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74  _RELEASE, then t
10810 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  he .** statement
10820 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10830 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
10840 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
10850 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54  occurs, an SQLIT
10860 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
10870 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
10880 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
10890 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
108a0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
108b0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64  loseStatement(Vd
108c0 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b  be *p, int eOp){
108d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73  .  sqlite3 *cons
108e0 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  t db = p->db;.  
108f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10900 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e  OK;..  /* If p->
10910 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72  iStatement is gr
10920 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
10930 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20   then this Vdbe 
10940 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73  opened a .  ** s
10950 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
10960 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64  tion that should
10970 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e   be closed here.
10980 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74   The only except
10990 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74  ion.  ** is that
109a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79   an IO error may
109b0 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20   have occurred, 
109c0 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67  causing an emerg
109d0 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20  ency rollback.. 
109e0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
109f0 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74   (db->nStatement
10a00 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20  ==0), and there 
10a10 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  is nothing to do
10a20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
10a30 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  >nStatement && p
10a40 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->iStatement ){.
10a50 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
10a60 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f  onst int iSavepo
10a70 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d  int = p->iStatem
10a80 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65  ent-1;..    asse
10a90 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
10aa0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
10ab0 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
10ac0 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65  LEASE);.    asse
10ad0 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
10ae0 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  nt>0 );.    asse
10af0 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  rt( p->iStatemen
10b00 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  t==(db->nStateme
10b10 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  nt+db->nSavepoin
10b20 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  t) );..    for(i
10b30 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
10b40 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
10b50 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
10b60 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
10b70 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
10b80 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
10b90 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
10ba0 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
10bb0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
10bc0 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
10bd0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
10be0 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
10bf0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
10c00 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
10c10 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
10c20 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2==SQLITE_OK ){.
10c30 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
10c40 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
10c50 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
10c60 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
10c70 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
10c80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
10c90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
10cb0 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc2;.        }.
10cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10cd0 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
10ce0 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74  --;.    p->iStat
10cf0 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ement = 0;..    
10d00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10d10 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  K ){.      if( e
10d20 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
10d30 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
10d40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
10d50 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
10d60 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10d70 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
10d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10d90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10da0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10db0 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
10dc0 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
10dd0 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
10de0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
10df0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
10e00 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
10e10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10e20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
10e30 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20  k, also restore 
10e40 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
10e50 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66  base handles def
10e60 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
10e70 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20   counter to the 
10e80 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65  value it had whe
10e90 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  n .    ** the st
10ea0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10eb0 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
10ec0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d   */.    if( eOp=
10ed0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
10ee0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ACK ){.      db-
10ef0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
10f00 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
10f10 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66  ;.      db->nDef
10f20 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70  erredImmCons = p
10f30 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e  ->nStmtDefImmCon
10f40 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  s;.    }.  }.  r
10f50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10f60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10f70 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
10f80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  a transaction op
10f90 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61  ened by the data
10fa0 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20  base .** handle 
10fb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10fc0 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
10fd0 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20   an argument is 
10fe0 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20  about to be .** 
10ff0 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68  committed. If th
11000 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
11010 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72  ing deferred for
11020 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
11030 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e  int.** violation
11040 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
11050 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73  _ERROR. Otherwis
11060 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
11070 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
11080 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20   outstanding FK 
11090 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74  violations and t
110a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
110b0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
110c0 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72  ERROR, set the r
110d0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20  esult of the VM 
110e0 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  to SQLITE_CONSTR
110f0 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a  AINT_FOREIGNKEY.
11100 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20  ** and write an 
11110 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
11120 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e   it. Then return
11130 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
11140 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11150 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
11160 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  Y.int sqlite3Vdb
11170 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70  eCheckFk(Vdbe *p
11180 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b  , int deferred){
11190 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
111a0 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64   p->db;.  if( (d
111b0 65 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e  eferred && (db->
111c0 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62  nDeferredCons+db
111d0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
111e0 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21  ns)>0) .   || (!
111f0 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e  deferred && p->n
11200 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20  FkConstraint>0) 
11210 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  .  ){.    p->rc 
11220 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
11230 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a  INT_FOREIGNKEY;.
11240 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69      p->errorActi
11250 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
11260 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
11270 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
11280 20 64 62 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45   db, "FOREIGN KE
11290 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
112a0 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
112b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
112c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
112d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
112e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
112f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
11300 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74  he when a VDBE t
11310 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49  ries to halt.  I
11320 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61  f the VDBE.** ha
11330 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61  s made changes a
11340 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  nd is in autocom
11350 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63  mit mode, then c
11360 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63  ommit those.** c
11370 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f  hanges.  If a ro
11380 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64  llback is needed
11390 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f  , then do the ro
113a0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
113b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
113c0 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
113d0 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
113e0 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c  a VM from.** SQL
113f0 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f  ITE_MAGIC_RUN to
11400 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
11410 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c  LT.  It is harml
11420 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74  ess to.** call t
11430 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74  his on a VM that
11440 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54   is in the SQLIT
11450 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61  E_MAGIC_HALT sta
11460 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
11470 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
11480 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63   If the commit c
11490 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  ould not complet
114a0 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20  e because of.** 
114b0 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c  lock contention,
114c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
114d0 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  USY.  If SQLITE_
114e0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
114f0 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
11500 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20  e close did not 
11510 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73  happen and needs
11520 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e   to be repeated.
11530 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11540 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29  dbeHalt(Vdbe *p)
11550 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73      /* Used to s
11580 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72  tore transient r
11590 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20  eturn codes */. 
115a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
115b0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  ->db;..  /* This
115c0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
115d0 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
115e0 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
115f0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
11600 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
11610 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
11620 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
11630 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
11640 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
11650 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
11660 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
11670 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66  *.  ** If any of
11680 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
11690 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a  rrors occur:.  *
116a0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  *.  **     SQLIT
116b0 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20  E_NOMEM.  **    
116c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20   SQLITE_IOERR.  
116d0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55  **     SQLITE_FU
116e0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  LL.  **     SQLI
116f0 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a  TE_INTERRUPT.  *
11700 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
11710 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d  internal cache m
11720 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c  ight have been l
11730 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
11740 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74  istent.  ** stat
11750 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  e.  We need to r
11760 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74  ollback the stat
11770 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
11780 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  n, if there is. 
11790 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20   ** one, or the 
117a0 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63  complete transac
117b0 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73  tion if there is
117c0 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
117d0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
117e0 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
117f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
11800 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
11810 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
11820 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29  ( p->aOnceFlag )
11830 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65   memset(p->aOnce
11840 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63  Flag, 0, p->nOnc
11850 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41  eFlag);.  closeA
11860 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
11870 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
11880 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
11890 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
118a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63  E_OK;.  }.  chec
118b0 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
118c0 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
118d0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
118e0 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
118f0 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
11900 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20  ted or if the.  
11910 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
11920 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f   does not read o
11930 72 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61  r write a databa
11940 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69  se file.  */.  i
11950 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70  f( p->pc>=0 && p
11960 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20  ->bIsReader ){. 
11970 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
11980 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
11990 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
119a0 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  /.    int eState
119b0 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20  mentOp = 0;.    
119c0 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72  int isSpecialErr
119d0 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  or;            /
119e0 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
119f0 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72   a 'special' err
11a00 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f  or */..    /* Lo
11a10 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73  ck all btrees us
11a20 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d  ed by the statem
11a30 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ent */.    sqlit
11a40 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a  e3VdbeEnter(p);.
11a50 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
11a60 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
11a70 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
11a80 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
11a90 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
11aa0 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
11ab0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
11ac0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
11ad0 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
11ae0 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
11af0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
11b00 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
11b10 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
11b20 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
11b30 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
11b40 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
11b50 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f  nly and the erro
11b60 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
11b70 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20  _INTERRUPT, .   
11b80 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63     ** no rollbac
11b90 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
11ba0 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65  Otherwise, at le
11bb0 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ast a savepoint 
11bc0 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
11bd0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
11be0 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
11bf0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
11c00 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a  e to a .      **
11c10 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
11c20 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
11c30 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
11c40 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
11c50 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69  ad-only, it is i
11c60 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66  mportant to perf
11c70 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  orm.      ** a s
11c80 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
11c90 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
11ca0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74   operation. If t
11cb0 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20  he error .      
11cc0 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  ** occurred whil
11cd0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
11ce0 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f   journal, sub-jo
11cf0 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73  urnal or databas
11d00 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  e.      ** file 
11d10 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66  as part of an ef
11d20 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20  fort to free up 
11d30 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65  cache space (see
11d40 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
11d50 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29  ** pagerStress()
11d60 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68   in pager.c), th
11d70 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65  e rollback is re
11d80 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72  quired to restor
11d90 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e .      ** the 
11da0 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69  pager to a consi
11db0 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
11dc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
11dd0 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
11de0 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
11df0 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
11e00 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
11e10 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
11e20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
11e30 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
11e40 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
11e50 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
11e60 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
11e70 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
11e80 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
11e90 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
11ea0 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
11eb0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
11ec0 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
11ed0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
11ee0 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
11ef0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
11f00 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
11f10 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
11f20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
11f30 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
11f40 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
11f50 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
11f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
11f70 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
11f80 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
11f90 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
11fa0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
11fb0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
11fc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11fd0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
11fe0 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64   Check for immed
11ff0 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
12000 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a   violations. */.
12010 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
12020 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12030 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65    sqlite3VdbeChe
12040 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20  ckFk(p, 0);.    
12050 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
12060 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
12070 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
12080 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
12090 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20  active writer . 
120a0 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77     ** VM, then w
120b0 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
120c0 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
120d0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
120e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
120f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
12100 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
12110 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
12120 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
12130 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
12140 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
12150 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  curred. .    */.
12160 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
12170 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a  VtabInSync(db) .
12180 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f       && db->auto
12190 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20  Commit .     && 
121a0 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d  db->nVdbeWrite==
121b0 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29  (p->readOnly==0)
121c0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69   .    ){.      i
121d0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
121e0 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
121f0 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
12200 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
12210 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  or) ){.        r
12220 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
12230 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20  heckFk(p, 1);.  
12240 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12260 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70       if( NEVER(p
12270 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
12280 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12290 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
122a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
122b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
122c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
122d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
122e0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
122f0 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20  REIGNKEY;.      
12300 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20    }else{ .      
12310 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d      /* The auto-
12320 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  commit flag is t
12330 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72  rue, the vdbe pr
12340 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73  ogram was succes
12350 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20  sful .          
12360 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52  ** or hit an 'OR
12370 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
12380 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  t and there are 
12390 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  no deferred fore
123a0 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ign.          **
123b0 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
123c0 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20   to hold up the 
123d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
123e0 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74  s means a commit
123f0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
12400 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  s required. */. 
12410 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64           rc = vd
12420 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b  beCommit(db, p);
12430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12440 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12450 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61  E_BUSY && p->rea
12460 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
12470 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
12480 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
12490 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
124a0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
124b0 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
124c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
124d0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
124e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
124f0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
12500 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
12510 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
12520 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
12530 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
12540 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
12550 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
12560 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
12570 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
12580 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
12590 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b   ~SQLITE_DeferFK
125a0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  s;.          sql
125b0 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
125c0 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
125d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
125e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
125f0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
12600 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
12610 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
12620 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
12630 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74  .      db->nStat
12640 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ement = 0;.    }
12650 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d  else if( eStatem
12660 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  entOp==0 ){.    
12670 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
12680 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
12690 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
126a0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  l ){.        eSt
126b0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
126c0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20  POINT_RELEASE;. 
126d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
126e0 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
126f0 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
12700 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
12710 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
12720 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BACK;.      }els
12730 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
12740 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
12750 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
12760 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
12770 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
12780 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
12790 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
127a0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
127b0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
127c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
127d0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
127e0 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
127f0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
12800 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
12810 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
12820 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
12830 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
12840 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
12850 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
12860 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
12870 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
12880 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
12890 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
128a0 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
128b0 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
128c0 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
128d0 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
128e0 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
128f0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
12900 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
12910 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
12920 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74  */.    if( eStat
12930 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20  ementOp ){.     
12940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
12950 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
12960 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29  p, eStatementOp)
12970 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
12980 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
12990 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
129a0 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d  | (p->rc&0xff)==
129b0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
129c0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  T ){.          p
129d0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
129e0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
129f0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
12a00 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  g);.          p-
12a10 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
12a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12a30 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
12a40 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
12a50 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
12a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
12a70 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
12a80 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
12a90 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
12aa0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
12ab0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
12ac0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
12ad0 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e  f this was an IN
12ae0 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
12af0 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74  DELETE and no st
12b00 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
12b10 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62  ion.    ** has b
12b20 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  een rolled back,
12b30 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61   update the data
12b40 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12b50 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
12b60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12b70 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29  p->changeCntOn )
12b80 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61  {.      if( eSta
12b90 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f  tementOp!=SAVEPO
12ba0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
12bb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12bc0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
12bd0 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
12be0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12bf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
12c00 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
12c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12c20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
12c30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
12c40 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20  lease the locks 
12c50 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
12c60 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  beLeave(p);.  }.
12c70 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
12c80 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
12c90 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
12ca0 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
12cb0 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
12cc0 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
12cd0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
12ce0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  --;.    if( !p->
12cf0 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e  readOnly ) db->n
12d00 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20  VdbeWrite--;.   
12d10 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
12d20 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  r ) db->nVdbeRea
12d30 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d--;.    assert(
12d40 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
12d50 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  >=db->nVdbeRead 
12d60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
12d70 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62  b->nVdbeRead>=db
12d80 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
12d90 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12da0 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b  nVdbeWrite>=0 );
12db0 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
12dc0 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
12dd0 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
12de0 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
12df0 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
12e00 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
12e10 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
12e20 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
12e30 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
12e40 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
12e50 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
12e60 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
12e70 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
12e80 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
12e90 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
12ea0 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
12eb0 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
12ec0 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
12ed0 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
12ee0 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
12ef0 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
12f00 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
12f10 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
12f20 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
12f30 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
12f40 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
12f50 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d  eActive>0 || db-
12f60 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c  >autoCommit==0 |
12f70 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  | db->nStatement
12f80 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
12f90 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42  (p->rc==SQLITE_B
12fa0 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  USY ? SQLITE_BUS
12fb0 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  Y : SQLITE_OK);.
12fc0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56  }.../*.** Each V
12fd0 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65  DBE holds the re
12fe0 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  sult of the most
12ff0 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
13000 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69  step() call.** i
13010 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72  n p->rc.  This r
13020 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74  outine sets that
13030 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20   result back to 
13040 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f  SQLITE_OK..*/.vo
13050 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
13060 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64  setStepResult(Vd
13070 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20  be *p){.  p->rc 
13080 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  = SQLITE_OK;.}..
13090 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65  /*.** Copy the e
130a0 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72  rror code and er
130b0 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f  ror message belo
130c0 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42  nging to the VDB
130d0 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  E passed.** as t
130e0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
130f0 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73  t to its databas
13100 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61  e handle (so tha
13110 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a  t they will be .
13120 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63  ** returned by c
13130 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f  alls to sqlite3_
13140 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71  errcode() and sq
13150 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e  lite3_errmsg()).
13160 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
13170 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c  tion does not cl
13180 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72  ear the VDBE err
13190 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61  or code or messa
131a0 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69  ge, just.** copi
131b0 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64  es them to the d
131c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
131d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
131e0 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
131f0 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
13200 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
13210 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
13220 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72  c;.  if( p->zErr
13230 4d 73 67 20 29 7b 0a 20 20 20 20 75 38 20 6d 61  Msg ){.    u8 ma
13240 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64 62 2d  llocFailed = db-
13250 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
13260 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
13270 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
13280 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d     if( db->pErr=
13290 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20  =0 ) db->pErr = 
132a0 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
132b0 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
132c0 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
132d0 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72  pErr, -1, p->zEr
132e0 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  rMsg, SQLITE_UTF
132f0 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  8, SQLITE_TRANSI
13300 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
13310 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
13320 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  ();.    db->mall
13330 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
13340 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d  cFailed;.    db-
13350 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
13360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
13370 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
13380 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
13390 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
133a0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
133b0 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51  G./*.** If an SQ
133c0 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
133d0 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73  OG hook is regis
133e0 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d  tered and the VM
133f0 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a   has been run, .
13400 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f  ** invoke it..*/
13410 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
13420 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64  eInvokeSqllog(Vd
13430 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71  be *v){.  if( sq
13440 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
13450 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e  g.xSqllog && v->
13460 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13470 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70   v->zSql && v->p
13480 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  c>=0 ){.    char
13490 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71   *zExpanded = sq
134a0 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53  lite3VdbeExpandS
134b0 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a  ql(v, v->zSql);.
134c0 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64      assert( v->d
134d0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
134e0 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61  );.    if( zExpa
134f0 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  nded ){.      sq
13500 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
13510 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20  g.xSqllog(.     
13520 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
13530 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
13540 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70  Arg, v->db, zExp
13550 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29  anded, 1.      )
13560 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
13570 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78  bFree(v->db, zEx
13580 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  panded);.    }. 
13590 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
135a0 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  ine vdbeInvokeSq
135b0 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a  llog(x).#endif..
135c0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
135d0 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
135e0 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
135f0 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
13600 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
13610 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
13620 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
13630 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
13640 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
13650 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
13660 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
13670 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
13680 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
13690 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
136a0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
136b0 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
136c0 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
136d0 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
136e0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
136f0 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
13700 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
13710 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
13720 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
13730 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
13740 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
13750 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
13760 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
13770 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
13780 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
13790 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
137a0 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
137b0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
137c0 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
137d0 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
137e0 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
137f0 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
13800 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
13810 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
13820 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20  eHalt(p);..  /* 
13830 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
13840 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
13850 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
13860 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
13870 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
13880 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
13890 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
138a0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
138b0 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
138c0 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
138d0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
138e0 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
138f0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
13900 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
13910 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
13920 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
13930 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
13940 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
13950 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
13960 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
13970 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c     vdbeInvokeSql
13980 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  log(p);.    sqli
13990 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
139a0 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c  rror(p);.    sql
139b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
139c0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
139d0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
139e0 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
139f0 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
13a00 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
13a10 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
13a20 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
13a30 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
13a40 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
13a50 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
13a60 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
13a70 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
13a80 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
13a90 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
13aa0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
13ab0 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
13ac0 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
13ad0 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
13ae0 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
13af0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
13b00 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
13b10 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72  , p->rc, p->zErr
13b20 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
13b30 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
13b40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13b50 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
13b60 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
13b70 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
13b80 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
13b90 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
13ba0 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
13bb0 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  (p);..  /* Save 
13bc0 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
13bd0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
13be0 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
13bf0 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
13c00 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
13c10 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
13c20 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
13c30 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
13c40 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
13c50 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
13c60 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
13c70 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
13c80 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
13c90 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
13ca0 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
13cb0 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
13cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
13cd0 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
13ce0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53  .      if( p->zS
13cf0 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ql ){.        ch
13d00 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20  ar c, pc = 0;.  
13d10 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
13d20 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
13d30 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d     for(i=0; (c =
13d40 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b   p->zSql[i])!=0;
13d50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
13d60 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20   if( pc=='\n' ) 
13d70 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
13d80 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   ");.          p
13d90 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
13da0 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20         pc = c;. 
13db0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13dc0 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20   if( pc!='\n' ) 
13dd0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
13de0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
13df0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
13e00 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
13e10 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30     char zHdr[100
13e20 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
13e30 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
13e40 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20  of(zHdr), zHdr, 
13e50 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c  "%6u %12llu %8ll
13e60 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  u ",.           
13e70 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
13e80 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
13e90 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
13ea0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
13eb0 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
13ec0 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
13ed0 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
13ee0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66      );.        f
13ef0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
13f00 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20  , zHdr);.       
13f10 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
13f20 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
13f30 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
13f40 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
13f50 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
13f60 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65  ndif.  p->iCurre
13f70 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d  ntTime = 0;.  p-
13f80 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
13f90 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
13fa0 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65  rn p->rc & db->e
13fb0 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a  rrMask;.}. ./*.*
13fc0 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64  * Clean up and d
13fd0 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74  elete a VDBE aft
13fe0 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52  er execution.  R
13ff0 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
14000 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65   which is.** the
14010 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57   result code.  W
14020 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
14030 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f  essage text into
14040 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69   *pzErrMsg..*/.i
14050 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  nt sqlite3VdbeFi
14060 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b  nalize(Vdbe *p){
14070 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14080 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
14090 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
140a0 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69  C_RUN || p->magi
140b0 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  c==VDBE_MAGIC_HA
140c0 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LT ){.    rc = s
140d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
140e0 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
140f0 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72  (rc & p->db->err
14100 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d  Mask)==rc );.  }
14110 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
14120 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lete(p);.  retur
14130 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
14140 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20  f parameter iOp 
14150 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
14160 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  o, then invoke t
14170 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
14180 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61  r.** all auxilia
14190 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
141a0 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65   currently cache
141b0 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
141c0 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72  ed as.** the fir
141d0 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
141e0 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73  ** Or, if iOp is
141f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
14200 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
14210 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63  then the destruc
14220 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69  tor is.** only i
14230 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65  nvoked for those
14240 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
14250 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64  pointers created
14260 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a   by the user .**
14270 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
14280 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63  d by the OP_Func
14290 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69  tion opcode at i
142a0 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f  nstruction iOp o
142b0 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20  f .** VM pVdbe, 
142c0 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66  and only then if
142d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  :.**.**    * the
142e0 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63   associated func
142f0 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69  tion parameter i
14300 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61  s the 32nd or la
14310 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a  ter (counting.**
14320 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20        from left 
14330 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a  to right), or.**
14340 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72  .**    * the cor
14350 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
14360 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20  n argument mask 
14370 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20  is clear (where 
14380 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20  the first.**    
14390 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d    function param
143a0 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  eter corresponds
143b0 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e   to bit 0 etc.).
143c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
143d0 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
143e0 61 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 69  a(Vdbe *pVdbe, i
143f0 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b  nt iOp, int mask
14400 29 7b 0a 20 20 41 75 78 44 61 74 61 20 2a 2a 70  ){.  AuxData **p
14410 70 20 3d 20 26 70 56 64 62 65 2d 3e 70 41 75 78  p = &pVdbe->pAux
14420 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a  Data;.  while( *
14430 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74  pp ){.    AuxDat
14440 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20  a *pAux = *pp;. 
14450 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20     if( (iOp<0). 
14460 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f      || (pAux->iO
14470 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d  p==iOp && (pAux-
14480 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61  >iArg>31 || !(ma
14490 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70  sk & MASKBIT32(p
144a0 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20  Aux->iArg)))).  
144b0 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
144c0 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d  ase( pAux->iArg=
144d0 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =31 );.      if(
144e0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
144f0 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
14500 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
14510 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
14520 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70     *pp = pAux->p
14530 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
14540 74 65 33 44 62 46 72 65 65 28 70 56 64 62 65 2d  te3DbFree(pVdbe-
14550 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20  >db, pAux);.    
14560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d  }else{.      pp=
14570 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20   &pAux->pNext;. 
14580 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
14590 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
145a0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
145b0 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  h the Vdbe passe
145c0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
145d0 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63  argument,.** exc
145e0 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69  ept for object i
145f0 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20  tself, which is 
14600 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
14610 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
14620 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
14630 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65  ction and sqlite
14640 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73  3VdbeDelete() is
14650 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c   that.** VdbeDel
14660 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e  ete() also unlin
14670 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ks the Vdbe from
14680 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73   the list of VMs
14690 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
146a0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
146b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20   connection and 
146c0 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74  frees the object
146d0 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64   itself..*/.void
146e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
146f0 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20  rObject(sqlite3 
14700 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
14710 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75   SubProgram *pSu
14720 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74  b, *pNext;.  int
14730 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   i;.  assert( p-
14740 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d  >db==0 || p->db=
14750 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  =db );.  release
14760 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
14770 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65  , p->nVar);.  re
14780 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
14790 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
147a0 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
147b0 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d  _N);.  for(pSub=
147c0 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75  p->pProgram; pSu
147d0 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a  b; pSub=pNext){.
147e0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62      pNext = pSub
147f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62  ->pNext;.    vdb
14800 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
14810 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62   pSub->aOp, pSub
14820 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  ->nOp);.    sqli
14830 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
14840 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ub);.  }.  for(i
14850 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d  =p->nzVar-1; i>=
14860 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44  0; i--) sqlite3D
14870 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56  bFree(db, p->azV
14880 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72  ar[i]);.  vdbeFr
14890 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d  eeOpArray(db, p-
148a0 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20  >aOp, p->nOp);. 
148b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
148c0 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
148d0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
148e0 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20  (db, p->zSql);. 
148f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14900 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69  b, p->pFree);.#i
14910 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14920 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
14930 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  US.  for(i=0; i<
14940 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a  p->nScan; i++){.
14950 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14960 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69  e(db, p->aScan[i
14970 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
14980 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14990 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65 6e  , p->aScan);.#en
149a0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  dif.}../*.** Del
149b0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
149c0 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
149d0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
149e0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
149f0 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45  3 *db;..  if( NE
14a00 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
14a10 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  rn;.  db = p->db
14a20 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
14a30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
14a40 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
14a50 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
14a60 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20  bject(db, p);.  
14a70 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
14a80 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
14a90 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
14aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
14ab0 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d  ert( db->pVdbe==
14ac0 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64  p );.    db->pVd
14ad0 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  be = p->pNext;. 
14ae0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78   }.  if( p->pNex
14af0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
14b00 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
14b10 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  rev;.  }.  p->ma
14b20 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
14b30 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d  _DEAD;.  p->db =
14b40 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
14b50 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
14b60 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
14b70 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e  "p" has a pendin
14b80 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  g seek operation
14b90 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65   that has not ye
14ba0 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65  t been.** carrie
14bb0 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65  d out.  Seek the
14bc0 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66   cursor now.  If
14bd0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
14be0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  , return.** the 
14bf0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
14c00 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
14c10 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
14c20 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65  NLINE handleDefe
14c30 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43  rredMoveto(VdbeC
14c40 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
14c50 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
14c60 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65   SQLITE_TEST.  e
14c70 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
14c80 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
14c90 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
14ca0 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
14cb0 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  to );.  assert( 
14cc0 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
14cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
14ce0 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
14cf0 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70  p->pCursor, 0, p
14d00 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20  ->movetoTarget, 
14d10 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20  0, &res);.  if( 
14d20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
14d30 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72    if( res!=0 ) r
14d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
14d50 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65  RUPT_BKPT;.#ifde
14d60 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
14d70 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
14d80 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
14d90 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
14da0 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  to = 0;.  p->cac
14db0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
14dc0 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e  _STALE;.  return
14dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14de0 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68  *.** Something h
14df0 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20  as moved cursor 
14e00 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65  "p" out of place
14e10 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77  .  Maybe the row
14e20 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74   it was.** point
14e30 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65  ed to was delete
14e40 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
14e50 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74   it.  Or maybe t
14e60 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20  he btree was.** 
14e70 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61  rebalanced.  Wha
14e80 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c  tever the cause,
14e90 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20   try to restore 
14ea0 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65  "p" to the place
14eb0 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73   it.** is suppos
14ec0 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e  ed to be pointin
14ed0 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77  g.  If the row w
14ee0 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  as deleted out f
14ef0 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a  rom under the.**
14f00 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65   cursor, set the
14f10 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
14f20 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a   to a NULL row..
14f30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
14f40 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61  LITE_NOINLINE ha
14f50 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
14f60 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
14f70 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e    int isDifferen
14f80 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65  tRow, rc;.  asse
14f90 72 74 28 20 70 2d 3e 70 43 75 72 73 6f 72 21 3d  rt( p->pCursor!=
14fa0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
14fb0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
14fc0 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75  rHasMoved(p->pCu
14fd0 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  rsor) );.  rc = 
14fe0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
14ff0 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 70 43 75  orRestore(p->pCu
15000 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65  rsor, &isDiffere
15010 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63  ntRow);.  p->cac
15020 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
15030 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73  _STALE;.  if( is
15040 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70  DifferentRow ) p
15050 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
15060 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15070 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e  *.** Check to en
15080 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
15090 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
150a0 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
150b0 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65  or.** if need be
150c0 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f  .  Return any I/
150d0 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65  O error from the
150e0 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69   restore operati
150f0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
15100 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
15110 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a  ore(VdbeCursor *
15120 70 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  p){.  if( sqlite
15130 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
15140 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29  oved(p->pCursor)
15150 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
15160 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
15170 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
15180 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15190 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
151a0 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20  the cursor p is 
151b0 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72  ready to read or
151c0 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74   write the row t
151d0 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61  o which it.** wa
151e0 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65  s last positione
151f0 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  d.  Return an er
15200 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f  ror code if an O
15210 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20  OM fault or I/O 
15220 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74  error.** prevent
15230 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69  s us from positi
15240 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  oning the cursor
15250 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
15260 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
15270 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
15280 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
15290 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
152a0 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
152b0 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
152c0 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73  .  If no move is
152d0 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20   pending, check 
152e0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f  to see if the ro
152f0 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65  w has been.** de
15300 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
15310 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  nder the cursor 
15320 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d  and if it has, m
15330 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a  ark the row as.*
15340 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a  * a NULL row..**
15350 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
15360 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
15370 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72  nting to the cor
15380 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61  rect row and tha
15390 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74  t row has.** not
153a0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
153b0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
153c0 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68   cursor, then th
153d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
153e0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
153f0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
15400 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
15410 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
15420 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
15430 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
15440 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
15450 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (p);.  }.  if( p
15460 2d 3e 70 43 75 72 73 6f 72 20 26 26 20 73 71 6c  ->pCursor && sql
15470 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
15480 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73  asMoved(p->pCurs
15490 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  or) ){.    retur
154a0 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
154b0 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  sor(p);.  }.  re
154c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
154d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
154e0 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
154f0 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
15500 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
15510 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
15520 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
15530 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15540 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
15550 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
15560 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
15570 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
15580 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
15590 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
155a0 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
155b0 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
155c0 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
155d0 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
155e0 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
155f0 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
15600 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
15610 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
15620 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
15630 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
15640 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
15650 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
15660 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
15670 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
15680 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
15690 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
156a0 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
156b0 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
156c0 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
156d0 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
156e0 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
156f0 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
15700 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
15710 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
15720 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
15730 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
15740 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
15750 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
15760 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
15770 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
15780 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
15790 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
157a0 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
157b0 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
157c0 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
157d0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
157e0 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
157f0 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
15800 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
15810 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
15820 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
15830 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
15840 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
15850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
15860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
15870 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15880 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
15890 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
158a0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
158b0 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
158c0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
158d0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
158e0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
158f0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
15900 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
15910 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
15920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15930 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
15940 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
15950 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
15960 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
15970 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
15980 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159a0 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
159b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
159c0 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
159e0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
159f0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
15a00 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
15a10 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
15a20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
15a30 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
15a50 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
15a60 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
15a70 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
15a80 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
15a90 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
15aa0 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
15ab0 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ad0 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
15ae0 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
15af0 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
15b00 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
15b10 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
15b20 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
15b30 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
15b40 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
15b50 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
15b60 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
15b70 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
15b80 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
15b90 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
15ba0 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
15bb0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
15bc0 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
15bd0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
15be0 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
15bf0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
15c00 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
15c10 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
15c20 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
15c30 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
15c40 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
15c50 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
15c60 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 69  s;.  u32 n;..  i
15c70 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
15c80 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
15c90 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
15ca0 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
15cb0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
15cc0 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
15cd0 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
15ce0 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
15cf0 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
15d00 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30  ((i64)0x00008000
15d10 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
15d20 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
15d30 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
15d40 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
15d50 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59   if( i<(-MAX_6BY
15d60 54 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b 0a  TE) ) return 6;.
15d70 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
15d80 73 20 74 65 73 74 20 70 72 65 76 65 6e 74 73 3a  s test prevents:
15d90 20 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37 32    u = -(-9223372
15da0 30 33 36 38 35 34 37 37 35 38 30 38 29 20 2a 2f  036854775808) */
15db0 0a 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20  .      u = -i;. 
15dc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15dd0 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u = i;.    }.   
15de0 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20   if( u<=127 ){. 
15df0 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 69 26       return ((i&
15e00 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f  1)==i && file_fo
15e10 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33  rmat>=4) ? 8+(u3
15e20 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20  2)u : 1;.    }. 
15e30 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
15e40 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
15e50 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
15e60 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
15e70 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
15e80 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
15e90 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
15ea0 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
15eb0 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
15ec0 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
15ed0 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
15ee0 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
15ef0 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61  rt( pMem->db->ma
15f00 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c  llocFailed || fl
15f10 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
15f20 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65  _Blob) );.  asse
15f30 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29  rt( pMem->n>=0 )
15f40 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65  ;.  n = (u32)pMe
15f50 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
15f60 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
15f70 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
15f80 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 72 65  .nZero;.  }.  re
15f90 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
15fa0 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
15fb0 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
15fc0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
15fd0 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
15fe0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
15ff0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
16000 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75  erial-type..*/.u
16010 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
16020 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
16030 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
16040 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
16050 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =12 ){.    retur
16060 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
16070 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
16080 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
16090 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30  u8 aSize[] = { 0
160a0 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c  , 1, 2, 3, 4, 6,
160b0 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20   8, 8, 0, 0, 0, 
160c0 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 };.    return 
160d0 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70  aSize[serial_typ
160e0 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e];.  }.}../*.**
160f0 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
16100 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
16110 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
16120 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
16130 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
16140 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
16150 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
16160 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
16170 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
16180 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
16190 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
161a0 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
161b0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
161c0 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
161d0 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
161e0 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
161f0 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
16200 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
16210 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
16220 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
16230 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
16240 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
16250 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
16260 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
16270 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
16280 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
16290 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
162a0 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
162b0 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
162c0 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
162d0 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
162e0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
162f0 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
16300 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
16310 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
16320 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
16330 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
16340 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
16350 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
16360 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
16370 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
16380 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
16390 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
163a0 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
163b0 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
163c0 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
163d0 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
163e0 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
163f0 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
16400 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
16410 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
16420 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
16430 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
16440 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
16450 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
16460 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
16470 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
16480 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
16490 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
164a0 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
164b0 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
164c0 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
164d0 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
164e0 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
164f0 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
16500 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
16510 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
16520 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
16530 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
16540 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
16550 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
16560 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
16570 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
16580 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
16590 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
165a0 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
165b0 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
165c0 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
165d0 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
165e0 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
165f0 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
16600 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
16610 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
16620 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
16630 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
16640 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
16650 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
16660 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
16670 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
16680 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
16690 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
166a0 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
166b0 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
166c0 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
166d0 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
166e0 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
166f0 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
16700 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
16710 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
16720 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
16730 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
16740 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
16750 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
16760 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
16770 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
16780 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
16790 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
167a0 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
167b0 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
167c0 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
167d0 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
167e0 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
167f0 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
16800 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
16810 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
16820 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
16830 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
16840 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
16850 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
16860 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
16870 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
16880 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
16890 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
168a0 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
168b0 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
168c0 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
168d0 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
168e0 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
168f0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
16900 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
16910 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
16920 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
16930 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
16940 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
16950 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
16960 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
16970 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
16980 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  .  The caller is
16990 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20   responsible.** 
169a0 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65  for allocating e
169b0 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62  nough space to b
169c0 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65  uf[] to hold the
169d0 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65   entire field, e
169e0 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74  xclusive.** of t
169f0 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  he pMem->u.nZero
16a00 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d   bytes for a MEM
16a10 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  _Zero value..**.
16a20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
16a30 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
16a40 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
16a50 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
16a60 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
16a70 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
16a80 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
16a90 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
16aa0 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
16ab0 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
16ac0 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
16ad0 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
16ae0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16af0 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65  lPut(u8 *buf, Me
16b00 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72  m *pMem, u32 ser
16b10 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32  ial_type){.  u32
16b20 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
16b30 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
16b40 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
16b50 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
16b60 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
16b70 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
16b80 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
16b90 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
16ba0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
16bb0 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  ==sizeof(pMem->u
16bc0 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  .r) );.      mem
16bd0 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75  cpy(&v, &pMem->u
16be0 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  .r, sizeof(v));.
16bf0 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
16c00 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
16c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16c20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
16c30 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
16c40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
16c50 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
16c60 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
16c70 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
16c80 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d   do{.      buf[-
16c90 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  -i] = (u8)(v&0xF
16ca0 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
16cb0 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  8;.    }while( i
16cc0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c   );.    return l
16cd0 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
16ce0 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
16cf0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
16d00 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
16d10 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
16d20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
16d30 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
16d40 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
16d50 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73         == (int)s
16d60 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16d70 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
16d80 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20  ype) );.    len 
16d90 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d  = pMem->n;.    m
16da0 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
16db0 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65  >z, len);.    re
16dc0 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
16dd0 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
16de0 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
16df0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
16e00 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61  * Input "x" is a
16e10 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73   sequence of uns
16e20 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73  igned characters
16e30 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20   that represent 
16e40 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20  a.** big-endian 
16e50 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e  integer.  Return
16e60 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
16e70 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a  native integer.*
16e80 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59  /.#define ONE_BY
16e90 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69  TE_INT(x)    ((i
16ea0 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e  8)(x)[0]).#defin
16eb0 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78  e TWO_BYTE_INT(x
16ec0 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28  )    (256*(i8)((
16ed0 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23  x)[0])|(x)[1]).#
16ee0 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54  define THREE_BYT
16ef0 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36  E_INT(x)  (65536
16f00 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
16f10 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d  x)[1]<<8)|(x)[2]
16f20 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
16f30 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28  YTE_UINT(x)  (((
16f40 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c  u32)(x)[0]<<24)|
16f50 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78  ((x)[1]<<16)|((x
16f60 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29  )[2]<<8)|(x)[3])
16f70 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59  .#define FOUR_BY
16f80 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37  TE_INT(x) (16777
16f90 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  216*(i8)((x)[0])
16fa0 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
16fb0 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
16fc0 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  )../*.** Deseria
16fd0 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
16fe0 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
16ff0 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
17000 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
17010 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
17020 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
17030 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
17040 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
17050 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
17060 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  nction is implem
17070 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70  ented as two sep
17080 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66  arate routines f
17090 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  or performance..
170a0 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73  ** The few cases
170b0 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f   that require lo
170c0 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72  cal variables ar
170d0 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
170e0 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20  o a separate.** 
170f0 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20  routine so that 
17100 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68  in most cases th
17110 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f  e overhead of mo
17120 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70  ving the stack p
17130 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f  ointer.** is avo
17140 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ided..*/ .static
17150 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   u32 SQLITE_NOIN
17160 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a  LINE serialGet(.
17170 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
17180 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
17190 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
171a0 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
171b0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
171c0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
171d0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
171e0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
171f0 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17210 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
17220 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
17230 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34  into */.){.  u64
17240 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
17250 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20  INT(buf);.  u32 
17260 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
17270 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d  NT(buf+4);.  x =
17280 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20   (x<<32) + y;.  
17290 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
172a0 3d 36 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e  =6 ){.    pMem->
172b0 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
172c0 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
172d0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
172e0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
172f0 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65  u.i<0 );.  }else
17300 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  {.#if !defined(N
17310 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
17320 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
17330 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
17340 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
17350 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
17360 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
17370 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
17380 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72  e.    ** byte or
17390 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
173a0 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
173b0 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
173c0 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  T is.    ** defi
173d0 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20  ned that 64-bit 
173e0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
173f0 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65  alues really are
17400 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e   mixed.    ** en
17410 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dian..    */.   
17420 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
17430 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
17440 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
17450 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
17460 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
17470 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
17480 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
17490 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20  dianFloat(t2);. 
174a0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
174b0 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32  f(r1)==sizeof(t2
174c0 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c  ) && memcmp(&r1,
174d0 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29   &t2, sizeof(r1)
174e0 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20  )==0 );.#endif. 
174f0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
17500 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
17510 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20  f(pMem->u.r)==8 
17520 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  );.    swapMixed
17530 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a  EndianFloat(x);.
17540 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
17550 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  ->u.r, &x, sizeo
17560 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  f(x));.    pMem-
17570 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
17580 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29  IsNaN(pMem->u.r)
17590 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
175a0 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65  M_Real;.  }.  re
175b0 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71  turn 8;.}.u32 sq
175c0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
175d0 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
175e0 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
175f0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
17600 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
17610 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
17620 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
17630 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
17640 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
17650 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
17660 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
17670 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
17680 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
17690 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
176a0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
176b0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
176c0 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
176d0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
176e0 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
176f0 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
17700 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
17710 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
17720 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   /* NULL */.    
17730 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
17740 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
17750 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17760 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
17770 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
17780 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
17790 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54  m->u.i = ONE_BYT
177a0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
177b0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
177c0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
177d0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
177e0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
177f0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
17800 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
17810 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
17820 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
17830 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59  em->u.i = TWO_BY
17840 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
17850 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
17860 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
17870 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
17880 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
17890 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
178a0 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
178b0 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
178c0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
178d0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45  Mem->u.i = THREE
178e0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
178f0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
17900 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
17910 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
17920 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
17930 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
17940 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
17950 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
17960 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
17970 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
17980 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  UR_BYTE_INT(buf)
17990 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
179a0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
179b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
179c0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
179d0 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
179e0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
179f0 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
17a00 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
17a10 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
17a20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
17a30 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  uf+2) + (((i64)1
17a40 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
17a50 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
17a60 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
17a70 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
17a80 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
17a90 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
17aa0 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
17ab0 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
17ac0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
17ad0 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
17ae0 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
17af0 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
17b00 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65      /* These use
17b10 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
17b20 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20  , so do them in 
17b30 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  a separate routi
17b40 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ne.      ** to a
17b50 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d  void having to m
17b60 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f  ove the frame po
17b70 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d  inter in the com
17b80 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
17b90 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47    return serialG
17ba0 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79  et(buf,serial_ty
17bb0 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  pe,pMem);.    }.
17bc0 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
17bd0 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
17be0 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
17bf0 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
17c00 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
17c10 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
17c20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
17c30 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
17c40 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
17c50 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
17c60 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
17c70 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20  nst u16 aFlag[] 
17c80 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  = { MEM_Blob|MEM
17c90 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c  _Ephem, MEM_Str|
17ca0 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20  MEM_Ephem };.   
17cb0 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
17cc0 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
17cd0 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61  pMem->n = (seria
17ce0 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
17cf0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
17d00 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74  = aFlag[serial_t
17d10 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65  ype&1];.      re
17d20 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  turn pMem->n;.  
17d30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17d40 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73   0;.}./*.** This
17d50 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
17d60 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66   to allocate suf
17d70 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f  ficient space fo
17d80 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63  r an UnpackedRec
17d90 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ord.** structure
17da0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
17db0 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71   be used with sq
17dc0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
17dd0 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68  npack() if.** th
17de0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
17df0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
17e00 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
17e10 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a  re pKeyInfo..**.
17e20 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20  ** The space is 
17e30 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64  either allocated
17e40 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
17e50 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66  MallocRaw() or f
17e60 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  rom within.** th
17e70 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66  e unaligned buff
17e80 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68  er passed via th
17e90 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69  e second and thi
17ea0 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72  rd arguments (pr
17eb0 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63  esumably.** stac
17ec0 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65  k space). If the
17ed0 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70   former, then *p
17ee0 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
17ef0 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73  a pointer that s
17f00 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e  hould.** be even
17f10 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20  tually freed by 
17f20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
17f30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
17f40 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a  . Or, if the .**
17f50 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65   allocation come
17f60 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63  s from the pSpac
17f70 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72  e/szSpace buffer
17f80 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  , *ppFree is set
17f90 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f   to NULL.** befo
17fa0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
17fb0 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
17fc0 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
17fd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
17fe0 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
17ff0 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f  *sqlite3VdbeAllo
18000 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
18010 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
18020 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
18030 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
18040 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  n of the record 
18050 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
18060 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18070 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65       /* Unaligne
18080 64 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  d space availabl
18090 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61  e */.  int szSpa
180a0 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
180b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
180c0 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
180d0 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  tes */.  char **
180e0 70 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20  ppFree          
180f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
18100 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66   Caller should f
18110 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ree this pointer
18120 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65   */.){.  Unpacke
18130 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20  dRecord *p;     
18140 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61           /* Unpa
18150 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72  cked record to r
18160 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
18170 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
18180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
18190 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62  crement pSpace b
181a0 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20  y nOff to align 
181b0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  it */.  int nByt
181c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
181d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
181e0 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
181f0 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20  red for *p */.. 
18200 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73   /* We want to s
18210 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72  hift the pointer
18220 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20   pSpace up such 
18230 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74  that it is 8-byt
18240 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20  e aligned..  ** 
18250 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  Thus, we need to
18260 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c   calculate a val
18270 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65  ue, nOff, betwee
18280 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68  n 0 and 7, to sh
18290 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e  ift .  ** it by.
182a0 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61    If pSpace is a
182b0 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c  lready 8-byte al
182c0 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75  igned, nOff shou
182d0 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f  ld be zero..  */
182e0 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28  .  nOff = (8 - (
182f0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
18300 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20  T(pSpace) & 7)) 
18310 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52  & 7;.  nByte = R
18320 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
18330 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20  ackedRecord)) + 
18340 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65  sizeof(Mem)*(pKe
18350 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29  yInfo->nField+1)
18360 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a  ;.  if( nByte>sz
18370 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20  Space+nOff ){.  
18380 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
18390 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44  ecord *)sqlite3D
183a0 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
183b0 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
183c0 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28  .    *ppFree = (
183d0 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66  char *)p;.    if
183e0 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
183f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
18400 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
18410 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d  d*)&pSpace[nOff]
18420 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20  ;.    *ppFree = 
18430 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65  0;.  }..  p->aMe
18440 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61  m = (Mem*)&((cha
18450 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)[ROUND8(siz
18460 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
18470 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28  rd))];.  assert(
18480 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
18490 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d  Order!=0 );.  p-
184a0 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
184b0 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c  Info;.  p->nFiel
184c0 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
184d0 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75  ield + 1;.  retu
184e0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
184f0 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
18500 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
18510 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
18520 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ], populate the 
18530 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  .** UnpackedReco
18540 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  rd structure ind
18550 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f  icated by the fo
18560 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69  urth argument wi
18570 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  th the.** conten
18580 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65  ts of the decode
18590 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f  d record..*/ .vo
185a0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
185b0 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
185c0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
185d0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
185e0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
185f0 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
18600 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
18610 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
18620 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
18630 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
18640 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
18650 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
18660 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63  ecord */.  Unpac
18670 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20  kedRecord *p    
18680 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
18690 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66  is structure bef
186a0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a  ore returning. *
186b0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
186c0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
186d0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
186e0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
186f0 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20    int d; .  u32 
18700 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
18710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
18720 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20  ffset in aKey[] 
18730 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
18740 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
18750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18760 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
18770 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
18780 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d  u32 szHdr;.  Mem
18790 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d   *pMem = p->aMem
187a0 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f  ;..  p->default_
187b0 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  rc = 0;.  assert
187c0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
187d0 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a  GNMENT(pMem) );.
187e0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
187f0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
18800 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20  ;.  d = szHdr;. 
18810 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   u = 0;.  while(
18820 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c   idx<szHdr && d<
18830 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
18840 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
18850 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
18860 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
18870 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
18880 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
18890 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
188a0 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
188b0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
188c0 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  /* pMem->flags =
188d0 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64   0; // sqlite3Vd
188e0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69  beSerialGet() wi
188f0 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20  ll set this for 
18900 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  us */.    pMem->
18910 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
18920 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
18930 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
18940 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
18950 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
18960 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b  em++;.    if( (+
18970 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29  +u)>=p->nField )
18980 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73   break;.  }.  as
18990 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
189a0 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b  o->nField + 1 );
189b0 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
189c0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
189d0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
189e0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
189f0 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20  es two index or 
18a00 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79  table record key
18a10 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  s in the same wa
18a20 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69  y.** as the sqli
18a30 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
18a40 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20  pare() routine. 
18a50 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72  Unlike VdbeRecor
18a60 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74  dCompare(),.** t
18a70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
18a80 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f  erializes and co
18a90 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73  mpares values us
18aa0 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ing the.** sqlit
18ab0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
18ac0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d  ) and sqlite3Mem
18ad0 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69  Compare() functi
18ae0 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a  ons. It is used.
18af0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73  ** in assert() s
18b00 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
18b10 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74  ure that the opt
18b20 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a  imized code in.*
18b30 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  * sqlite3VdbeRec
18b40 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74  ordCompare() ret
18b50 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74  urns results wit
18b60 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d  h these two prim
18b70 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  itives..**.** Re
18b80 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
18b90 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   result of compa
18ba0 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c  rison is equival
18bb0 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65  ent to desiredRe
18bc0 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  sult..** Return 
18bd0 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69  false if there i
18be0 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74  s a disagreement
18bf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18c00 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
18c10 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b  eDebug(.  int nK
18c20 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
18c30 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
18c40 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55  key */.  const U
18c50 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
18c60 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20  PKey2, /* Right 
18c70 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  key */.  int des
18c80 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20  iredResult      
18c90 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63         /* Correc
18ca0 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20  t answer */.){. 
18cb0 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
18cc0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
18cd0 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
18ce0 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
18cf0 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
18d00 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
18d10 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
18d20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
18d30 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
18d40 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  dr1;        /* N
18d50 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
18d60 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
18d70 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  t i = 0;.  int r
18d80 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
18d90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
18da0 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
18db0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
18dc0 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  y1;.  KeyInfo *p
18dd0 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d  KeyInfo;.  Mem m
18de0 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f  em1;..  pKeyInfo
18df0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
18e00 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  nfo;.  if( pKeyI
18e10 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74  nfo->db==0 ) ret
18e20 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e  urn 1;.  mem1.en
18e30 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
18e40 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
18e50 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
18e60 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
18e70 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
18e80 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
18e90 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
18ea0 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
18eb0 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  Y( mem1.szMalloc
18ec0 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20   = 0; ) /* Only 
18ed0 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74  needed by assert
18ee0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
18ef0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73  ..  /* Compilers
18f00 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68   may complain th
18f10 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70  at mem1.u.i is p
18f20 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69  otentially unini
18f30 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57  tialized..  ** W
18f40 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69  e could initiali
18f50 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20  ze it, as shown 
18f60 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65  here, to silence
18f70 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74   those complaint
18f80 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66  s..  ** But in f
18f90 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69  act, mem1.u.i wi
18fa0 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c  ll never actuall
18fb0 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74  y be used uninit
18fc0 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69  ialized, and doi
18fd0 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e  ng .  ** the unn
18fe0 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c  ecessary initial
18ff0 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65  ization has a me
19000 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76  asurable negativ
19010 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20  e performance.  
19020 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65  ** impact, since
19030 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
19040 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e   a very high run
19050 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65  ner.  And so, we
19060 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20   choose.  ** to 
19070 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69  ignore the compi
19080 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64  ler warnings and
19090 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69   leave this vari
190a0 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  able uninitializ
190b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d  ed..  */.  /*  m
190c0 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f  em1.u.i = 0;  //
190d0 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72   not needed, her
190e0 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d  e to silence com
190f0 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f  piler warning */
19100 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74  .  .  idx1 = get
19110 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
19120 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20  szHdr1);.  d1 = 
19130 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74  szHdr1;.  assert
19140 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ( pKeyInfo->nFie
19150 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  ld+pKeyInfo->nXF
19160 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46  ield>=pPKey2->nF
19170 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ield || CORRUPT_
19180 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
19190 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
191a0 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rder!=0 );.  ass
191b0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
191c0 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73  Field>0 );.  ass
191d0 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72  ert( idx1<=szHdr
191e0 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  1 || CORRUPT_DB 
191f0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32  );.  do{.    u32
19200 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a   serial_type1;..
19210 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
19220 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72  serial types for
19230 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
19240 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a  t in each key. *
19250 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65  /.    idx1 += ge
19260 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31  tVarint32( aKey1
19270 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79  +idx1, serial_ty
19280 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  pe1 );..    /* V
19290 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65  erify that there
192a0 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73   is enough key s
192b0 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74  pace remaining t
192c0 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61  o avoid.    ** a
192d0 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
192e0 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61  .  The "d1+seria
192f0 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78  l_type1+2" subex
19300 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20  pression will.  
19310 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67    ** always be g
19320 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
19330 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75  qual to the amou
19340 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b  nt of required k
19350 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ey space..    **
19360 20 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78   Use that approx
19370 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64  imation to avoid
19380 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73   the more expens
19390 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  ive call to.    
193a0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
193b0 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e  rialTypeLen() in
193c0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
193d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
193e0 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31   d1+serial_type1
193f0 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20  +2>(u32)nKey1.  
19400 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33     && d1+sqlite3
19410 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
19420 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e  n(serial_type1)>
19430 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20  (u32)nKey1 .    
19440 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
19450 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78      }..    /* Ex
19460 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73  tract the values
19470 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e   to be compared.
19480 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b  .    */.    d1 +
19490 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
194a0 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
194b0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c  ], serial_type1,
194c0 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a   &mem1);..    /*
194d0 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
194e0 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  on.    */.    rc
194f0 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
19500 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b  pare(&mem1, &pPK
19510 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b  ey2->aMem[i], pK
19520 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
19530 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
19540 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19550 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
19560 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
19570 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
19580 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
19590 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
195a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
195b0 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74   -rc;  /* Invert
195c0 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20   the result for 
195d0 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e  DESC sort order.
195e0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
195f0 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70    goto debugComp
19600 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  areEnd;.    }.  
19610 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28    i++;.  }while(
19620 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
19630 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
19640 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d   );..  /* No mem
19650 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
19660 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
19670 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
19680 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
19690 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
196a0 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
196b0 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
196c0 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
196d0 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
196e0 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
196f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
19700 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a  ease(&mem1)..  *
19710 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
19720 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
19730 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
19740 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
19750 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
19760 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
19770 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
19780 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
19790 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
197a0 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
197b0 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
197c0 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  lue.  */.  rc = 
197d0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
197e0 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72  rc;..debugCompar
197f0 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69  eEnd:.  if( desi
19800 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20  redResult==0 && 
19810 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  rc==0 ) return 1
19820 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  ;.  if( desiredR
19830 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20  esult<0 && rc<0 
19840 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
19850 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e  ( desiredResult>
19860 30 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75  0 && rc>0 ) retu
19870 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52  rn 1;.  if( CORR
19880 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20  UPT_DB ) return 
19890 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  1;.  if( pKeyInf
198a0 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
198b0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  led ) return 1;.
198c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
198d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68  ndif../*.** Both
198e0 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65   *pMem1 and *pMe
198f0 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e  m2 contain strin
19900 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72  g values. Compar
19910 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
19920 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f  .** using the co
19930 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19940 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c   pColl. As usual
19950 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74  , return a negat
19960 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  ive , zero.** or
19970 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
19980 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73  if *pMem1 is les
19990 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
199a0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
199b0 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73   .** *pMem2, res
199c0 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c  pectively. Simil
199d0 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20  ar in spirit to 
199e0 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d  "rc = (*pMem1) -
199f0 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a   (*pMem2);"..*/.
19a00 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
19a10 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
19a20 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
19a30 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  em1,.  const Mem
19a40 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74   *pMem2,.  const
19a50 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c   CollSeq *pColl,
19a60 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20  .  u8 *prcErr   
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a80 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20     /* If an OOM 
19a90 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53  occurs, set to S
19aa0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29  QLITE_NOMEM */.)
19ab0 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65  {.  if( pMem1->e
19ac0 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29  nc==pColl->enc )
19ad0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  {.    /* The str
19ae0 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79  ings are already
19af0 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
19b00 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20  encoding.  Call 
19b10 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70  the.     ** comp
19b20 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
19b30 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20  directly */.    
19b40 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43  return pColl->xC
19b50 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
19b60 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e  pMem1->n,pMem1->
19b70 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32  z,pMem2->n,pMem2
19b80 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->z);.  }else{. 
19b90 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63     int rc;.    c
19ba0 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a  onst void *v1, *
19bb0 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20  v2;.    int n1, 
19bc0 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a  n2;.    Mem c1;.
19bd0 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20      Mem c2;.    
19be0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
19bf0 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c1, pMem1->d
19c00 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
19c10 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
19c20 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d  Init(&c2, pMem1-
19c30 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
19c40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
19c50 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
19c60 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70  1, pMem1, MEM_Ep
19c70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  hem);.    sqlite
19c80 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
19c90 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20  opy(&c2, pMem2, 
19ca0 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
19cb0 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v1 = sqlite3Valu
19cc0 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
19cd0 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c  alue*)&c1, pColl
19ce0 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d  ->enc);.    n1 =
19cf0 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e   v1==0 ? 0 : c1.
19d00 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69  n;.    v2 = sqli
19d10 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
19d20 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32  lite3_value*)&c2
19d30 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
19d40 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20     n2 = v2==0 ? 
19d50 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63  0 : c2.n;.    rc
19d60 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
19d70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c  Coll->pUser, n1,
19d80 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20   v1, n2, v2);.  
19d90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
19da0 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20  Release(&c1);.  
19db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
19dc0 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20  Release(&c2);.  
19dd0 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20    if( (v1==0 || 
19de0 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72  v2==0) && prcErr
19df0 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c   ) *prcErr = SQL
19e00 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72  ITE_NOMEM;.    r
19e10 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
19e20 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
19e30 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72  wo blobs.  Retur
19e40 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
19e50 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
19e60 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73   the first.** is
19e70 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
19e80 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
19e90 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
19ea0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
19eb0 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69  ** If one blob i
19ec0 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
19ed0 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68  e other, then th
19ee0 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65  e shorter is the
19ef0 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   lessor..*/.stat
19f00 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
19f10 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c  NE int sqlite3Bl
19f20 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  obCompare(const 
19f30 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20  Mem *pB1, const 
19f40 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74  Mem *pB2){.  int
19f50 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d   c = memcmp(pB1-
19f60 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d  >z, pB2->z, pB1-
19f70 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d  >n>pB2->n ? pB2-
19f80 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20  >n : pB1->n);.  
19f90 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63  if( c ) return c
19fa0 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e  ;.  return pB1->
19fb0 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a  n - pB2->n;.}...
19fc0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
19fd0 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e  e values contain
19fe0 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65  ed by the two me
19ff0 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75  mory cells, retu
1a000 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76  rning.** negativ
1a010 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74  e, zero or posit
1a020 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20  ive if pMem1 is 
1a030 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1a040 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a   to, or greater.
1a050 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53  ** than pMem2. S
1a060 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20  orting order is 
1a070 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f  NULL's first, fo
1a080 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72  llowed by number
1a090 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  s (integers.** a
1a0a0 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64  nd reals) sorted
1a0b0 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f   numerically, fo
1a0c0 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f  llowed by text o
1a0d0 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f  rdered by the co
1a0e0 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
1a0f0 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69  nce pColl and fi
1a100 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64  nally blob's ord
1a110 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29  ered by memcmp()
1a120 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
1a130 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
1a140 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20  idered equal by 
1a150 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1a160 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d  /.int sqlite3Mem
1a170 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
1a180 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20  m *pMem1, const 
1a190 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73  Mem *pMem2, cons
1a1a0 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
1a1b0 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b  ){.  int f1, f2;
1a1c0 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f  .  int combined_
1a1d0 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70  flags;..  f1 = p
1a1e0 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66  Mem1->flags;.  f
1a1f0 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73  2 = pMem2->flags
1a200 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  ;.  combined_fla
1a210 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73  gs = f1|f2;.  as
1a220 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f  sert( (combined_
1a230 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
1a240 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a  et)==0 );. .  /*
1a250 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1a260 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73   NULL, it is les
1a270 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72  s than the other
1a280 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73  . If both values
1a290 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20  .  ** are NULL, 
1a2a0 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
1a2b0 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1a2c0 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
1a2d0 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d      return (f2&M
1a2e0 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d  EM_Null) - (f1&M
1a2f0 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20  EM_Null);.  }.. 
1a300 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1a310 20 69 73 20 61 20 6e 75 6d 62 65 72 20 61 6e 64   is a number and
1a320 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f   the other is no
1a330 74 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73  t, the number is
1a340 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62   less..  ** If b
1a350 6f 74 68 20 61 72 65 20 6e 75 6d 62 65 72 73 2c  oth are numbers,
1a360 20 63 6f 6d 70 61 72 65 20 61 73 20 72 65 61 6c   compare as real
1a370 73 20 69 66 20 6f 6e 65 20 69 73 20 61 20 72 65  s if one is a re
1a380 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65 67 65  al, or as intege
1a390 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74 68 20  rs.  ** if both 
1a3a0 76 61 6c 75 65 73 20 61 72 65 20 69 6e 74 65 67  values are integ
1a3b0 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
1a3c0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28  combined_flags&(
1a3d0 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
1a3e0 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
1a3f0 72 31 2c 20 72 32 3b 0a 20 20 20 20 69 66 28 20  r1, r2;.    if( 
1a400 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49  (f1 & f2 & MEM_I
1a410 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1a420 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c  if( pMem1->u.i <
1a430 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
1a440 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
1a450 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20  f( pMem1->u.i > 
1a460 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1a470 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74  urn 1;.      ret
1a480 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1a490 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61   if( (f1&MEM_Rea
1a4a0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  l)!=0 ){.      r
1a4b0 31 20 3d 20 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a  1 = pMem1->u.r;.
1a4c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
1a4d0 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  1&MEM_Int)!=0 ){
1a4e0 0a 20 20 20 20 20 20 72 31 20 3d 20 28 64 6f 75  .      r1 = (dou
1a4f0 62 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a  ble)pMem1->u.i;.
1a500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a510 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1a520 0a 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d  .    if( (f2&MEM
1a530 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1a540 20 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 75     r2 = pMem2->u
1a550 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  .r;.    }else if
1a560 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f2&MEM_Int)!=
1a570 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20  0 ){.      r2 = 
1a580 28 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75  (double)pMem2->u
1a590 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  .i;.    }else{. 
1a5a0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1a5b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 31      }.    if( r1
1a5c0 3c 72 32 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  <r2 ) return -1;
1a5d0 0a 20 20 20 20 69 66 28 20 72 31 3e 72 32 20 29  .    if( r1>r2 )
1a5e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72   return 1;.    r
1a5f0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
1a600 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1a610 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20  is a string and 
1a620 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62  the other is a b
1a630 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20  lob, the string 
1a640 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
1a650 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67   both are string
1a660 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67  s, compare using
1a670 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
1a680 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
1a690 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1a6a0 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ags&MEM_Str ){. 
1a6b0 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d     if( (f1 & MEM
1a6c0 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1a6d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1a6e0 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20  }.    if( (f2 & 
1a6f0 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
1a700 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1a710 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
1a720 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  t( pMem1->enc==p
1a730 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20  Mem2->enc );.   
1a740 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
1a750 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
1a760 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
1a770 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1a780 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70  ITE_UTF16LE || p
1a790 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1a7a0 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20  E_UTF16BE );..  
1a7b0 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
1a7c0 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74  on sequence must
1a7d0 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74   be defined at t
1a7e0 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20  his point, even 
1a7f0 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73  if.    ** the us
1a800 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63  er deletes the c
1a810 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1a820 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65  e after the vdbe
1a830 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20   program is.    
1a840 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69  ** compiled (thi
1a850 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73  s was not always
1a860 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20   the case)..    
1a870 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
1a880 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e  pColl || pColl->
1a890 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28  xCmp );..    if(
1a8a0 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
1a8b0 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61  return vdbeCompa
1a8c0 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d  reMemString(pMem
1a8d0 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c  1, pMem2, pColl,
1a8e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f   0);.    }.    /
1a8f0 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  * If a NULL poin
1a900 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61  ter was passed a
1a910 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75  s the collate fu
1a920 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72  nction, fall thr
1a930 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ough.    ** to t
1a940 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64  he blob case and
1a950 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20   use memcmp().  
1a960 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f  */.  }. .  /* Bo
1a970 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  th values must b
1a980 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72  e blobs.  Compar
1a990 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29  e using memcmp()
1a9a0 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  .  */.  return s
1a9b0 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
1a9c0 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b  e(pMem1, pMem2);
1a9d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
1a9e0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
1a9f0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
1aa00 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61  ction is a seria
1aa10 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63  l-type that.** c
1aa20 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
1aa30 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76   integer - all v
1aa40 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20  alues between 1 
1aa50 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20  and 9 inclusive 
1aa60 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68  .** except 7. Th
1aa70 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20  e second points 
1aa80 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1aa90 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65  aining an intege
1aaa0 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61  r value.** seria
1aab0 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20  lized according 
1aac0 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20  to serial_type. 
1aad0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
1aae0 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e  serializes.** an
1aaf0 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  d returns the va
1ab00 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
1ab10 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63  64 vdbeRecordDec
1ab20 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61  odeInt(u32 seria
1ab30 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38  l_type, const u8
1ab40 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79   *aKey){.  u32 y
1ab50 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
1ab60 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61  UPT_DB || (seria
1ab70 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72  l_type>=1 && ser
1ab80 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73  ial_type<=9 && s
1ab90 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29  erial_type!=7) )
1aba0 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  ;.  switch( seri
1abb0 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
1abc0 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20  ase 0:.    case 
1abd0 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1:.      testcas
1abe0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1abf0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1ac00 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
1ac10 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a  y);.    case 2:.
1ac20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ac30 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1ac40 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f        return TWO
1ac50 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1ac60 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20  .    case 3:.   
1ac70 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1ac80 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1ac90 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f     return THREE_
1aca0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1acb0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20      case 4: {.  
1acc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1acd0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1ace0 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
1acf0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1ad00 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1ad10 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d  *(int*)&y;.    }
1ad20 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20  .    case 5: {. 
1ad30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1ad40 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1ad50 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52       return FOUR
1ad60 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1ad70 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1ad80 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1ad90 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  (aKey);.    }.  
1ada0 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20    case 6: {.    
1adb0 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
1adc0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1add0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ade0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1adf0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
1ae00 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
1ae10 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
1ae20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
1ae30 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20  i64*)&x;.    }. 
1ae40 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65   }..  return (se
1ae50 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a  rial_type - 8);.
1ae60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ae70 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
1ae80 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
1ae90 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
1aea0 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
1aeb0 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
1aec0 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
1aed0 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
1aee0 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
1aef0 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
1af00 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65  er if key1 is le
1af10 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1af20 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
1af30 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65   than key2.  The
1af40 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1af50 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
1af60 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
1af70 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1af80 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
1af90 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
1afa0 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
1afb0 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
1afc0 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
1afd0 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
1afe0 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
1aff0 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
1b000 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  t bSkip is non-z
1b010 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
1b020 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
1b030 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  er has already.*
1b040 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  * determined tha
1b050 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  t the first fiel
1b060 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61  ds of the keys a
1b070 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20  re equal..**.** 
1b080 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
1b090 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
1b0a0 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
1b0b0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20  mber of fields. 
1b0c0 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64  If all .** field
1b0d0 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
1b0e0 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65   both keys are e
1b0f0 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79  qual, then pPKey
1b100 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73  2->default_rc is
1b110 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
1b120 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65  *.** If database
1b130 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1b140 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70  iscovered, set p
1b150 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74  PKey2->errCode t
1b160 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  o .** SQLITE_COR
1b170 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20  RUPT and return 
1b180 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  0. If an OOM err
1b190 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1b1a0 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65  d, .** pPKey2->e
1b1b0 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f  rrCode is set to
1b1c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
1b1d0 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  d, if it is not 
1b1e0 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c  NULL, the.** mal
1b1f0 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20  loc-failed flag 
1b200 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  set on database 
1b210 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e  handle (pPKey2->
1b220 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a  pKeyInfo->db)..*
1b230 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1b240 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
1b250 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b  thSkip(.  int nK
1b260 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1b270 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
1b280 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1b290 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1b2a0 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2,         /* Ri
1b2b0 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1b2c0 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   bSkip          
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b2e0 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68  If true, skip th
1b2f0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f  e first field */
1b300 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
1b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b320 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1b330 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1b340 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
1b350 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b370 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1b380 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20  f next field to 
1b390 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32  compare */.  u32
1b3a0 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
1b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b3c0 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68  Size of record h
1b3d0 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a  eader in bytes *
1b3e0 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b400 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
1b410 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68   first type in h
1b420 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  eader */.  int r
1b430 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1b440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b450 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
1b460 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65  Mem *pRhs = pPKe
1b470 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20  y2->aMem;       
1b480 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66  /* Next field of
1b490 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61   pPKey2 to compa
1b4a0 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  re */.  KeyInfo 
1b4b0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65  *pKeyInfo = pPKe
1b4c0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
1b4d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1b4e0 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1b4f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1b500 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d  r *)pKey1;.  Mem
1b510 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20   mem1;..  /* If 
1b520 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74  bSkip is true, t
1b530 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hen the caller h
1b540 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72  as already deter
1b550 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66  mined that the f
1b560 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c  irst.  ** two el
1b570 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65  ements in the ke
1b580 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69  ys are equal. Fi
1b590 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  x the various st
1b5a0 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ack variables so
1b5b0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20  .  ** that this 
1b5c0 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63  routine begins c
1b5d0 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20  omparing at the 
1b5e0 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f  second field. */
1b5f0 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a  .  if( bSkip ){.
1b600 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20      u32 s1;.    
1b610 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61  idx1 = 1 + getVa
1b620 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d  rint32(&aKey1[1]
1b630 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72  , s1);.    szHdr
1b640 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20  1 = aKey1[0];.  
1b650 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20    d1 = szHdr1 + 
1b660 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b670 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20  lTypeLen(s1);.  
1b680 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68    i = 1;.    pRh
1b690 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s++;.  }else{.  
1b6a0 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
1b6b0 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
1b6c0 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  r1);.    d1 = sz
1b6d0 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31  Hdr1;.    if( d1
1b6e0 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  >(unsigned)nKey1
1b6f0 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79   ){ .      pPKey
1b700 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1b710 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1b720 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
1b730 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70  rn 0;  /* Corrup
1b740 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
1b750 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20    i = 0;.  }..  
1b760 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1b770 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1b780 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1b790 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1b7a0 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ents */.  assert
1b7b0 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1b7c0 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79  fo->nField+pPKey
1b7d0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  2->pKeyInfo->nXF
1b7e0 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46  ield>=pPKey2->nF
1b7f0 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20  ield .       || 
1b800 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1b810 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1b820 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1b830 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rder!=0 );.  ass
1b840 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1b850 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20  yInfo->nField>0 
1b860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
1b870 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
1b880 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
1b890 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1b8a0 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48  type;..    /* RH
1b8b0 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  S is an integer 
1b8c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  */.    if( pRhs-
1b8d0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1b8e0 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
1b8f0 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1b900 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  x1];.      testc
1b910 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1b920 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1b930 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1b940 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1b950 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1b960 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1b970 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1b980 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1b990 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1b9a0 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
1b9b0 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20     double rhs = 
1b9c0 28 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e  (double)pRhs->u.
1b9d0 69 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  i;.        sqlit
1b9e0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1b9f0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1ba00 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
1ba10 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d  .        if( mem
1ba20 31 2e 75 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20  1.u.r<rhs ){.   
1ba30 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1ba40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1ba50 28 20 6d 65 6d 31 2e 75 2e 72 3e 72 68 73 20 29  ( mem1.u.r>rhs )
1ba60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1ba70 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1ba80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ba90 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64      i64 lhs = vd
1baa0 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
1bab0 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  t(serial_type, &
1bac0 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20  aKey1[d1]);.    
1bad0 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52      i64 rhs = pR
1bae0 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20  hs->u.i;.       
1baf0 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
1bb00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1bb10 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1bb20 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
1bb30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
1bb40 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1bb50 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1bb60 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a  /* RHS is real *
1bb70 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1bb80 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1bb90 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  _Real ){.      s
1bba0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1bbb0 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1bbc0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1bbd0 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =12 ){.        r
1bbe0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1bbf0 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1bc00 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1bc10 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1bc20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bc30 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 70 52 68  double rhs = pRh
1bc40 73 2d 3e 75 2e 72 3b 0a 20 20 20 20 20 20 20 20  s->u.r;.        
1bc50 64 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20 20 20  double lhs;.    
1bc60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1bc70 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1bc80 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1bc90 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1bca0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1bcb0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1bcc0 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 75 2e 72    lhs = mem1.u.r
1bcd0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1bce0 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d  .          lhs =
1bcf0 20 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e 75 2e   (double)mem1.u.
1bd00 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  i;.        }.   
1bd10 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1bd20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1bd30 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1bd40 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1bd50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1bd60 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1bd70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1bd80 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1bd90 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c  string */.    el
1bda0 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1bdb0 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
1bdc0 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1bdd0 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1bde0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1bdf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1be00 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1be10 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1be20 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1be30 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1be40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
1be50 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1be60 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1be70 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1be80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
1be90 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  1.n = (serial_ty
1bea0 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1beb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bec0 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e  (d1+mem1.n)==(un
1bed0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1bee0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1bef0 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d  ( (d1+mem1.n+1)=
1bf00 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1bf10 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1bf20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75  (d1+mem1.n) > (u
1bf30 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1bf40 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1bf50 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1bf60 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1bf70 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1bf80 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1bf90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1bfa0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1bfb0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
1bfc0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
1bfd0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
1bfe0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1bff0 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
1c000 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1c010 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
1c020 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
1c030 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
1c040 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
1c050 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
1c060 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
1c070 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1c080 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g(.             
1c090 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b   &mem1, pRhs, pK
1c0a0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1c0b0 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  , &pPKey2->errCo
1c0c0 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  de.          );.
1c0d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1c0e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1c0f0 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20  p = MIN(mem1.n, 
1c100 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1c110 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1c120 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1c130 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1c140 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1c150 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20  ) rc = mem1.n - 
1c160 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20  pRhs->n; .      
1c170 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c180 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1c190 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65   a blob */.    e
1c1a0 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1c1b0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
1c1c0 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
1c1d0 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1c1e0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1c1f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c200 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1c210 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1c220 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28  ial_type<12 || (
1c230 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1c240 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1c250 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1c260 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1c270 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
1c280 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1c290 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1c2a0 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e  ( (d1+nStr)==(un
1c2b0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1c2c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1c2d0 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28  ( (d1+nStr+1)==(
1c2e0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1c2f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1c300 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67  1+nStr) > (unsig
1c310 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1c320 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1c330 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1c340 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c350 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1c360 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1c370 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1c380 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1c390 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1c3a0 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53  nt nCmp = MIN(nS
1c3b0 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  tr, pRhs->n);.  
1c3c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1c3d0 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1c3e0 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1c3f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1c400 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20  ==0 ) rc = nStr 
1c410 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20  - pRhs->n;.     
1c420 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c430 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1c440 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c  s null */.    el
1c450 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c  se{.      serial
1c460 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1c470 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x1];.      rc = 
1c480 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29  (serial_type!=0)
1c490 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1c4a0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1c4b0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1c4c0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1c4d0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1c4e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1c4f0 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
1c500 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1c510 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1c520 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20  y2, rc) );.     
1c530 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1c540 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1c550 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1c560 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
1c570 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1c580 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b    i++;.    pRhs+
1c590 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  +;.    d1 += sql
1c5a0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1c5b0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1c5c0 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20  e);.    idx1 += 
1c5d0 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
1c5e0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
1c5f0 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75   }while( idx1<(u
1c600 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26  nsigned)szHdr1 &
1c610 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1c620 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67  ld && d1<=(unsig
1c630 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20  ned)nKey1 );..  
1c640 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
1c650 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
1c660 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
1c670 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
1c680 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
1c690 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
1c6a0 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
1c6b0 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
1c6c0 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
1c6d0 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
1c6e0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
1c6f0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1c700 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  em1).  */.  asse
1c710 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1c720 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
1c730 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
1c740 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20  hat one or both 
1c750 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
1c760 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
1c770 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
1c780 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
1c790 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
1c7a0 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
1c7b0 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
1c7c0 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  lue.  */.  asser
1c7d0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20  t( CORRUPT_DB . 
1c7e0 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63        || vdbeRec
1c7f0 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1c800 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1c810 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65  Key2, pPKey2->de
1c820 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20  fault_rc) .     
1c830 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64    || pKeyInfo->d
1c840 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
1c850 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50    );.  return pP
1c860 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1c870 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1c880 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c890 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1c8a0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1c8b0 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
1c8c0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1c8d0 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
1c8e0 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1c8f0 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  y */.){.  return
1c900 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1c910 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
1c920 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1c930 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   0);.}.../*.** T
1c940 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c950 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
1c960 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
1c970 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c980 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
1c990 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1c9a0 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20  of pPKey2 is an 
1c9b0 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29  integer, and (b)
1c9c0 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66   the .** size-of
1c9d0 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61  -header varint a
1c9e0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
1c9f0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
1ca00 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  s in a single.**
1ca10 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c   byte (i.e. is l
1ca20 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a  ess than 128)..*
1ca30 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f  *.** To avoid co
1ca40 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66  ncerns about buf
1ca50 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74  fer overreads, t
1ca60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
1ca70 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73  nly used.** on s
1ca80 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65  chemas where the
1ca90 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68   maximum valid h
1caa0 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33  eader size is 63
1cab0 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a   bytes or less..
1cac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1cad0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
1cae0 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  nt(.  int nKey1,
1caf0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1cb00 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
1cb10 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1cb20 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
1cb30 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
1cb40 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
1cb50 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73   *aKey = &((cons
1cb60 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63  t u8*)pKey1)[*(c
1cb70 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26  onst u8*)pKey1 &
1cb80 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65   0x3F];.  int se
1cb90 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f  rial_type = ((co
1cba0 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31  nst u8*)pKey1)[1
1cbb0 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ];.  int res;.  
1cbc0 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a  u32 y;.  u64 x;.
1cbd0 20 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32    i64 v = pPKey2
1cbe0 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20  ->aMem[0].u.i;. 
1cbf0 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 61 73 73   i64 lhs;..  ass
1cc00 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79  ert( (*(u8*)pKey
1cc10 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52  1)<=0x3F || CORR
1cc20 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74  UPT_DB );.  swit
1cc30 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
1cc40 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b  ){.    case 1: {
1cc50 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
1cc60 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1cc70 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54     lhs = ONE_BYT
1cc80 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1cc90 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1cca0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1ccb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ccc0 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
1ccd0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1cce0 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54  */.      lhs = T
1ccf0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1cd00 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1cd10 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
1cd20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1cd30 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
1cd40 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
1cd50 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
1cd60 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f  hs = THREE_BYTE_
1cd70 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1cd80 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1cd90 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1cda0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1cdb0 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
1cdc0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1cdd0 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
1cde0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1cdf0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36  .      lhs = (i6
1ce00 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
1ce10 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1ce20 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1ce30 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ce40 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
1ce50 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1ce60 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46  */.      lhs = F
1ce70 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1ce80 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
1ce90 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1cea0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1ceb0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1cec0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1ced0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1cee0 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73  6: { /* 8-byte s
1cef0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1cf00 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f  .      x = FOUR_
1cf10 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1cf20 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
1cf30 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
1cf40 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
1cf50 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29     lhs = *(i64*)
1cf60 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  &x;.      testca
1cf70 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1cf80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cf90 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20      case 8: .   
1cfa0 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20     lhs = 0;.    
1cfb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1cfc0 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d  e 9:.      lhs =
1cfd0 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
1cfe0 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  ..    /* This ca
1cff0 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f  se could be remo
1d000 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e  ved without chan
1d010 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ging the results
1d020 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20   of running.    
1d030 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e  ** this code. In
1d040 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65  cluding it cause
1d050 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74  s gcc to generat
1d060 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63  e a faster switc
1d070 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  h .    ** statem
1d080 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72  ent (since the r
1d090 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74  ange of switch t
1d0a0 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74  argets now start
1d0b0 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20  s at zero and.  
1d0c0 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f    ** is contiguo
1d0d0 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  us) but does not
1d0e0 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69   cause any dupli
1d0f0 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20  cate code to be 
1d100 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a  generated.    **
1d110 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76   (as gcc is clev
1d120 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d  er enough to com
1d130 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b  bine the two lik
1d140 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20  e cases). Other 
1d150 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72  .    ** compiler
1d160 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c  s might be simil
1d170 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73  ar.  */ .    cas
1d180 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20  e 0: case 7:.   
1d190 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1d1a0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1d1b0 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
1d1c0 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64   pPKey2);..    d
1d1d0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
1d1e0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1d1f0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
1d200 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1d210 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  y2);.  }..  if( 
1d220 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v>lhs ){.    res
1d230 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
1d240 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73   }else if( v<lhs
1d250 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
1d260 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73  Key2->r2;.  }els
1d270 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46  e if( pPKey2->nF
1d280 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ield>1 ){.    /*
1d290 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
1d2a0 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
1d2b0 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d  s are equal. Com
1d2c0 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e  pare the trailin
1d2d0 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73  g .    ** fields
1d2e0 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  .  */.    res = 
1d2f0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1d300 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
1d310 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1d320 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
1d330 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
1d340 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
1d350 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61  keys are equal a
1d360 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
1d370 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20  trailing.    ** 
1d380 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70  fields. Return p
1d390 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1d3a0 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  c in this case. 
1d3b0 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  */.    res = pPK
1d3c0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1d3d0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1d3e0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1d3f0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1d400 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
1d410 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  ) );.  return re
1d420 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
1d430 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
1d440 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
1d450 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
1d460 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1d470 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
1d480 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
1d490 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69  pPKey2 is a stri
1d4a0 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65  ng, that (b) the
1d4b0 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20   first field.** 
1d4c0 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
1d4d0 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
1d4e0 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20  RY and (c) that 
1d4f0 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  the size-of-head
1d500 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74  er varint .** at
1d510 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
1d520 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
1d530 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
1d540 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d550 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1d560 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20  reString(.  int 
1d570 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1d580 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
1d590 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1d5a0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1d5b0 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
1d5c0 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
1d5d0 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20  nst u8 *aKey1 = 
1d5e0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1d5f0 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74  ;.  int serial_t
1d600 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  ype;.  int res;.
1d610 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  .  getVarint32(&
1d620 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c  aKey1[1], serial
1d630 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65  _type);.  if( se
1d640 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a  rial_type<12 ){.
1d650 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1d660 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r1;      /* (p
1d670 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
1d680 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c   number or a nul
1d690 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  l */.  }else if(
1d6a0 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26   !(serial_type &
1d6b0 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72   0x01) ){ .    r
1d6c0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
1d6d0 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
1d6e0 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62  nKey1) is a blob
1d6f0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1d700 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69   int nCmp;.    i
1d710 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74  nt nStr;.    int
1d720 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30   szHdr = aKey1[0
1d730 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28  ];..    nStr = (
1d740 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20  serial_type-12) 
1d750 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a  / 2;.    if( (sz
1d760 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b  Hdr + nStr) > nK
1d770 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b  ey1 ){.      pPK
1d780 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1d790 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1d7a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
1d7b0 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f  turn 0;    /* Co
1d7c0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1d7d0 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e  }.    nCmp = MIN
1d7e0 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  ( pPKey2->aMem[0
1d7f0 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20  ].n, nStr );.   
1d800 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61   res = memcmp(&a
1d810 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b  Key1[szHdr], pPK
1d820 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20  ey2->aMem[0].z, 
1d830 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20  nCmp);..    if( 
1d840 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
1d850 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b  res = nStr - pPK
1d860 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a  ey2->aMem[0].n;.
1d870 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
1d880 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1d890 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
1d8a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1d8b0 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 43 6f  s = vdbeRecordCo
1d8c0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1d8d0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1d8e0 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  y2, 1);.        
1d8f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d900 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64   res = pPKey2->d
1d910 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20  efault_rc;.     
1d920 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1d930 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
1d940 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1d950 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65  y2->r2;.      }e
1d960 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
1d970 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
1d980 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1d990 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
1d9a0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1d9b0 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->r2;.    }else{
1d9c0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
1d9d0 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20  ey2->r1;.    }. 
1d9e0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
1d9f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1da00 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1da10 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a  1, pPKey2, res).
1da20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
1da30 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70  T_DB.       || p
1da40 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1da50 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1da60 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  d.  );.  return 
1da70 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  res;.}../*.** Re
1da80 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1da90 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65  o an sqlite3Vdbe
1daa0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1dab0 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74  compatible funct
1dac0 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20  ion.** suitable 
1dad0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65  for comparing se
1dae0 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73  rialized records
1daf0 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64   to the unpacked
1db00 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a   record passed.*
1db10 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  * as the only ar
1db20 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72  gument..*/.Recor
1db30 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33  dCompare sqlite3
1db40 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
1db50 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1db60 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52  p){.  /* varintR
1db70 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1db80 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f  ) and varintReco
1db90 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1dba0 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20  ) both assume.  
1dbb0 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  ** that the size
1dbc0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
1dbd0 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  t that occurs at
1dbe0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
1dbf0 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66  ch record.  ** f
1dc00 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
1dc10 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32  byte (i.e. is 12
1dc20 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69  7 or less). vari
1dc30 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
1dc40 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61  nt().  ** also a
1dc50 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
1dc60 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65  s safe to overre
1dc70 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61  ad a buffer by a
1dc80 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a  t least the .  *
1dc90 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62  * maximum possib
1dca0 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20  le legal header 
1dcb0 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65  size plus 8 byte
1dcc0 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65  s. Because there
1dcd0 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74   is.  ** guarant
1dce0 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61  eed to be at lea
1dcf0 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31  st 74 (but not 1
1dd00 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64  36) bytes of pad
1dd10 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  ding following e
1dd20 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ach.  ** buffer 
1dd30 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74  passed to varint
1dd40 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1dd50 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74  () this makes it
1dd60 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20   convenient to. 
1dd70 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69   ** limit the si
1dd80 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
1dd90 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20   to 64 bytes in 
1dda0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
1ddb0 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a  first field.  **
1ddc0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   is an integer..
1ddd0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61    **.  ** The ea
1dde0 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66  siest way to enf
1ddf0 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20  orce this limit 
1de00 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f  is to consider o
1de10 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68  nly records with
1de20 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20  .  ** 13 fields 
1de30 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20  or less. If the 
1de40 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61  first field is a
1de50 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d  n integer, the m
1de60 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a  aximum legal.  *
1de70 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  * header size is
1de80 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20   (12*5 + 1 + 1) 
1de90 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28  bytes.  */.  if(
1dea0 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e   (p->pKeyInfo->n
1deb0 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49  Field + p->pKeyI
1dec0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31  nfo->nXField)<=1
1ded0 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61  3 ){.    int fla
1dee0 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e  gs = p->aMem[0].
1def0 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70  flags;.    if( p
1df00 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
1df10 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20  tOrder[0] ){.   
1df20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20     p->r1 = 1;.  
1df30 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a      p->r2 = -1;.
1df40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1df50 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20   p->r1 = -1;.   
1df60 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20     p->r2 = 1;.  
1df70 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61    }.    if( (fla
1df80 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b  gs & MEM_Int) ){
1df90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1dfa0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
1dfb0 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  nt;.    }.    te
1dfc0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
1dfd0 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20  MEM_Real );.    
1dfe0 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
1dff0 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20  & MEM_Null );.  
1e000 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
1e010 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
1e020 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
1e030 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e   (MEM_Real|MEM_N
1e040 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d  ull|MEM_Blob))==
1e050 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  0 && p->pKeyInfo
1e060 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b  ->aColl[0]==0 ){
1e070 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
1e080 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
1e090 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  ;.      return v
1e0a0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1e0b0 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20  String;.    }.  
1e0c0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  }..  return sqli
1e0d0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1e0e0 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  pare;.}../*.** p
1e0f0 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
1e100 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
1e110 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
1e120 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1e130 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
1e140 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
1e150 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
1e160 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
1e170 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
1e180 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1e190 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
1e1a0 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
1e1b0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
1e1c0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
1e1d0 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
1e1e0 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
1e1f0 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
1e200 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1e210 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
1e220 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
1e230 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
1e240 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
1e250 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
1e260 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
1e270 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
1e280 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
1e290 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
1e2a0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
1e2b0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
1e2c0 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
1e2d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1e2e0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
1e2f0 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
1e300 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
1e310 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
1e320 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
1e330 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1e340 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
1e350 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  m, v;..  /* Get 
1e360 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1e370 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e  index entry.  On
1e380 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69  ly indices entri
1e390 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20  es of less.  ** 
1e3a0 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75  than 2GiB are su
1e3b0 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67  pport - anything
1e3c0 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64   large must be d
1e3d0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1e3e0 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72  on..  ** Any cor
1e3f0 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
1e400 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ted in sqlite3Bt
1e410 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
1e420 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20  ), though, so.  
1e430 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e  ** this code can
1e440 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74   safely assume t
1e450 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20  hat nCellKey is 
1e460 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20  32-bits  .  */. 
1e470 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e480 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
1e490 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
1e4a0 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
1e4b0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
1e4c0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
1e4d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
1e4e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
1e4f0 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
1e500 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
1e510 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
1e520 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e   */.  assert( (n
1e530 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
1e540 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
1e550 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
1e560 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
1e570 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
1e580 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
1e590 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
1e5a0 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
1e5b0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
1e5c0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
1e5d0 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75  tree(pCur, 0, (u
1e5e0 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  32)nCellKey, 1, 
1e5f0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
1e600 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1e610 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
1e620 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
1e630 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
1e640 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
1e650 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
1e660 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
1e670 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
1e680 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  dr==3 );.  testc
1e690 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
1e6a0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
1e6b0 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e  y(szHdr<3 || (in
1e6c0 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a  t)szHdr>m.n) ){.
1e6d0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
1e6e0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
1e6f0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
1e700 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
1e710 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
1e720 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
1e730 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
1e740 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
1e750 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
1e760 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
1e770 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
1e780 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
1e790 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
1e7a0 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
1e7b0 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
1e7c0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1e7d0 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
1e7e0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1e7f0 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
1e800 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
1e810 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1e820 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
1e830 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1e840 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
1e850 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1e860 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
1e870 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
1e880 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
1e890 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
1e8a0 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
1e8b0 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
1e8c0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
1e8d0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
1e8e0 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
1e8f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1e900 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
1e910 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
1e920 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48  e( (u32)m.n==szH
1e930 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20  dr+lenRowid );. 
1e940 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75   if( unlikely((u
1e950 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e  32)m.n<szHdr+len
1e960 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f  Rowid) ){.    go
1e970 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
1e980 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
1e990 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74  /* Fetch the int
1e9a0 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64  eger off the end
1e9b0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65   of the index re
1e9c0 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
1e9d0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
1e9e0 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
1e9f0 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
1ea00 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
1ea10 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69   = v.u.i;.  sqli
1ea20 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1ea30 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
1ea40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1ea50 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61   Jump here if da
1ea60 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1ea70 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66  n is detected af
1ea80 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20  ter m has been. 
1ea90 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   ** allocated.  
1eaa0 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63  Free the m objec
1eab0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
1eac0 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a  ITE_CORRUPT. */.
1ead0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
1eae0 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65  tion:.  testcase
1eaf0 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20  ( m.szMalloc!=0 
1eb00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1eb10 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
1eb20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1eb30 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a  CORRUPT_BKPT;.}.
1eb40 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1eb50 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e  he key of the in
1eb60 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63  dex entry that c
1eb70 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e  ursor pC is poin
1eb80 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a  ting to against.
1eb90 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e  ** the key strin
1eba0 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  g in pUnpacked. 
1ebb0 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65   Write into *pRe
1ebc0 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68  s a number.** th
1ebd0 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  at is negative, 
1ebe0 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
1ebf0 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20  e if pC is less 
1ec00 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a  than, equal to,.
1ec10 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
1ec20 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52  an pUnpacked.  R
1ec30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1ec40 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
1ec50 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65  * pUnpacked is e
1ec60 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
1ec70 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
1ec80 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
1ec90 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
1eca0 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
1ecb0 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
1ecc0 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
1ecd0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
1ece0 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
1ecf0 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20  s well.  Hence, 
1ed00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  this routine onl
1ed10 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70  y compares the p
1ed20 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74  refixes .** of t
1ed30 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f  he keys prior to
1ed40 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
1ed50 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65  , not the entire
1ed60 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
1ed70 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
1ed80 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33  mpare(.  sqlite3
1ed90 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
1eda0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1edb0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1edc0 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
1edd0 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
1ede0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
1edf0 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
1ee00 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70  against */.  Unp
1ee10 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e  ackedRecord *pUn
1ee20 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a  packed,       /*
1ee30 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f   Unpacked versio
1ee40 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  n of key */.  in
1ee50 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ee70 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
1ee80 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
1ee90 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
1eea0 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
1eeb0 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
1eec0 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
1eed0 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  ursor;.  Mem m;.
1eee0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1eef0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
1ef00 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
1ef10 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
1ef20 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
1ef30 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
1ef40 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
1ef50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
1ef60 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
1ef70 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
1ef80 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
1ef90 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  l */.  /* nCellK
1efa0 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
1efb0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
1efc0 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
1efd0 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20  se of the way.  
1efe0 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
1eff0 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
1f000 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
1f010 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
1f020 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
1f030 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
1f040 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
1f050 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
1f060 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1f070 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1f080 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1f090 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
1f0a0 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
1f0b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
1f0c0 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f  Btree(pC->pCurso
1f0d0 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c  r, 0, (u32)nCell
1f0e0 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
1f0f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
1f100 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72  urn rc;.  }.  *r
1f110 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
1f120 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e  RecordCompare(m.
1f130 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65  n, m.z, pUnpacke
1f140 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
1f150 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
1f160 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f170 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1f180 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
1f190 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
1f1a0 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73  returned by subs
1f1b0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a  equent calls to.
1f1c0 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ** sqlite3_chang
1f1d0 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61  es() on the data
1f1e0 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27  base handle 'db'
1f1f0 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
1f200 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
1f210 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
1f220 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73  t nChange){.  as
1f230 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1f240 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
1f250 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68  ex) );.  db->nCh
1f260 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a  ange = nChange;.
1f270 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
1f280 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d  ge += nChange;.}
1f290 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ../*.** Set a fl
1f2a0 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74  ag in the vdbe t
1f2b0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
1f2c0 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e  nge counter when
1f2d0 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64   it is finalised
1f2e0 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f  .** or reset..*/
1f2f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1f300 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64  eCountChanges(Vd
1f310 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61  be *v){.  v->cha
1f320 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a  ngeCntOn = 1;.}.
1f330 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72  ./*.** Mark ever
1f340 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
1f350 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  ment associated 
1f360 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
1f370 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73  connection.** as
1f380 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   expired..**.** 
1f390 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
1f3a0 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20  ment means that 
1f3b0 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
1f3c0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
1f3d0 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20  s.** recommend. 
1f3e0 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69   Statements expi
1f3f0 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68  re when things h
1f400 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20  appen that make 
1f410 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d  their.** program
1f420 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d  s obsolete.  Rem
1f430 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e  oving user-defin
1f440 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  ed functions or 
1f450 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
1f460 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67  uences, or chang
1f470 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ing an authoriza
1f480 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  tion function ar
1f490 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a  e the types of.*
1f4a0 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61  * things that ma
1f4b0 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ke prepared stat
1f4c0 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e  ements obsolete.
1f4d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f4e0 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
1f4f0 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
1f500 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
1f510 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e  ;.  for(p = db->
1f520 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70  pVdbe; p; p=p->p
1f530 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78  Next){.    p->ex
1f540 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  pired = 1;.  }.}
1f550 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1f560 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
1f570 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1f580 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  Vdbe..*/.sqlite3
1f590 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28   *sqlite3VdbeDb(
1f5a0 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
1f5b0 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a  rn v->db;.}../*.
1f5c0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1f5d0 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
1f5e0 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
1f5f0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
1f600 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20   value bound.** 
1f610 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f  parameter iVar o
1f620 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20  f VM v. Except, 
1f630 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
1f640 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74  an SQL NULL, ret
1f650 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61  urn .** 0 instea
1f660 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20  d. Unless it is 
1f670 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69  NULL, apply affi
1f680 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66  nity aff (one of
1f690 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   the SQLITE_AFF_
1f6a0 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20  *.** constants) 
1f6b0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  to the value bef
1f6c0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74  ore returning it
1f6d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
1f6e0 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20  rned value must 
1f6f0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
1f700 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
1f710 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e  ite3ValueFree().
1f720 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75  .*/.sqlite3_valu
1f730 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  e *sqlite3VdbeGe
1f740 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65  tBoundValue(Vdbe
1f750 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75   *v, int iVar, u
1f760 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74  8 aff){.  assert
1f770 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
1f780 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  ( v ){.    Mem *
1f790 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b  pMem = &v->aVar[
1f7a0 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28  iVar-1];.    if(
1f7b0 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   0==(pMem->flags
1f7c0 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a   & MEM_Null) ){.
1f7d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
1f7e0 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69  lue *pRet = sqli
1f7f0 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64  te3ValueNew(v->d
1f800 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  b);.      if( pR
1f810 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
1f820 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
1f830 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d  ((Mem *)pRet, pM
1f840 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
1f850 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66  ite3ValueApplyAf
1f860 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66  finity(pRet, aff
1f870 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
1f880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1f890 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
1f8a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1f8b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
1f8c0 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ure SQL variable
1f8d0 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69   iVar so that bi
1f8e0 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75  nding a new valu
1f8f0 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a  e to it signals.
1f900 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ** to sqlite3_re
1f910 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20  optimize() that 
1f920 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65  re-preparing the
1f930 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72   statement may r
1f940 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65  esult.** in a be
1f950 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e  tter query plan.
1f960 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f970 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56  VdbeSetVarmask(V
1f980 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
1f990 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
1f9a0 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61  r>0 );.  if( iVa
1f9b0 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  r>32 ){.    v->e
1f9c0 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66  xpmask = 0xfffff
1f9d0 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fff;.  }else{.  
1f9e0 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20    v->expmask |= 
1f9f0 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72  ((u32)1 << (iVar
1fa00 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  -1));.  }.}..#if
1fa10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fa20 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
1fa30 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72  .** Transfer err
1fa40 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
1fa50 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f  from an sqlite3_
1fa60 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65  vtab.zErrMsg (te
1fa70 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
1fa80 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
1fa90 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
1faa0 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65  loc) into a Vdbe
1fab0 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
1fac0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
1fad0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1fae0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1faf0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
1fb00 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d  e3VtabImportErrm
1fb10 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69  sg(Vdbe *p, sqli
1fb20 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
1fb30 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1fb40 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74  = p->db;.  sqlit
1fb50 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
1fb60 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
1fb70 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
1fb80 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74  DbStrDup(db, pVt
1fb90 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
1fba0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
1fbb0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
1fbc0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
1fbd0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1fbe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1fbf0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a              UALTABLE */.