/ Hex Artifact Content
Login

Artifact 8e016c6051c013a394f8e8679be1ca60723707bd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   );.  return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
0420: 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  r the SQL string
0430: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 20   for a prepared 
0440: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
0450: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
0460: 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f  tSql(Vdbe *p, co
0470: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
0480: 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70 61 72   n, int isPrepar
0490: 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74 28 20  eV2){.  assert( 
04a0: 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31 20 7c  isPrepareV2==1 |
04b0: 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 30  | isPrepareV2==0
04c0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
04d0: 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64 65 66   return;.#if def
04e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
04f0: 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
0500: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
0510: 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66 28 20  E_SQLLOG).  if( 
0520: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0530: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0540: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0550: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0560: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0570: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0580: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0590: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
05a0: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
05b0: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
05c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
05f0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
0600: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
0610: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0620: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0630: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0640: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0650: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0660: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0670: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0680: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0690: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06a0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06b0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06c0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
06d0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
06e0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
06f0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
0700: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
0710: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0720: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0730: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0740: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0750: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0760: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0770: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0780: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0790: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
07a0: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
07b0: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
07c0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
07d0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
07e0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f  sPrepareV2;.}../
07f0: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0800: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0810: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
0820: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e  least nOp elemen
0830: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68  ts larger .** th
0840: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  an its current s
0850: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72  ize. nOp is guar
0860: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73  anteed to be les
0870: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
0880: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f  ** to 1024/sizeo
0890: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f(Op)..**.** If 
08a0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
08b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
08c0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
08d0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a   array, return.*
08e0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  * SQLITE_NOMEM. 
08f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62  In this case Vdb
0900: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e  e.aOp and Parse.
0910: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0920: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0930: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0940: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0950: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0960: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0970: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0980: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0990: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
09a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
09b0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
09c0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
09d0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
09e0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
09f0: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0a00: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0a10: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0a20: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0a30: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0a40: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0a50: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0a60: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0a70: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0a80: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0a90: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0aa0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
0ab0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0ac0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
0ad0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
0ae0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
0af0: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
0b00: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
0b10: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
0b20: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
0b30: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
0b40: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
0b50: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
0b60: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
0b70: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
0b80: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0b90: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
0ba0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
0bb0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
0bc0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
0bd0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
0be0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
0bf0: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
0c00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
0c10: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
0c20: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e   int nNew = (p->
0c30: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
0c40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0c50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0c60: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
0c70: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0c80: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? p->nOpAlloc*
0c90: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
0ca0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
0cb0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0cc0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
0cd0: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30  assert( nOp<=(10
0ce0: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29  24/sizeof(Op)) )
0cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
0d00: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e  >=(p->nOpAlloc+n
0d10: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op) );.  pNew = 
0d20: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0d30: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20  (p->db, v->aOp, 
0d40: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0d50: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0d60: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
0d70: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0d80: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65  cSize(p->db, pNe
0d90: 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20  w)/sizeof(Op);. 
0da0: 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77     v->aOp = pNew
0db0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
0dc0: 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  pNew ? SQLITE_OK
0dd0: 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   : SQLITE_NOMEM)
0de0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
0df0: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
0e00: 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74   routine is just
0e10: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
0e20: 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
0e30: 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c  akpoint that wil
0e40: 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20  l.** fire after 
0e50: 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69  each opcode is i
0e60: 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70  nserted and disp
0e70: 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22  layed using.** "
0e80: 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f  PRAGMA vdbe_addo
0e90: 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73  ptrace=on"..*/.s
0ea0: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
0eb0: 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74  addop_breakpoint
0ec0: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
0ed0: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b   int n = 0;.  n+
0ee0: 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  +;.}.#endif../*.
0ef0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73  ** Add a new ins
0f00: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
0f10: 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74  list of instruct
0f20: 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20  ions current in 
0f30: 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65  the.** VDBE.  Re
0f40: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
0f50: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
0f60: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50  ruction..**.** P
0f70: 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a  arameters:.**.**
0f80: 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20      p           
0f90: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74      Pointer to t
0fa0: 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20  he VDBE.**.**   
0fb0: 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20   op             
0fc0: 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   The opcode for 
0fd0: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
0fe0: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32  .**.**    p1, p2
0ff0: 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e  , p3      Operan
1000: 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  ds.**.** Use the
1010: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1020: 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74  lveLabel() funct
1030: 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64  ion to fix an ad
1040: 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65  dress and.** the
1050: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1060: 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20  geP4() function 
1070: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  to change the va
1080: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a  lue of the P4.**
1090: 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74   operand..*/.int
10a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10b0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
10c0: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
10d0: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69  p2, int p3){.  i
10e0: 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a  nt i;.  VdbeOp *
10f0: 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e  pOp;..  i = p->n
1100: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  Op;.  assert( p-
1110: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
1120: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
1130: 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c  ert( op>0 && op<
1140: 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d  0xff );.  if( p-
1150: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
1160: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20  c<=i ){.    if( 
1170: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31  growOpArray(p, 1
1180: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1190: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
11a0: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70   p->nOp++;.  pOp
11b0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
11c0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28   pOp->opcode = (
11d0: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35  u8)op;.  pOp->p5
11e0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
11f0: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
1200: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
1210: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
1220: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
1230: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
1240: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
1250: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
1260: 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e  COMMENTS.  pOp->
1270: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
1280: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1290: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
12a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
12b0: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
12c0: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ace ){.    int j
12d0: 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65  j, kk;.    Parse
12e0: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
12f0: 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a  arse;.    for(jj
1300: 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45  =kk=0; jj<SQLITE
1310: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b  _N_COLCACHE; jj+
1320: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1330: 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20   yColCache *x = 
1340: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1350: 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66  e + jj;.      if
1360: 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72  ( x->iLevel>pPar
1370: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
1380: 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20  || x->iReg==0 ) 
1390: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13a0: 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b  printf(" r[%d]={
13b0: 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67  %d:%d}", x->iReg
13c0: 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e  , x->iTable, x->
13d0: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
13e0: 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kk++;.    }.    
13f0: 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28  if( kk ) printf(
1400: 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  "\n");.    sqlit
1410: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1420: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
1430: 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f  .    test_addop_
1440: 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20  breakpoint();.  
1450: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1460: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70  VDBE_PROFILE.  p
1470: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  Op->cycles = 0;.
1480: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a    pOp->cnt = 0;.
1490: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
14a0: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
14b0: 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69  GE.  pOp->iSrcLi
14c0: 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ne = 0;.#endif. 
14d0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74   return i;.}.int
14e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f0: 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p0(Vdbe *p, int 
1500: 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  op){.  return sq
1510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1520: 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b  p, op, 0, 0, 0);
1530: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1540: 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70  beAddOp1(Vdbe *p
1550: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
1560: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1570: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1580: 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a   op, p1, 0, 0);.
1590: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
15a0: 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c  eAddOp2(Vdbe *p,
15b0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
15c0: 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75   int p2){.  retu
15d0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
15e0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
15f0: 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  p2, 0);.}.../*.*
1600: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1610: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1620: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1630: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1650: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
1660: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1670: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1680: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1690: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
16a0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
16b0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16d0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
16e0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
16f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1700: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1710: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1720: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1730: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1740: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
1750: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
1760: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1770: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
1780: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
1790: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
17a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
17b0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
17c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
17d0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
17e0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
17f0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1800: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
1810: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
1820: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
1830: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
1840: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
1850: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
1860: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
1870: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
1880: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
1890: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
18a0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
18b0: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
18c0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
18d0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
18e0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
18f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1900: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
1910: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
1920: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
1930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1940: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
1950: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
1960: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
1970: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
1980: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1990: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
19a0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
19b0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
19c0: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
19d0: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
19e0: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
19f0: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
1a00: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
1a10: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
1a20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
1a30: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
1a40: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
1a50: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
1a60: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1a70: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1a80: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1a90: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1aa0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1ab0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1ae0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1b00: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1b10: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1b20: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1b30: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b50: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1b60: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
1b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b80: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
1b90: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1ba0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1bc0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1bd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1be0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1bf0: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
1c00: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
1c10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1c20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1c30: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
1c40: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
1c50: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
1c60: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
1c70: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
1c80: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
1c90: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1ca0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1cb0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1cc0: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
1cd0: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
1ce0: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
1cf0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
1d00: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
1d10: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
1d20: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1d30: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1d40: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1d50: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1d60: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1d70: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1d80: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
1d90: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
1da0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
1db0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
1dc0: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
1dd0: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
1de0: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
1df0: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
1e00: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
1e10: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
1e20: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1e30: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1e40: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1e50: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1e60: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1e70: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1e80: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
1e90: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
1ea0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
1eb0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
1ec0: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
1ed0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
1ee0: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
1ef0: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
1f00: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1f10: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
1f20: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
1f30: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1f40: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1f50: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1f60: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
1fa0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
1fb0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
1fc0: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1fd0: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
1fe0: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
1ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
2000: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
2010: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
2020: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2030: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
2040: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
2050: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
2060: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
2070: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
2080: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
2090: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20a0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
20b0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
20c0: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
20d0: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
20e0: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
20f0: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
2100: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
2110: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2120: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
2130: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69  p->nLabel );.  i
2140: 66 28 20 41 4c 57 41 59 53 28 6a 3e 3d 30 29 20  f( ALWAYS(j>=0) 
2150: 26 26 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  && p->aLabel ){.
2160: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
2170: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20   = v->nOp;.  }. 
2180: 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76   p->iFixedOp = v
2190: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a  ->nOp - 1;.}../*
21a0: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
21b0: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
21c0: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
21d0: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
21e0: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
21f0: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
2200: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
2210: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 1;.}..#ifdef
2220: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
2230: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2240: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
2250: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
2260: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
2270: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
2280: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2290: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
22a0: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
22b0: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
22c0: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
22d0: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
22e0: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
22f0: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
2300: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
2310: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
2320: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2330: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
2340: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
2350: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
2360: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
2370: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
2380: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
23b0: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
23c0: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
23d0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
23e0: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
23f0: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
2400: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
2410: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
2420: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
2430: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
2440: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2450: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
2460: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
2470: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
2480: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
2490: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
24a0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
24b0: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
24c0: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
24d0: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
24e0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
24f0: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
2500: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
2510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2520: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2530: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
2540: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
2550: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2560: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
2570: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
2580: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
25b0: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
25c0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
25d0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
25e0: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
25f0: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
2600: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
2610: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
2620: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
2630: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
2640: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
2650: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
2660: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
2670: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
2680: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
2690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26a0: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
26b0: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
26c0: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
26d0: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
26e0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
26f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
2700: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
2710: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
2720: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
2730: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
2740: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
2750: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
2760: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
2770: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
2780: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
2790: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
27a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
27b0: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
27c0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
27d0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
27e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
27f0: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
2800: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
2810: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
2820: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
2830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2840: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
2850: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
2860: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
2870: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
2880: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
2890: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
28a0: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
28b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
28c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
28d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
28e0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
28f0: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
2900: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
2910: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2920: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
2930: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
2940: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
2950: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
2960: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
2970: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
2980: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
2990: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
29a0: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
29b0: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
29c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
29d0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
29e0: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
29f0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
2a00: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
2a10: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
2a20: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
2a30: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
2a40: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
2a50: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
2a60: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2a70: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
2a80: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
2a90: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
2aa0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2ab0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
2ac0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
2ad0: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
2ae0: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
2af0: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
2b00: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
2b10: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
2b20: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2b30: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
2b40: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b  **.** Then check
2b50: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
2b60: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72  of Parse.mayAbor
2b70: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a  t is true if an.
2b80: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20  ** ABORT may be 
2b90: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65  thrown, or false
2ba0: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75   otherwise. Retu
2bb0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  rn true if it do
2bc0: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20  es.** match, or 
2bd0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2be0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2bf0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
2c00: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74   used as.** part
2c10: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74   of an assert st
2c20: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63  atement in the c
2c30: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72  ompiler. Similar
2c40: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73   to:.**.**   ass
2c50: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
2c60: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70  AssertMayAbort(p
2c70: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
2c80: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20  arse->mayAbort) 
2c90: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
2ca0: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
2cb0: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ort(Vdbe *v, int
2cc0: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e   mayAbort){.  in
2cd0: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a  t hasAbort = 0;.
2ce0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62    Op *pOp;.  Vdb
2cf0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20  eOpIter sIter;. 
2d00: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
2d10: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
2d20: 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76  );.  sIter.v = v
2d30: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70  ;..  while( (pOp
2d40: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
2d50: 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20  Iter))!=0 ){.   
2d60: 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f   int opcode = pO
2d70: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69  p->opcode;.    i
2d80: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65  f( opcode==OP_De
2d90: 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d  stroy || opcode=
2da0: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
2db0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
2dc0: 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e .#ifndef SQLIT
2dd0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
2de0: 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f  EY.     || (opco
2df0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
2e00: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
2e10: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23  & pOp->p2==1) .#
2e20: 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28  endif.     || ((
2e30: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
2e40: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
2e50: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
2e60: 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78   && ((pOp->p1&0x
2e70: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
2e80: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
2e90: 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20  2==OE_Abort)).  
2ea0: 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62    ){.      hasAb
2eb0: 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ort = 1;.      b
2ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2ed0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2ee0: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
2ef0: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
2f00: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
2f10: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
2f20: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2f30: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
2f40: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
2f50: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
2f60: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
2f70: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
2f80: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
2f90: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2fa0: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
2fb0: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
2fc0: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
2fd0: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
2fe0: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
2ff0: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
3000: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
3010: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
3020: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
3030: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
3040: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
3050: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b  ort==mayAbort );
3060: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
3070: 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20  ITE_DEBUG - the 
3080: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
3090: 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e  Abort() function
30a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20   */../*.** Loop 
30b0: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
30c0: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
30d0: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
30e0: 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f  re negative.** o
30f0: 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  n jump instructi
3100: 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20  ons.  Each such 
3110: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
3120: 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a  .  Resolve the.*
3130: 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69  * label by setti
3140: 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ng the P2 value 
3150: 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e  to its correct n
3160: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  on-zero value..*
3170: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3180: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
3190: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
31a0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
31b0: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72  erted..**.** Var
31c0: 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41  iable *pMaxFuncA
31d0: 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  rgs is set to th
31e0: 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  e maximum value 
31f0: 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65  of any P2 argume
3200: 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f  nt .** to an OP_
3210: 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67  Function, OP_Agg
3220: 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74  Step or OP_VFilt
3230: 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20  er opcode. This 
3240: 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73  is used by .** s
3250: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
3260: 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68  ady() to size th
3270: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
3280: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rray..**.** The 
3290: 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c 64  Op.opflags field
32a0: 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20 6f   is set on all o
32b0: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  pcodes..*/.stati
32c0: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
32d0: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
32e0: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
32f0: 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  s){.  int i;.  i
3300: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
3310: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
3320: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
3330: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
3340: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
3350: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
3360: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
3370: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
3380: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f  Reader = 0;.  fo
3390: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
33a0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
33b0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
33c0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
33d0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f  ->opcode;..    /
33e0: 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20  * NOTE: Be sure 
33f0: 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f  to update mkopco
3400: 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64  deh.awk when add
3410: 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a  ing or removing.
3420: 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f      ** cases fro
3430: 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a  m this switch! *
3440: 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  /.    switch( op
3450: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  code ){.      ca
3460: 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a  se OP_Function:.
3470: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 67        case OP_Ag
3480: 67 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20 20  gStep: {.       
3490: 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61   if( pOp->p5>nMa
34a0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
34b0: 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20   = pOp->p5;.    
34c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
34d0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50   }.      case OP
34e0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a  _Transaction: {.
34f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
3500: 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64  >p2!=0 ) p->read
3510: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
3520: 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a    /* fall thru *
3530: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
3540: 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
3550: 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  it:.      case O
3560: 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20  P_Savepoint: {. 
3570: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61         p->bIsRea
3580: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
3590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
35a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35b0: 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63 61  MIT_WAL.      ca
35c0: 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  se OP_Checkpoint
35d0: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  :.#endif.      c
35e0: 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20  ase OP_Vacuum:. 
35f0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75       case OP_Jou
3600: 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20  rnalMode: {.    
3610: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
3620: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
3630: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
3640: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3650: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
3660: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
3670: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61 73  LTABLE.      cas
3680: 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a  e OP_VUpdate: {.
3690: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
36a0: 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p2>nMaxArgs ) n
36b0: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
36c0: 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  2;.        break
36d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36e0: 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a  case OP_VFilter:
36f0: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e   {.        int n
3700: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3710: 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20  ( p->nOp - i >= 
3720: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  3 );.        ass
3730: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
3740: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
3750: 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 70  );.        n = p
3760: 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20  Op[-1].p1;.     
3770: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
3780: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
3790: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
37a0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
37b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
37c0: 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  xt:.      case O
37d0: 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20  P_NextIfOpen:.  
37e0: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
37f0: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  erNext: {.      
3800: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
3810: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
3820: 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70  eNext;.        p
3830: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3840: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
3850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3860: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
3870: 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ev:.      case O
3880: 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a  P_PrevIfOpen: {.
3890: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
38a0: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
38b0: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
38c0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
38d0: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43  type = P4_ADVANC
38e0: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
38f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3900: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67  .    pOp->opflag
3910: 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  s = sqlite3Opcod
3920: 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65  eProperty[opcode
3930: 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d  ];.    if( (pOp-
3940: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
3950: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70  _JUMP)!=0 && pOp
3960: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->p2<0 ){.      
3970: 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e  assert( -1-pOp->
3980: 70 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  p2<pParse->nLabe
3990: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
39a0: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
39b0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
39c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
39d0: 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65  ee(p->db, pParse
39e0: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61  ->aLabel);.  pPa
39f0: 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b  rse->aLabel = 0;
3a00: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  .  pParse->nLabe
3a10: 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75  l = 0;.  *pMaxFu
3a20: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
3a30: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  s;.  assert( p->
3a40: 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20  bIsReader!=0 || 
3a50: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
3a60: 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d  >btreeMask) );.}
3a70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3a80: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
3a90: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
3aa0: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
3ab0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
3ac0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3ad0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
3ae0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
3af0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
3b00: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
3b10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
3b20: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
3b30: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
3b40: 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f  he array of opco
3b50: 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  des associated w
3b60: 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  ith.** the Vdbe 
3b70: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
3b80: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74  rst argument. It
3b90: 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
3ba0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a  responsibility.*
3bb0: 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72  * to arrange for
3bc0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72   the returned ar
3bd0: 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75  ray to be eventu
3be0: 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
3bf0: 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65   the .** vdbeFre
3c00: 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74  eOpArray() funct
3c10: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ion..**.** Befor
3c20: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e  e returning, *pn
3c30: 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Op is set to the
3c40: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
3c50: 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  es in the return
3c60: 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73  ed.** array. Als
3c70: 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20  o, *pnMaxArg is 
3c80: 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65  set to the large
3c90: 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74  r of its current
3ca0: 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74   value and .** t
3cb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
3cc0: 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65  ries in the Vdbe
3cd0: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72  .apArg[] array r
3ce0: 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75  equired to execu
3cf0: 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  te the .** retur
3d00: 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ned program..*/.
3d10: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
3d20: 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56  dbeTakeOpArray(V
3d30: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f  dbe *p, int *pnO
3d40: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67  p, int *pnMaxArg
3d50: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  ){.  VdbeOp *aOp
3d60: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73   = p->aOp;.  ass
3d70: 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e  ert( aOp && !p->
3d80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3d90: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
3da0: 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65  that sqlite3Vdbe
3db0: 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20  UsesBtree() was 
3dc0: 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  not called on th
3dd0: 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72  is VM */.  asser
3de0: 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  t( DbMaskAllZero
3df0: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29  (p->btreeMask) )
3e00: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
3e10: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
3e20: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
3e30: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
3e40: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
3e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
3e60: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
3e70: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
3e80: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
3e90: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
3ea0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
3eb0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
3ec0: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
3ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3ee0: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
3ef0: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
3f00: 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74 20 69  onst *aOp, int i
3f10: 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74 20 61  Lineno){.  int a
3f20: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
3f30: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3f40: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
3f50: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
3f60: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
3f70: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
3f80: 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20  ray(p, nOp) ){. 
3f90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3fa0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
3fb0: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e  ;.  if( ALWAYS(n
3fc0: 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  Op>0) ){.    int
3fd0: 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69   i;.    VdbeOpLi
3fe0: 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20  st const *pIn = 
3ff0: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
4000: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49  ; i<nOp; i++, pI
4010: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n++){.      int 
4020: 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20  p2 = pIn->p2;.  
4030: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74      VdbeOp *pOut
4040: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64   = &p->aOp[i+add
4050: 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  r];.      pOut->
4060: 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70  opcode = pIn->op
4070: 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74  code;.      pOut
4080: 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a  ->p1 = pIn->p1;.
4090: 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 29        if( p2<0 )
40a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
40b0: 28 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50  ( sqlite3OpcodeP
40c0: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
40d0: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
40e0: 4d 50 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  MP );.        pO
40f0: 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20  ut->p2 = addr + 
4100: 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20  ADDR(p2);.      
4110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
4120: 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  Out->p2 = p2;.  
4130: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74      }.      pOut
4140: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a  ->p3 = pIn->p3;.
4150: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79        pOut->p4ty
4160: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
4170: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  .      pOut->p4.
4180: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75  p = 0;.      pOu
4190: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
41a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
41b0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
41c0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  .      pOut->zCo
41d0: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  mment = 0;.#endi
41e0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
41f0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
4200: 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69      pOut->iSrcLi
4210: 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a  ne = iLineno+i;.
4220: 23 65 6c 73 65 0a 20 20 20 20 20 20 28 76 6f 69  #else.      (voi
4230: 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69  d)iLineno;.#endi
4240: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
4250: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
4260: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
4270: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
4280: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
4290: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
42a0: 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70  Op(0, i+addr, &p
42b0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a  ->aOp[i+addr]);.
42c0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
42d0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20     }.    p->nOp 
42e0: 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65  += nOp;.  }.  re
42f0: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
4300: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
4310: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f  alue of the P1 o
4320: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
4330: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
4340: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
4350: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
4360: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
4370: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
4380: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
4390: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
43a0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
43b0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
43c0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
43d0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
43e0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
43f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4400: 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33  geP1(Vdbe *p, u3
4410: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
4420: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4430: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4440: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4450: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4460: 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p1 = val;.  }.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4480: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4490: 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P2 operand for a
44a0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
44b0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
44c0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
44d0: 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a   for setting a j
44e0: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e  ump destination.
44f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4500: 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62  VdbeChangeP2(Vdb
4510: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
4520: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
4530: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
4540: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
4550: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4560: 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61  Op[addr].p2 = va
4570: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4580: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4590: 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61   of the P3 opera
45a0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
45b0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
45c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
45d0: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
45e0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
45f0: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
4600: 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( p!=0 );.  if( 
4610: 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64  ((u32)p->nOp)>ad
4620: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
4630: 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b  [addr].p3 = val;
4640: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
4650: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
4660: 66 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64  f the P5 operand
4670: 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65   for the most re
4680: 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20  cently.** added 
4690: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  operation..*/.vo
46a0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
46b0: 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20  angeP5(Vdbe *p, 
46c0: 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  u8 val){.  asser
46d0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( p!=0 );.  if(
46e0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61   p->aOp ){.    a
46f0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
4700: 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d  );.    p->aOp[p-
4710: 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c  >nOp-1].p5 = val
4720: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
4730: 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65  hange the P2 ope
4740: 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74  rand of instruct
4750: 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74  ion addr so that
4760: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
4770: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
4780: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
4790: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64  tion to be coded
47a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
47b0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64  3VdbeJumpHere(Vd
47c0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
47d0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  {.  sqlite3VdbeC
47e0: 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c  hangeP2(p, addr,
47f0: 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 70 2d 3e 70   p->nOp);.  p->p
4800: 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 20  Parse->iFixedOp 
4810: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a  = p->nOp - 1;.}.
4820: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
4830: 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72  nput FuncDef str
4840: 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65  ucture is epheme
4850: 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69  ral, then free i
4860: 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75  t.  If.** the Fu
4870: 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68  ncDef is not eph
4880: 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e  ermal, then do n
4890: 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  othing..*/.stati
48a0: 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d  c void freeEphem
48b0: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c  eralFunction(sql
48c0: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
48d0: 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20  f *pDef){.  if( 
48e0: 41 4c 57 41 59 53 28 70 44 65 66 29 20 26 26 20  ALWAYS(pDef) && 
48f0: 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
4900: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
4910: 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20  PHEM)!=0 ){.    
4920: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4930: 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a  , pDef);.  }.}..
4940: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
4950: 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69  FreeOpArray(sqli
4960: 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74  te3 *, Op *, int
4970: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  );../*.** Delete
4980: 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e   a P4 value if n
4990: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
49a0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28  tic void freeP4(
49b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
49c0: 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p4type, void *p
49d0: 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a  4){.  if( p4 ){.
49e0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29      assert( db )
49f0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34  ;.    switch( p4
4a00: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
4a10: 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20  se P4_REAL:.    
4a20: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
4a30: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44  .      case P4_D
4a40: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61  YNAMIC:.      ca
4a50: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
4a60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4a70: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
4a80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4aa0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
4ab0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
4ac0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4ad0: 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   ) sqlite3KeyInf
4ae0: 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a  oUnref((KeyInfo*
4af0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
4b00: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4b10: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
4b20: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  TF: {.        if
4b30: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4b40: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ed==0 ) sqlite3_
4b50: 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20  free(p4);.      
4b60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4b70: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46  .      case P4_F
4b80: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
4b90: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46    freeEphemeralF
4ba0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e  unction(db, (Fun
4bb0: 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20  cDef*)p4);.     
4bc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4bd0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
4be0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  MEM: {.        i
4bf0: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
4c00: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eed==0 ){.      
4c10: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
4c20: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
4c30: 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  lue*)p4);.      
4c40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4c50: 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d     Mem *p = (Mem
4c60: 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20  *)p4;.          
4c70: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
4c80: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
4c90: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
4ca0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4cb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
4cc0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4cd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4ce0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
4cf0: 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 20  VTAB : {.       
4d00: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4d10: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4d20: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54  e3VtabUnlock((VT
4d30: 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20  able *)p4);.    
4d40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4d50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
4d60: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73  /*.** Free the s
4d70: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
4d80: 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70  or aOp and any p
4d90: 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74  4 values allocat
4da0: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70  ed for the.** op
4db0: 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  codes contained 
4dc0: 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69  within. If aOp i
4dd0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73  s not NULL it is
4de0: 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
4df0: 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72  ain .** nOp entr
4e00: 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ies. .*/.static 
4e10: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
4e20: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
4e30: 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e  , Op *aOp, int n
4e40: 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29  Op){.  if( aOp )
4e50: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  {.    Op *pOp;. 
4e60: 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20     for(pOp=aOp; 
4e70: 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70  pOp<&aOp[nOp]; p
4e80: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
4e90: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
4ea0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
4eb0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4ec0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
4ed0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c  MMENTS.      sql
4ee0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4ef0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
4f00: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
4f10: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4f20: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
4f30: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
4f40: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
4f50: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
4f60: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
4f70: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
4f80: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
4f90: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
4fa0: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
4fb0: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
4fc0: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
4fd0: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
4fe0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
4ff0: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
5000: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
5010: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
5020: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
5030: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
5040: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
5050: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
5060: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
5070: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
5080: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
5090: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76  nto OP_Noop.*/.v
50a0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
50b0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
50c0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
50d0: 20 20 69 66 28 20 61 64 64 72 3c 70 2d 3e 6e 4f    if( addr<p->nO
50e0: 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20  p ){.    VdbeOp 
50f0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61  *pOp = &p->aOp[a
5100: 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  ddr];.    sqlite
5110: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
5120: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
5130: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
5140: 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d 73 65  p4.p);.    memse
5150: 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pOp, 0, sizeof
5160: 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 70  (pOp[0]));.    p
5170: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
5180: 4e 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 61 64  Noop;.    if( ad
5190: 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 20 29 20 70  dr==p->nOp-1 ) p
51a0: 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a  ->nOp--;.  }.}..
51b0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73  /*.** If the las
51c0: 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22  t opcode is "op"
51d0: 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61   and it is not a
51e0: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
51f0: 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  n,.** then remov
5200: 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72  e it.  Return tr
5210: 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ue if and only i
5220: 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20  f an opcode was 
5230: 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
5240: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
5250: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62  ePriorOpcode(Vdb
5260: 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20  e *p, u8 op){.  
5270: 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28  if( (p->nOp-1)>(
5280: 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65  p->pParse->iFixe
5290: 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b 70  dOp) && p->aOp[p
52a0: 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d  ->nOp-1].opcode=
52b0: 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  =op ){.    sqlit
52c0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
52d0: 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b  op(p, p->nOp-1);
52e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
52f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
5300: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
5310: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
5320: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70  lue of the P4 op
5330: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
5340: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
5350: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
5360: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
5370: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
5380: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
5390: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
53a0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
53b0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
53c0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
53d0: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
53e0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
53f0: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
5400: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
5410: 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  4 operand is dyn
5420: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
5430: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
5440: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
5450: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
5460: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5470: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
5480: 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d  * A value of n==
5490: 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74  0 means copy byt
54a0: 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20  es of zP4 up to 
54b0: 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  and including th
54c0: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20  e.** first null 
54d0: 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68  byte.  If n>0 th
54e0: 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65  en copy n+1 byte
54f0: 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a  s of zP4..** .**
5500: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
5510: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
5520: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
5530: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
5540: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
5550: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
5560: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
5570: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
5580: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
5590: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
55a0: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
55b0: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
55c0: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
55d0: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
55e0: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
55f0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5600: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
5610: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
5620: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5630: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
5640: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
5650: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
5660: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
5670: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
5680: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
5690: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
56a0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
56b0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
56c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d  ;.  if( p->aOp==
56d0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
56e0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ailed ){.    if(
56f0: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n!=P4_VTAB ){. 
5700: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
5710: 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72  n, (void*)*(char
5720: 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a  **)&zP4);.    }.
5730: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
5740: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5750: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
5760: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
5770: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
5780: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
5790: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20   - 1;.  }.  pOp 
57a0: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
57b0: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e  .  assert( pOp->
57c0: 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53  p4type==P4_NOTUS
57d0: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  ED.       || pOp
57e0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54  ->p4type==P4_INT
57f0: 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f 70  32.       || pOp
5800: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59  ->p4type==P4_KEY
5810: 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65 50 34  INFO );.  freeP4
5820: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
5830: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
5840: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
5850: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
5860: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
5870: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
5880: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
5890: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
58a0: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
58b0: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
58c0: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
58d0: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
58e0: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
58f0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
5900: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5910: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
5920: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
5930: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5940: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
5950: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
5960: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
5970: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
5980: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5990: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
59a0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
59b0: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65  P4_KEYINFO;.  }e
59c0: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54  lse if( n==P4_VT
59d0: 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  AB ){.    pOp->p
59e0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
59f0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5a00: 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20  e = P4_VTAB;.   
5a10: 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b   sqlite3VtabLock
5a20: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b  ((VTable *)zP4);
5a30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 56  .    assert( ((V
5a40: 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62  Table *)zP4)->db
5a50: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c  ==p->db );.  }el
5a60: 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  se if( n<0 ){.  
5a70: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5a80: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5a90: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67  p->p4type = (sig
5aa0: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65  ned char)n;.  }e
5ab0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  lse{.    if( n==
5ac0: 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  0 ) n = sqlite3S
5ad0: 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20  trlen30(zP4);.  
5ae0: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71    pOp->p4.z = sq
5af0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
5b00: 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  ->db, zP4, n);. 
5b10: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5b20: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d   P4_DYNAMIC;.  }
5b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
5b40: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
5b50: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
5b60: 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65  opcode to the Ke
5b70: 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a  yInfo for the.**
5b80: 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f   index given..*/
5b90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5ba0: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61  eSetP4KeyInfo(Pa
5bb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
5bc0: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62  ex *pIdx){.  Vdb
5bd0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
5be0: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
5bf0: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
5c00: 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 73  ( pIdx!=0 );.  s
5c10: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5c20: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
5c30: 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f  )sqlite3KeyInfoO
5c40: 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
5c50: 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Idx),.          
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
5c70: 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64  EYINFO);.}..#ifd
5c80: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5c90: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
5ca0: 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  S./*.** Change t
5cb0: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
5cc0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
5cd0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
5ce0: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
5cf0: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
5d00: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
5d10: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
5d20: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
5d30: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
5d40: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
5d50: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
5d60: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
5d70: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
5d80: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
5d90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
5da0: 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  beVComment(Vdbe 
5db0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5dc0: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
5dd0: 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   ap){.  assert( 
5de0: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
5df0: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
5e00: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
5e10: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5e20: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
5e30: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5e40: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
5e50: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nOp ){.    asser
5e60: 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  t( p->aOp );.   
5e70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
5e80: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ->db, p->aOp[p->
5e90: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29  nOp-1].zComment)
5ea0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
5eb0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20  nOp-1].zComment 
5ec0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
5ed0: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
5ee0: 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  , ap);.  }.}.voi
5ef0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
5f00: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
5f10: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
5f20: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
5f30: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
5f40: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
5f50: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
5f60: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
5f70: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
5f80: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
5f90: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
5fa0: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
5fb0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
5fc0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
5fd0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
5fe0: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
5ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6000: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
6010: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
6020: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
6030: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
6040: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
6050: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
6060: 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e  }.}.#endif  /* N
6070: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
6080: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
6090: 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ERAGE./*.** Set 
60a0: 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65  the value if the
60b0: 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20   iSrcLine field 
60c0: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
60d0: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
60e0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
60f0: 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65  lite3VdbeSetLine
6100: 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20  Number(Vdbe *v, 
6110: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71  int iLine){.  sq
6120: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
6130: 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  ,-1)->iSrcLine =
6140: 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66   iLine;.}.#endif
6150: 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f   /* SQLITE_VDBE_
6160: 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a  COVERAGE */../*.
6170: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
6180: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
6190: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
61a0: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
61b0: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
61c0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
61d0: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
61e0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
61f0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
6200: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
6210: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
6220: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
6230: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
6240: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
6250: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
6260: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
6270: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
6280: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
6290: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
62a0: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
62b0: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
62c0: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
62d0: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
62e0: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
62f0: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
6300: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
6310: 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  fter an OOM faul
6320: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
6330: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
6340: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
6350: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
6360: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
6370: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
6380: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
6390: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
63a0: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
63b0: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
63c0: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
63d0: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
63e0: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
63f0: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
6400: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
6410: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
6420: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
6430: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
6440: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
6450: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
6460: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
6470: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
6480: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
6490: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
64a0: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
64b0: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
64c0: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
64d0: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
64e0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
64f0: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
6500: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
6510: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
6520: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
6530: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
6540: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
6550: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
6560: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
6570: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
6580: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
6590: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
65a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
65b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
65c0: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
65d0: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
65e0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
65f0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
6600: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
6610: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
6620: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
6630: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
6640: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
6650: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
6660: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
6670: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
6680: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
6690: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
66a0: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
66b0: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
66c0: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
66d0: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
66e0: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
66f0: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
6700: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
6710: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
6720: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
6730: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
6740: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
6750: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
6760: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
6770: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
6780: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
6790: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
67a0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
67b0: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
67c0: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
67d0: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
67e0: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
67f0: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
6800: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
6810: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
6820: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
6830: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
6840: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
6850: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
6860: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
6870: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
6880: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
6890: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
68a0: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
68b0: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
68c0: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
68d0: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
68e0: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
68f0: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
6900: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
6910: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
6920: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
6930: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
6940: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
6950: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
6960: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
6970: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
6980: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
6990: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
69a0: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
69b0: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
69c0: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
69d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
69e0: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
69f0: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
6a00: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
6a10: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
6a20: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
6a30: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
6a40: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
6a50: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
6a60: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
6a70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
6a80: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
6a90: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
6aa0: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
6ab0: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
6ac0: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
6ad0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
6ae0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
6af0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
6b00: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
6b10: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
6b20: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
6b30: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
6b40: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
6b50: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
6b60: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
6b70: 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e + 1;.    for(i
6b80: 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70  i=jj=0; jj<nTemp
6b90: 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f  -1 && (c = zSyno
6ba0: 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69  psis[ii])!=0; ii
6bb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  ++){.      if( c
6bc0: 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20  =='P' ){.       
6bd0: 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b   c = zSynopsis[+
6be0: 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii];.        if
6bf0: 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20  ( c=='4' ){.    
6c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6c10: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
6c20: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
6c30: 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d   zP4);.        }
6c40: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20  else if( c=='X' 
6c50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6c60: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6c70: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6c80: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
6c90: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  mment);.        
6ca0: 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20    seenCom = 1;. 
6cb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6cc0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d          int v1 =
6cd0: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70   translateP(c, p
6ce0: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Op);.          i
6cf0: 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20  nt v2;.         
6d00: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6d10: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
6d20: 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b  p+jj, "%d", v1);
6d30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
6d40: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
6d50: 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d  +ii+1, "@P", 2)=
6d60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6d70: 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20    ii += 3;.     
6d80: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
6d90: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
6da0: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20  mp+jj);.        
6db0: 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61      v2 = transla
6dc0: 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69  teP(zSynopsis[ii
6dd0: 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  ], pOp);.       
6de0: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
6df0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
6e00: 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "+1",2)==0 ){.  
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
6e20: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
6e30: 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20     v2++;.       
6e40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6e50: 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20     if( v2>1 ){. 
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
6e70: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6e80: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6e90: 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d  , "..%d", v1+v2-
6ea0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
6eb0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
6ec0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
6ed0: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e  ynopsis+ii+1, ".
6ee0: 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70  .P3", 4)==0 && p
6ef0: 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20  Op->p3==0 ){.   
6f00: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34           ii += 4
6f10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6f30: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
6f40: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
6f50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6f60: 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b        zTemp[jj++
6f70: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = c;.      }. 
6f80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
6f90: 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d  enCom && jj<nTem
6fa0: 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d  p-5 && pOp->zCom
6fb0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ment ){.      sq
6fc0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6fd0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
6fe0: 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e  j, "; %s", pOp->
6ff0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
7000: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
7010: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
7020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7030: 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70  jj<nTemp ) zTemp
7040: 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  [jj] = 0;.  }els
7050: 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e if( pOp->zComm
7060: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
7070: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7080: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20  p, zTemp, "%s", 
7090: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
70a0: 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33      jj = sqlite3
70b0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
70c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
70d0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
70e0: 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  jj = 0;.  }.  re
70f0: 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69  turn jj;.}.#endi
7100: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
7110: 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65 66 69  G */...#if !defi
7120: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7130: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
7140: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
7150: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
7160: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
7170: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
7180: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
7190: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
71a0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
71b0: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
71c0: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
71d0: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
71e0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
71f0: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
7200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
7210: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
7220: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
7230: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
7240: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
7250: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
7260: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
7270: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
7280: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
7290: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
72a0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
72b0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
72c0: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
72d0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
72e0: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
72f0: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
7300: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7310: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7320: 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79  mp, "k(%d", pKey
7330: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
7340: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33       i = sqlite3
7350: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
7360: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
7370: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
7380: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
7390: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
73a0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
73b0: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
73c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
73d0: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
73e0: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b  ->zName : "nil";
73f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
7400: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7410: 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  (zColl);.       
7420: 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d   if( n==6 && mem
7430: 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52  cmp(zColl,"BINAR
7440: 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Y",6)==0 ){.    
7450: 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42        zColl = "B
7460: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  ";.          n =
7470: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7480: 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54        if( i+n>nT
7490: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
74a0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
74b0: 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20  [i],",...",4);. 
74c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
74d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
74e0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
74f0: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ,';.        if( 
7500: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
7510: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
7520: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
7530: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d  = '-';.        }
7540: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
7550: 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c  &zTemp[i], zColl
7560: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , n+1);.        
7570: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  i += n;.      }.
7580: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
7590: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
75a0: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
75b0: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
75c0: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
75d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
75e0: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
75f0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
7600: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
7610: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
7620: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7630: 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30  p, zTemp, "(%.20
7640: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
7650: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
7660: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7670: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
7680: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
7690: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
76a0: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
76b0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
76c0: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
76d0: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
76e0: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
76f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7700: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
7710: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7720: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7730: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
7740: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
7750: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7760: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7770: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
7780: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7790: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
77a0: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
77b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
77c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
77d0: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
77e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
77f0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
7800: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
7810: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
7820: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7830: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
7840: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
7850: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
7860: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
7870: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
7880: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
7890: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
78a0: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
78b0: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
78c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
78d0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
78e0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
78f0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
7900: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
7910: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
7920: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7930: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7940: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
7950: 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a  g", pMem->u.r);.
7960: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7970: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
7980: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  M_Null ){.      
7990: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
79a0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
79b0: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20   "NULL");.      
79c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
79d0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
79e0: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
79f0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
7a00: 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d  (blob)";.      }
7a10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7a20: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
7a30: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7a40: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34  ABLE.    case P4
7a50: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
7a60: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
7a70: 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
7a80: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
7a90: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7aa0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7ab0: 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56  "vtab:%p:%p", pV
7ac0: 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64  tab, pVtab->pMod
7ad0: 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ule);.      brea
7ae0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
7af0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
7b00: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
7b10: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7b20: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e  Temp, zTemp, "in
7b30: 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20  tarray");.      
7b40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7b50: 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47   case P4_SUBPROG
7b60: 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAM: {.      sql
7b70: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7b80: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f  emp, zTemp, "pro
7b90: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
7ba0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7bb0: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
7bc0: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
7bd0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
7be0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
7bf0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
7c00: 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  4 = pOp->p4.z;. 
7c10: 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20       if( zP4==0 
7c20: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
7c30: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   zTemp;.        
7c40: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
7c50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7c60: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
7c70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
7c80: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
7c90: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
7ca0: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
7cb0: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
7cc0: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
7cd0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65  d..**.** The pre
7ce0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
7cf0: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e   need to know in
7d00: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d   advance the com
7d10: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20  plete set of.** 
7d20: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
7d30: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
7d40: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20  use.  A mask of 
7d50: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a  these databases.
7d60: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ** is maintained
7d70: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
7d80: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61  .  The p->lockMa
7d90: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  sk value is the 
7da0: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e  subset of.** p->
7db0: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74  btreeMask of dat
7dc0: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
7dd0: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e   require a lock.
7de0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7df0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
7e00: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
7e10: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
7e20: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
7e30: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
7e40: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
7e50: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
7e60: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
7e70: 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b  k)*8 );.  DbMask
7e80: 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  Set(p->btreeMask
7e90: 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31  , i);.  if( i!=1
7ea0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
7eb0: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
7ec0: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
7ed0: 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e     DbMaskSet(p->
7ee0: 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  lockMask, i);.  
7ef0: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
7f00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
7f10: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
7f20: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
7f30: 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  >0./*.** If SQLi
7f40: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
7f50: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
7f60: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
7f70: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
7f80: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
7f90: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
7fa0: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
7fb0: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
7fc0: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
7fd0: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
7fe0: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
7ff0: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
8000: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
8010: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
8020: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
8030: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
8040: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
8050: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
8060: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
8070: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
8080: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
8090: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
80a0: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
80b0: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
80c0: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
80d0: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
80e0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
80f0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
8100: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
8110: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
8120: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
8130: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
8140: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
8150: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
8160: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
8170: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
8180: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
8190: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
81a0: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
81b0: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
81c0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
81d0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
81e0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
81f0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
8200: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
8210: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
8220: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
8230: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
8240: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
8250: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
8260: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
8270: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
8280: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
8290: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
82a0: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
82b0: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
82c0: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
82d0: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
82e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
82f0: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
8300: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
8310: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
8320: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
8330: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
8340: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
8350: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
8360: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
8370: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
8380: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
8390: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
83a0: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
83b0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
83c0: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
83d0: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
83e0: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
83f0: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
8400: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
8410: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
8420: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
8430: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
8440: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
8450: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8460: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
8470: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
8480: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
8490: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
84a0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
84b0: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
84c0: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
84d0: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
84e0: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
84f0: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
8500: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8510: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
8520: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8530: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
8540: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
8550: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
8560: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
8570: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
8580: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
8590: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
85a0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
85b0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
85c0: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
85d0: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
85e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
85f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8600: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
8610: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
8620: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
8630: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
8640: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8650: 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74  Leave(aDb[i].pBt
8660: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
8670: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
8680: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
8690: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
86a0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
86b0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
86c0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
86d0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
86e0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
86f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8700: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
8710: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
8720: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
8730: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
8740: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a  tr[50];.  char z
8750: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74  Com[100];.  stat
8760: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
8770: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
8780: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
8790: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e   %-13s %.2X %s\n
87a0: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
87b0: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
87c0: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
87d0: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
87e0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69  izeof(zPtr));.#i
87f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8800: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
8810: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d  NTS.  displayCom
8820: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a  ment(pOp, zP4, z
8830: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d  Com, sizeof(zCom
8840: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d  ));.#else.  zCom
8850: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
8860: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
8870: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
8880: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
8890: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
88a0: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
88b0: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
88c0: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
88d0: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
88e0: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
88f0: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
8900: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
8910: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
8920: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
8930: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
8940: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
8950: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
8960: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
8970: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
8980: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
8990: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
89a0: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
89b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
89c0: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
89d0: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
89e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
89f0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
8a00: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
8a10: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
8a20: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20      Mem *pEnd = 
8a30: 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74  &p[N];.    sqlit
8a40: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
8a50: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
8a60: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
8a70: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
8a80: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
8a90: 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  d ){.      do{. 
8aa0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a         if( p->sz
8ab0: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
8ac0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
8ad0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77  alloc);.      }w
8ae0: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
8af0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
8b00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
8b10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
8b20: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
8b30: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
8b40: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8b50: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
8b60: 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70  kMemInvariants(p
8b70: 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ) );..      /* T
8b80: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
8b90: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
8ba0: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
8bb0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
8bc0: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
8bd0: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
8be0: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
8bf0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
8c00: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
8c10: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
8c20: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
8c30: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
8c40: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
8c50: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
8c60: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
8c70: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
8c80: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
8c90: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
8ca0: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
8cb0: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
8cc0: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
8cd0: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
8ce0: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
8cf0: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
8d00: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
8d10: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
8d20: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
8d30: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
8d40: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
8d50: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
8d60: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
8d70: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
8d80: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
8d90: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
8da0: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
8db0: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
8dc0: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
8dd0: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
8de0: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
8df0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
8e00: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
8e10: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
8e20: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
8e30: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
8e40: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
8e50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
8e60: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67  >flags & MEM_Agg
8e70: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8e80: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
8e90: 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20  EM_Dyn );.      
8ea0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
8eb0: 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29  gs & MEM_Frame )
8ec0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8ed0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
8ee0: 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20  _RowSet );.     
8ef0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
8f00: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d  EM_Agg|MEM_Dyn|M
8f10: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77  EM_Frame|MEM_Row
8f20: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Set) ){.        
8f30: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
8f40: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
8f50: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d  }else if( p->szM
8f60: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
8f70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8f80: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
8f90: 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c          p->szMal
8fa0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  loc = 0;.      }
8fb0: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ..      p->flags
8fc0: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
8fd0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b  ;.    }while( (+
8fe0: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
8ff0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9000: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
9010: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
9020: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
9030: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
9040: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
9050: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
9060: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
9070: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
9080: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
9090: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
90a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
90b0: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
90c0: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
90d0: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
90e0: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
90f0: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
9100: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
9110: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
9120: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
9130: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
9140: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
9150: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
9160: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
9170: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
9180: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
9190: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
91a0: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
91b0: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
91c0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
91d0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
91e0: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
91f0: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
9200: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
9210: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
9220: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
9230: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
9240: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
9250: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
9260: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
9270: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
9280: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
9290: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
92a0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
92b0: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
92c0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
92d0: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
92e0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
92f0: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
9300: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
9310: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
9320: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
9330: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
9340: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
9350: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
9360: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
9370: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
9380: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
9390: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
93a0: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
93b0: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a  UERY PLAN..**.**
93c0: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
93d0: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
93e0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
93f0: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
9400: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
9410: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
9420: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
9430: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
9440: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
9450: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
9460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9470: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
9480: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94a0: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
94b0: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
94c0: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
94d0: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
9500: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
9510: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
9520: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9540: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
9550: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
9560: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9580: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
9590: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
95a0: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
95b0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
95d0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
95e0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
95f0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9620: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
9630: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9650: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
9660: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
9670: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
9680: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
9690: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
96a0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
96b0: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
96c0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
96d0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
96e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
96f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
9700: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
9710: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
9720: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
9730: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
9740: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
9750: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
9760: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
9770: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
9780: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
9790: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
97a0: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
97b0: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
97c0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
97d0: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
97e0: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
97f0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
9800: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
9810: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
9820: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
9830: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9840: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
9850: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
9860: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
9870: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
9880: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
9890: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
98a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
98b0: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
98c0: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
98d0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
98e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
98f0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
9900: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
9910: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
9920: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
9930: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
9940: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
9950: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
9960: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
9970: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
9980: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
9990: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
99a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
99b0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
99c0: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
99d0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
99e0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
99f0: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
9a00: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
9a10: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
9a20: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
9a30: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
9a40: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
9a50: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
9a60: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
9a70: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
9a80: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
9a90: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
9aa0: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
9ab0: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
9ac0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
9ad0: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
9ae0: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
9af0: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
9b00: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
9b10: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
9b20: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
9b30: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
9b40: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
9b50: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
9b60: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
9b70: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
9b80: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
9b90: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
9ba0: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
9bb0: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
9bc0: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
9bd0: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
9be0: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
9bf0: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
9c00: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
9c10: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
9c20: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
9c30: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
9c40: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
9c50: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
9c60: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
9c70: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
9c80: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
9c90: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
9ca0: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
9cb0: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
9cc0: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
9cd0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
9ce0: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
9cf0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
9d00: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
9d10: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
9d20: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
9d30: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
9d40: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
9d50: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
9d60: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
9d70: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
9d80: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
9d90: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
9da0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
9db0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
9dc0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
9dd0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
9de0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
9df0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
9e00: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
9e10: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
9e20: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
9e30: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
9e40: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
9e50: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
9e60: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
9e70: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
9e80: 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  zP4;.    Op *pOp
9e90: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  ;.    if( i<p->n
9ea0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
9eb0: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
9ec0: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
9ed0: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
9ee0: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
9ef0: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
9f00: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
9f10: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
9f20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9f30: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
9f40: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
9f50: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
9f60: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
9f70: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
9f80: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
9f90: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
9fa0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
9fb0: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
9fc0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
9fd0: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
9fe0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
9ff0: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
a000: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
a010: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
a020: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
a030: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
a040: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
a050: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a060: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
a070: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
a0a0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
a0b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
a0c0: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
a0d0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
a0e0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
a0f0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  m;.      pMem->z
a100: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
a110: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
a120: 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63  >opcode); /* Opc
a130: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ode */.      ass
a140: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
a150: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
a160: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a170: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
a180: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
a190: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
a1a0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
a1b0: 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50   /* When an OP_P
a1c0: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73  rogram opcode is
a1d0: 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20   encounter (the 
a1e0: 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74  only opcode that
a1f0: 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20   has.      ** a 
a200: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72  P4_SUBPROGRAM ar
a210: 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20  gument), expand 
a220: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a230: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
a240: 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65  rams.      ** ke
a250: 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d  pt in p->aMem[9]
a260: 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  .z to hold the n
a270: 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73  ew program - ass
a280: 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72  uming this subpr
a290: 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68  ogram.      ** h
a2a0: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
a2b0: 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20  een seen..      
a2c0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  */.      if( pOp
a2d0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
a2e0: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
a2f0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
a300: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
a310: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
a320: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
a330: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
a340: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
a350: 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a       if( apSub[j
a360: 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  ]==pOp->p4.pProg
a370: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
a380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a390: 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51  f( j==nSub && SQ
a3a0: 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33  LITE_OK==sqlite3
a3b0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62  VdbeMemGrow(pSub
a3c0: 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30  , nByte, nSub!=0
a3d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
a3e0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
a3f0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
a400: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
a410: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
a420: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
a430: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
a440: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
a450: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
a460: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
a470: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
a480: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a490: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
a4a0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
a4b0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
a4c0: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4e0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
a4f0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
a500: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
a510: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
a520: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
a550: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
a560: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a570: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
a580: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
a5b0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
a5c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
a5d0: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
a5e0: 7a 65 28 70 4d 65 6d 2c 20 33 32 29 20 29 7b 20  ze(pMem, 32) ){ 
a5f0: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61  /* P4 */.      a
a600: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
a610: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
a620: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a630: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
a640: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
a650: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
a660: 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73  m;.    zP4 = dis
a670: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
a680: 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66  ->z, 32);.    if
a690: 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29  ( zP4!=pMem->z )
a6a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a6b0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
a6c0: 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49  m, zP4, -1, SQLI
a6d0: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20  TE_UTF8, 0);.   
a6e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
a6f0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
a700: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
a710: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
a720: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
a730: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
a740: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
a750: 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a   }.    pMem++;..
a760: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
a770: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
a780: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
a790: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
a7a0: 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20  pMem, 4) ){.    
a7b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
a7c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a7d0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
a7e0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
a7f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
a800: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a810: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
a820: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b      pMem->n = 2;
a830: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
a840: 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d  nprintf(3, pMem-
a850: 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  >z, "%.2x", pOp-
a860: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
a870: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
a880: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
a890: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
a8a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a8b0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
a8c0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28  MMENTS.      if(
a8d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
a8e0: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
a8f0: 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20  em, 500) ){.    
a900: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
a910: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a920: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
a930: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
a940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
a950: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a960: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
a970: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69      pMem->n = di
a980: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
a990: 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  , zP4, pMem->z, 
a9a0: 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  500);.      pMem
a9b0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
a9c0: 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  TF8;.#else.     
a9d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a9e0: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa00: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e  * Comment */.#en
aa10: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  dif.    }..    p
aa20: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
aa30: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
aa40: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73  -1);.    p->pRes
aa50: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
aa60: 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  m[1];.    p->rc 
aa70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
aa80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
aa90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
aaa0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
aab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
aac0: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
aad0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
aae0: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
aaf0: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
ab00: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
ab10: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
ab20: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
ab30: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
ab40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
ab50: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71   0;.  if( p->zSq
ab60: 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e  l ){.    z = p->
ab70: 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  zSql;.  }else if
ab80: 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20  ( p->nOp>=1 ){. 
ab90: 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20     const VdbeOp 
aba0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30  *pOp = &p->aOp[0
abb0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ];.    if( pOp->
abc0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
abd0: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
abe0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70  ){.      z = pOp
abf0: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68  ->p4.z;.      wh
ac00: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
ac10: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
ac20: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
ac30: 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20   ) printf("SQL: 
ac40: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23  [%s]\n", z);.}.#
ac50: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
ac60: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ac70: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
ac80: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
ac90: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
aca0: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
acb0: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
acc0: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
acd0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
ace0: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
acf0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
ad00: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
ad10: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
ad20: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
ad30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
ad40: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
ad50: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
ad60: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
ad70: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
ad80: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
ad90: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
ada0: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
adb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
adc0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
add0: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
ade0: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
adf0: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
ae00: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
ae10: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
ae20: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
ae30: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
ae40: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
ae50: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
ae60: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
ae70: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
ae80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ae90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
aea0: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
aeb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
aec0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
aed0: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
aee0: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
aef0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
af00: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
af10: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
af20: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  IOTRACE */../*.*
af30: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
af40: 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69   from a fixed si
af50: 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65  ze buffer and re
af60: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
af70: 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e  o.** that space.
af80: 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e    If insufficien
af90: 74 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  t space is avail
afa0: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  able, return NUL
afb0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75  L..**.** The pBu
afc0: 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  f parameter is t
afd0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
afe0: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68   of a pointer wh
aff0: 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65  ich will.** rece
b000: 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f  ive the new memo
b010: 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72  ry.  pBuf is nor
b020: 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20  mally NULL.  If 
b030: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
b040: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
b050: 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  at memory space 
b060: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
b070: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
b080: 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hat.** this rout
b090: 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61  ine should not a
b0a0: 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20  llocate any new 
b0b0: 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42  memory.  When pB
b0c0: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
b0d0: 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  L simply return 
b0e0: 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f  pBuf.  Only allo
b0f0: 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20  cate new memory 
b100: 73 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a  space when pBuf.
b110: 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ** is NULL..**.*
b120: 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e  * nByte is the n
b130: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
b140: 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a  f space needed..
b150: 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f  **.** *ppFrom po
b160: 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c  ints to availabl
b170: 65 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64  e space and pEnd
b180: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65   points to the e
b190: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61  nd of the.** ava
b1a0: 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57  ilable space.  W
b1b0: 68 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c  hen space is all
b1c0: 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20  ocated, *ppFrom 
b1d0: 69 73 20 61 64 76 61 6e 63 65 64 20 70 61 73 74  is advanced past
b1e0: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
b1f0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  he allocated spa
b200: 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74  ce..**.** *pnByt
b210: 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f  e is a counter o
b220: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
b230: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  bytes of space t
b240: 68 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a  hat have failed.
b250: 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20  ** to allocate. 
b260: 20 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73   If there is ins
b270: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
b280: 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61  in *ppFrom to sa
b290: 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71  tisfy the.** req
b2a0: 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65  uest, then incre
b2b0: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20  ment *pnByte by 
b2c0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
b2d0: 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74  e request..*/.st
b2e0: 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63  atic void *alloc
b2f0: 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70  Space(.  void *p
b300: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Buf,          /*
b310: 20 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f   Where return po
b320: 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74  inter will be st
b330: 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ored */.  int nB
b340: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  yte,           /
b350: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
b360: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
b370: 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20  .  u8 **ppFrom, 
b380: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
b390: 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d  T: Allocate from
b3a0: 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38   *ppFrom */.  u8
b3b0: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
b3c0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
b3d0: 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65   1 byte past the
b3e0: 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20   end of *ppFrom 
b3f0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
b400: 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  *pnByte         
b410: 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f   /* If allocatio
b420: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65  n cannot be made
b430: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  , increment *pnB
b440: 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  yte */.){.  asse
b450: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
b460: 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d  LIGNMENT(*ppFrom
b470: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20  ) );.  if( pBuf 
b480: 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20  ) return pBuf;. 
b490: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
b4a0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28  nByte);.  if( &(
b4b0: 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20  *ppFrom)[nByte] 
b4c0: 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70  <= pEnd ){.    p
b4d0: 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70  Buf = (void*)*pp
b4e0: 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f  From;.    *ppFro
b4f0: 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65  m += nByte;.  }e
b500: 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65  lse{.    *pnByte
b510: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20   += nByte;.  }. 
b520: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a   return pBuf;.}.
b530: 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68  ./*.** Rewind th
b540: 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74  e VDBE back to t
b550: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20  he beginning in 
b560: 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a  preparation for.
b570: 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a  ** running it..*
b580: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b590: 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70  beRewind(Vdbe *p
b5a0: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
b5b0: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
b5c0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
b5d0: 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23  FILE).  int i;.#
b5e0: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
b5f0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
b600: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
b610: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
b620: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
b630: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
b640: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
b650: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
b660: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
b670: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
b680: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
b690: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
b6a0: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
b6b0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
b6c0: 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  RUN;..#ifdef SQL
b6d0: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
b6e0: 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=1; i<p->nMem; 
b6f0: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
b700: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d  ( p->aMem[i].db=
b710: 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65  =p->db );.  }.#e
b720: 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  ndif.  p->pc = -
b730: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
b740: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72  ITE_OK;.  p->err
b750: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
b760: 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ort;.  p->magic 
b770: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
b780: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
b790: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
b7a0: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
b7b0: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
b7c0: 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74   255;.  p->iStat
b7d0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ement = 0;.  p->
b7e0: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  nFkConstraint = 
b7f0: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
b800: 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30  ROFILE.  for(i=0
b810: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
b820: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  {.    p->aOp[i].
b830: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  cnt = 0;.    p->
b840: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
b850: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
b860: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
b870: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
b880: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66   for execution f
b890: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
b8a0: 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74  e after.** creat
b8b0: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20  ing the virtual 
b8c0: 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69  machine.  This i
b8d0: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
b8e0: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
b8f0: 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61  ting registers a
b900: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
b910: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
b920: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
b930: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
b940: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
b950: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
b960: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
b970: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
b980: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
b990: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
b9a0: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
b9b0: 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68  tly once on each
b9c0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
b9d0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
b9e0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b9f0: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
ba00: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
ba10: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
ba20: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
ba30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ba40: 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c  ed, further call
ba50: 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s to .** sqlite3
ba60: 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63  VdbeAddOp() func
ba70: 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62  tions are prohib
ba80: 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ited.  This rout
ba90: 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a  ine disconnects.
baa0: 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ** the Vdbe from
bab0: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
bac0: 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65  t that helped ge
bad0: 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61  nerate it so tha
bae0: 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62  t the.** the Vdb
baf0: 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64  e becomes an ind
bb00: 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20  ependent entity 
bb10: 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62  and the Parse ob
bb20: 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64  ject can be.** d
bb30: 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
bb40: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56  Use the sqlite3V
bb50: 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63  dbeRewind() proc
bb60: 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65  edure to restore
bb70: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
bb80: 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74  ne back.** to it
bb90: 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20  s initial state 
bba0: 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65  after it has bee
bbb0: 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  n run..*/.void s
bbc0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
bbd0: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
bc00: 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  E */.  Parse *pP
bc10: 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20  arse            
bc20: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
bc30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
bc40: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
bc70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
bc80: 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20  int nVar;       
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bca0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  * Number of para
bcb0: 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  meters */.  int 
bcc0: 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
bcd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bce0: 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72  mber of VM memor
bcf0: 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  y registers */. 
bd00: 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20   int nCursor;   
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
bd30: 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f  sors required */
bd40: 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
bd70: 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70  rguments in subp
bd80: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
bd90: 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20   nOnce;         
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bdb0: 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65  umber of OP_Once
bdc0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f   instructions */
bdd0: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
be00: 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b  r */.  u8 *zCsr;
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
be30: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
be40: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  location */.  u8
be50: 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *zEnd;         
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
be70: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
be80: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
be90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68       /* How much
bec0: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73   extra memory is
bed0: 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73   needed */..  as
bee0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
bef0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
bf00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
bf10: 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
bf20: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
bf30: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
bf40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
bf50: 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b  se==p->pParse );
bf60: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
bf70: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
bf80: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a  locFailed==0 );.
bf90: 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d    nVar = pParse-
bfa0: 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20  >nVar;.  nMem = 
bfb0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
bfc0: 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  nCursor = pParse
bfd0: 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d  ->nTab;.  nArg =
bfe0: 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67   pParse->nMaxArg
bff0: 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72  ;.  nOnce = pPar
c000: 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28  se->nOnce;.  if(
c010: 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63   nOnce==0 ) nOnc
c020: 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65  e = 1; /* Ensure
c030: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79   at least one by
c040: 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c  te in p->aOnceFl
c050: 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  ag[] */.  .  /* 
c060: 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20  For each cursor 
c070: 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61  required, also a
c080: 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79  llocate a memory
c090: 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20   cell. Memory.  
c0a0: 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31  ** cells (nMem+1
c0b0: 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c  -nCursor)..nMem,
c0c0: 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c   inclusive, will
c0d0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62   never be used b
c0e0: 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20  y.  ** the vdbe 
c0f0: 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64  program. Instead
c100: 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74   they are used t
c110: 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
c120: 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75   for.  ** VdbeCu
c130: 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74  rsor/BtCursor st
c140: 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c  ructures. The bl
c150: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
c160: 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20  ociated with .  
c170: 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73  ** cursor 0 is s
c180: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
c190: 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72  cell nMem. Memor
c1a0: 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a  y cell (nMem-1).
c1b0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
c1c0: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
c1d0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
c1e0: 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20  ursor 1, etc..  
c1f0: 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
c200: 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72  : allocateCursor
c210: 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20  ()..  */.  nMem 
c220: 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f  += nCursor;..  /
c230: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
c240: 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69   for memory regi
c250: 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61  sters, SQL varia
c260: 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f  bles, VDBE curso
c270: 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20  rs and .  ** an 
c280: 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c  array to marshal
c290: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72   SQL function ar
c2a0: 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f  guments in..  */
c2b0: 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26  .  zCsr = (u8*)&
c2c0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20  p->aOp[p->nOp]; 
c2d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
c2e0: 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66  mory avaliable f
c2f0: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
c300: 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26  .  zEnd = (u8*)&
c310: 70 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e  p->aOp[pParse->n
c320: 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69  OpAlloc];  /* Fi
c330: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 65 6e  rst byte past en
c340: 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a  d of zCsr[] */..
c350: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
c360: 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70  s(p, &nArg);.  p
c370: 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
c380: 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d  l = (u8)(pParse-
c390: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26  >isMultiWrite &&
c3a0: 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72   pParse->mayAbor
c3b0: 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  t);.  if( pParse
c3c0: 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65  ->explain && nMe
c3d0: 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d  m<10 ){.    nMem
c3e0: 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d   = 10;.  }.  mem
c3f0: 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e  set(zCsr, 0, zEn
c400: 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72 20  d-zCsr);.  zCsr 
c410: 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29  += (zCsr - (u8*)
c420: 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28 20  0)&7;.  assert( 
c430: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
c440: 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20  MENT(zCsr) );.  
c450: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
c460: 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72  .  /* Memory for
c470: 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61   registers, para
c480: 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20  meters, cursor, 
c490: 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65  etc, is allocate
c4a0: 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61  d in two.  ** pa
c4b0: 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69  sses.  On the fi
c4c0: 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79  rst pass, we try
c4d0: 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64   to reuse unused
c4e0: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20   space at the . 
c4f0: 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f   ** end of the o
c500: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66  pcode array.  If
c510: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
c520: 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65  o satisfy all me
c530: 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72  mory.  ** requir
c540: 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e  ements by reusin
c550: 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  g the opcode arr
c560: 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68  ay tail, then th
c570: 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61  e second.  ** pa
c580: 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20  ss will fill in 
c590: 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61  the rest using a
c5a0: 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f   fresh allocatio
c5b0: 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
c5c0: 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70  his two-pass app
c5d0: 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65  roach that reuse
c5e0: 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  s as much memory
c5f0: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
c600: 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f  m.  ** the lefto
c610: 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65  ver space at the
c620: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
c630: 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67  de array can sig
c640: 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
c650: 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e  reduce the amoun
c660: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64  t of memory held
c670: 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73   by a prepared s
c680: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
c690: 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20   do {.    nByte 
c6a0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  = 0;.    p->aMem
c6b0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
c6c0: 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65  >aMem, nMem*size
c6d0: 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20  of(Mem), &zCsr, 
c6e0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
c6f0: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c     p->aVar = all
c700: 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c  ocSpace(p->aVar,
c710: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d   nVar*sizeof(Mem
c720: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
c730: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
c740: 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61  apArg = allocSpa
c750: 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72  ce(p->apArg, nAr
c760: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20  g*sizeof(Mem*), 
c770: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
c780: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56  yte);.    p->azV
c790: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
c7a0: 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73  p->azVar, nVar*s
c7b0: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a  izeof(char*), &z
c7c0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
c7d0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72  e);.    p->apCsr
c7e0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
c7f0: 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a  >apCsr, nCursor*
c800: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
c810: 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r*),.           
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
c830: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
c840: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63  te);.    p->aOnc
c850: 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61  eFlag = allocSpa
c860: 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c  ce(p->aOnceFlag,
c870: 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a   nOnce, &zCsr, z
c880: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
c890: 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
c8a0: 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20       p->pFree = 
c8b0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
c8c0: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
c8d0: 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d      }.    zCsr =
c8e0: 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a   p->pFree;.    z
c8f0: 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74  End = &zCsr[nByt
c900: 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42  e];.  }while( nB
c910: 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  yte && !db->mall
c920: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70  ocFailed );..  p
c930: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72  ->nCursor = nCur
c940: 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46  sor;.  p->nOnceF
c950: 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69  lag = nOnce;.  i
c960: 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20  f( p->aVar ){.  
c970: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56    p->nVar = (ynV
c980: 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72  ar)nVar;.    for
c990: 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b  (n=0; n<nVar; n+
c9a0: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  +){.      p->aVa
c9b0: 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  r[n].flags = MEM
c9c0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  _Null;.      p->
c9d0: 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aVar[n].db = db;
c9e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c9f0: 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20   p->azVar ){.   
ca00: 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72   p->nzVar = pPar
ca10: 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d  se->nzVar;.    m
ca20: 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20  emcpy(p->azVar, 
ca30: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70  pParse->azVar, p
ca40: 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70  ->nzVar*sizeof(p
ca50: 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20  ->azVar[0]));.  
ca60: 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d    memset(pParse-
ca70: 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73  >azVar, 0, pPars
ca80: 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28  e->nzVar*sizeof(
ca90: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d  pParse->azVar[0]
caa0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
cab0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e  >aMem ){.    p->
cac0: 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20  aMem--;         
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cae0: 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d  aMem[] goes from
caf0: 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20   1..nMem */.    
cb00: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20  p->nMem = nMem; 
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f  /*       not fro
cb30: 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20  m 0..nMem-1 */. 
cb40: 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e     for(n=1; n<=n
cb50: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Mem; n++){.     
cb60: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67   p->aMem[n].flag
cb70: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
cb80: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  d;.      p->aMem
cb90: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
cba0: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c   }.  }.  p->expl
cbb0: 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78  ain = pParse->ex
cbc0: 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  plain;.  sqlite3
cbd0: 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
cbe0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
cbf0: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
cc00: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
cc10: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
cc20: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
cc30: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
cc40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
cc50: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
cc60: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
cc70: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
cc80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
cc90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
cca0: 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e  eSorterClose(p->
ccb0: 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20  db, pCx);.  if( 
ccc0: 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pCx->pBt ){.    
ccd0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
cce0: 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pCx->pBt);.   
ccf0: 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75   /* The pCx->pCu
cd00: 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f  rsor will be clo
cd10: 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  se automatically
cd20: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20  , if it exists, 
cd30: 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  by.    ** the ca
cd40: 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d  ll above. */.  }
cd50: 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43  else if( pCx->pC
cd60: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
cd70: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
cd80: 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f  rsor(pCx->pCurso
cd90: 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  r);.  }.#ifndef 
cda0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
cdb0: 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
cdc0: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20  Cx->pVtabCursor 
cdd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
cde0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
cdf0: 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70  bCursor = pCx->p
ce00: 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20  VtabCursor;.    
ce10: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
ce20: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20  dule *pModule = 
ce30: 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
ce40: 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
ce50: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
ce60: 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c   = 1;.    pModul
ce70: 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43  e->xClose(pVtabC
ce80: 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69  ursor);.    p->i
ce90: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b  nVtabMethod = 0;
cea0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
ceb0: 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61  *.** Copy the va
cec0: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
ced0: 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72  he VdbeFrame str
cee0: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64  ucture to its Vd
cef0: 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75  be. This.** is u
cf00: 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  sed, for example
cf10: 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72  , when a trigger
cf20: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
cf30: 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72  halted to restor
cf40: 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  e.** control to 
cf50: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
cf60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cf70: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
cf80: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61  (VdbeFrame *pFra
cf90: 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  me){.  Vdbe *v =
cfa0: 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d   pFrame->v;.  v-
cfb0: 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72  >aOnceFlag = pFr
cfc0: 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a  ame->aOnceFlag;.
cfd0: 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    v->nOnceFlag =
cfe0: 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c   pFrame->nOnceFl
cff0: 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70  ag;.  v->aOp = p
d000: 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d  Frame->aOp;.  v-
d010: 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  >nOp = pFrame->n
d020: 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20  Op;.  v->aMem = 
d030: 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20  pFrame->aMem;.  
d040: 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->nMem = pFrame
d050: 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43  ->nMem;.  v->apC
d060: 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43  sr = pFrame->apC
d070: 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72  sr;.  v->nCursor
d080: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73   = pFrame->nCurs
d090: 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73  or;.  v->db->las
d0a0: 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d  tRowid = pFrame-
d0b0: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d  >lastRowid;.  v-
d0c0: 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
d0d0: 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65  e->nChange;.  re
d0e0: 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b  turn pFrame->pc;
d0f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
d100: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a  all cursors..**.
d110: 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20  ** Also release 
d120: 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  any dynamic memo
d130: 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56  ry held by the V
d140: 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d  M in the Vdbe.aM
d150: 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65  em memory .** ce
d160: 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69  ll array. This i
d170: 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
d180: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  he memory cell a
d190: 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  rray may contain
d1a0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
d1b0: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
d1c0: 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20  s, which may in 
d1d0: 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69  turn contain poi
d1e0: 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  nters to.** open
d1f0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
d200: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
d210: 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
d220: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  ){.  if( p->pFra
d230: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
d240: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20  ame *pFrame;.   
d250: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
d260: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
d270: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
d280: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
d290: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d2a0: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
d2b0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ame);.  }.  p->p
d2c0: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  Frame = 0;.  p->
d2d0: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  nFrame = 0;..  i
d2e0: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
d2f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
d300: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
d310: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
d320: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
d330: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
d340: 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
d350: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d360: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
d370: 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
d380: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
d390: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d3a0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
d3b0: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
d3c0: 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d  rray(&p->aMem[1]
d3d0: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
d3e0: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c    while( p->pDel
d3f0: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
d400: 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70  eFrame *pDel = p
d410: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20  ->pDelFrame;.   
d420: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20   p->pDelFrame = 
d430: 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  pDel->pParent;. 
d440: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
d450: 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  ameDelete(pDel);
d460: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
d470: 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c  e any auxdata al
d480: 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62  locations made b
d490: 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 73 71  y the VM */.  sq
d4a0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
d4b0: 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29  uxData(p, -1, 0)
d4c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
d4d0: 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a  AuxData==0 );.}.
d4e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
d4f0: 74 68 65 20 56 4d 20 61 66 74 65 72 20 61 20 73  the VM after a s
d500: 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74  ingle run..*/.st
d510: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
d520: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  p(Vdbe *p){.  sq
d530: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
d540: 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b;..#ifdef SQLIT
d550: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65  E_DEBUG.  /* Exe
d560: 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
d570: 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
d580: 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65  re that the Vdbe
d590: 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20  .apCsr[] and .  
d5a0: 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61  ** Vdbe.aMem[] a
d5b0: 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61  rrays have alrea
d5c0: 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20  dy been cleaned 
d5d0: 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  up.  */.  int i;
d5e0: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
d5f0: 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e  ) for(i=0; i<p->
d600: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
d610: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
d620: 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]==0 );.  if( p-
d630: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72  >aMem ){.    for
d640: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
d650: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
d660: 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d  ->aMem[i].flags=
d670: 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29  =MEM_Undefined )
d680: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
d690: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d6a0: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
d6b0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
d6c0: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
d6d0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
d6e0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
d6f0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
d700: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
d710: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
d720: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
d730: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
d740: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
d750: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
d760: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
d770: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
d780: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
d790: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
d7a0: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
d7b0: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
d7c0: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
d7d0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
d7e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
d7f0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
d800: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
d810: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
d820: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
d830: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
d840: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
d850: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
d860: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
d870: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
d880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
d890: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
d8a0: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
d8b0: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
d8c0: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
d8d0: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
d8e0: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
d8f0: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
d900: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
d910: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
d920: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
d930: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
d940: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
d950: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
d960: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
d970: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
d980: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
d990: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
d9a0: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
d9b0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
d9c0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
d9d0: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
d9e0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
d9f0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
da00: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
da10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
da20: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
da30: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
da40: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
da50: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
da60: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
da70: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
da80: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
da90: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
daa0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
dab0: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
dac0: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
dad0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
dae0: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
daf0: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
db00: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
db10: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
db20: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
db30: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
db40: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
db50: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
db60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
db70: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
db80: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
dbb0: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
dbc0: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbe0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
dbf0: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
dc00: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
dc30: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
dc40: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
dc50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
dc60: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
dc70: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
dc80: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
dc90: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
dca0: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
dcc0: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
dcd0: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
dce0: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
dcf0: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
dd00: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
dd10: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
dd20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
dd30: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
dd40: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
dd50: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
dd60: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
dd70: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
dd80: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
dd90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
dda0: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  M;.  }.  assert(
ddb0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
ddc0: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
ddd0: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
dde0: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
ddf0: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
de00: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
de10: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
de20: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
de30: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
de40: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
de50: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
de60: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
de70: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
de80: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
de90: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
dea0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
deb0: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
dec0: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
ded0: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
dee0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
def0: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
df00: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
df10: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
df20: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
df30: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
df40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
df50: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
df60: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
df70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
df80: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
df90: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
dfa0: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
dfb0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
dfc0: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
dfd0: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
dfe0: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
dff0: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
e000: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
e010: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e020: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
e030: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
e040: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
e050: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
e060: 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
e070: 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
e080: 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
e090: 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
e0a0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
e0b0: 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
e0c0: 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
e0d0: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
e0e0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
e0f0: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
e100: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
e110: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
e120: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
e130: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
e140: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
e150: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
e160: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
e170: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
e180: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
e190: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
e1a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
e1b0: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
e1c0: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
e1d0: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
e1e0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
e1f0: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
e200: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
e210: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
e220: 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a  tabSync(db, p);.
e230: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
e240: 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
e250: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
e260: 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
e270: 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
e280: 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
e290: 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
e2a0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
e2b0: 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
e2c0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
e2d0: 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
e2e0: 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
e2f0: 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
e300: 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
e310: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
e320: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
e330: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
e340: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
e350: 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
e360: 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
e370: 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
e380: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
e390: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
e3a0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
e3b0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e3c0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e3d0: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
e3e0: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
e3f0: 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  ){.      needXco
e400: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
e410: 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e  if( i!=1 ) nTran
e420: 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s++;.      sqlit
e430: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
e440: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
e450: 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
e460: 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42  iveLock(sqlite3B
e470: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
e480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
e490: 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
e4a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
e4b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e4c0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e4d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e4e0: 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
e4f0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
e500: 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
e510: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
e520: 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
e530: 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
e540: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
e550: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
e560: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
e570: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
e580: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
e590: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
e5a0: 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
e5b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e5c0: 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
e5d0: 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
e5e0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
e5f0: 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
e600: 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
e610: 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
e620: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
e630: 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
e640: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
e650: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
e660: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
e670: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
e680: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
e690: 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
e6a0: 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
e6b0: 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
e6c0: 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
e6d0: 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
e6e0: 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c  y: or a temp fil
e6f0: 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61  e.  In .  ** tha
e700: 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74  t case we do not
e710: 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
e720: 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
e730: 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a  ts, so use the .
e740: 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65    ** simple case
e750: 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   then too..  */.
e760: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
e770: 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
e780: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
e790: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
e7a0: 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  ).   || nTrans<=
e7b0: 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  1.  ){.    for(i
e7c0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
e7d0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
e7e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
e7f0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e800: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
e810: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
e820: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
e830: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
e840: 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
e850: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
e860: 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
e870: 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
e880: 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
e890: 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
e8a0: 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
e8b0: 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
e8c0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
e8d0: 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
e8e0: 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
e8f0: 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
e900: 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
e910: 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
e920: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
e930: 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
e940: 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
e950: 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
e960: 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
e970: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
e980: 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
e990: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
e9a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e9b0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
e9c0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
e9d0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
e9e0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
e9f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
ea00: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
ea10: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
ea20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
ea30: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
ea40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ea50: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
ea60: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
ea70: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
ea80: 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
ea90: 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
eaa0: 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
eab0: 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
eac0: 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
ead0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
eae0: 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
eaf0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
eb00: 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
eb10: 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  d atomically..  
eb20: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
eb30: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
eb40: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
eb50: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
eb60: 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
eb70: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
eb80: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
eb90: 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
eba0: 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
ebb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
ebc0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
ebd0: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
ebe0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
ebf0: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
ec00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ec10: 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
ec20: 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
ec30: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
ec40: 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79  s;.    int retry
ec50: 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  Count = 0;.    i
ec60: 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20  nt nMainFile;.. 
ec70: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
ec80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ec90: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  le name */.    n
eca0: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
ecb0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e  e3Strlen30(zMain
ecc0: 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74  File);.    zMast
ecd0: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
ece0: 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58  ntf(db, "%s-mjXX
ecf0: 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e  XXXX9XXz", zMain
ed00: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  File);.    if( z
ed10: 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75  Master==0 ) retu
ed20: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
ed30: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
ed40: 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
ed50: 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
ed60: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
ed70: 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
ed80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
ed90: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
eda0: 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
edb0: 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
edc0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
edd0: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
ede0: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
edf0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ee00: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ee10: 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
ee20: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
ee30: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
ee40: 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
ee50: 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
ee60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ee70: 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
ee80: 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
ee90: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
eea0: 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
eeb0: 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
eec0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
eed0: 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
eee0: 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
eef0: 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
ef20: 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
ef30: 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
ef40: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
ef50: 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
ef60: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
ef70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
ef80: 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
ef90: 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
efa0: 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
efb0: 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
efc0: 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
efd0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
efe0: 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
eff0: 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
f000: 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
f010: 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
f020: 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
f030: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
f040: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
f050: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
f060: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
f070: 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
f080: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
f090: 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
f0a0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f0b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f0c0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
f0d0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
f0e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f0f0: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
f100: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
f110: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
f120: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
f130: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
f140: 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
f150: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
f160: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
f170: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
f180: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
f190: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
f1a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f1b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
f1c0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
f1d0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
f1e0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
f1f0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
f200: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
f210: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
f220: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
f230: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
f240: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f250: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
f260: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
f270: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
f280: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
f290: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f2a0: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
f2b0: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
f2c0: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
f2d0: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
f2e0: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
f2f0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
f300: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
f310: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
f320: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
f330: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
f340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
f350: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
f360: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
f370: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
f380: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
f390: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
f3a0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
f3b0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
f3c0: 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
f3d0: 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
f3e0: 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
f3f0: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
f400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
f410: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
f420: 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
f430: 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
f440: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
f450: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
f460: 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
f470: 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
f480: 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
f490: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
f4a0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
f4b0: 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
f4c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f4d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f4e0: 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
f4f0: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
f500: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
f510: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
f520: 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
f530: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
f540: 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
f550: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f560: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
f570: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
f580: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
f590: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
f5a0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
f5b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
f5c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f5d0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
f5e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f5f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f600: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
f610: 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
f620: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
f630: 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
f640: 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
f650: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
f660: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
f670: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
f680: 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a    if( needSync .
f690: 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69       && 0==(sqli
f6a0: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
f6b0: 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
f6c0: 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
f6d0: 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
f6e0: 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
f6f0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
f700: 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
f710: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
f720: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
f730: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
f740: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
f750: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
f760: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
f770: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
f780: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
f790: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
f7a0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
f7b0: 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
f7c0: 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
f7d0: 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
f7e0: 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
f7f0: 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
f800: 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
f810: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
f820: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
f830: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
f840: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
f850: 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
f860: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
f870: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f880: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
f890: 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
f8a0: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
f8b0: 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
f8c0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
f8d0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
f8e0: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
f8f0: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
f900: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
f910: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
f920: 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
f930: 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
f940: 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
f950: 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
f960: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
f970: 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
f980: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
f990: 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
f9a0: 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
f9b0: 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
f9c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
f9d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
f9e0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
f9f0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
fa00: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
fa10: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
fa20: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
fa30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
fa40: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
fa50: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
fa60: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
fa70: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
fa80: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
fa90: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
faa0: 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28  _BUSY );.    if(
fab0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fac0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
fad0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
fae0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
faf0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
fb00: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
fb10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
fb20: 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
fb30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
fb40: 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
fb50: 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
fb60: 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
fb70: 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
fb80: 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
fb90: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
fba0: 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
fbb0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
fbc0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
fbd0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
fbe0: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
fbf0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
fc00: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
fc10: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
fc20: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
fc30: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
fc40: 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
fc50: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
fc60: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
fc70: 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
fc80: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
fc90: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
fca0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
fcb0: 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
fcc0: 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
fcd0: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
fce0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
fcf0: 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
fd00: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
fd10: 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
fd20: 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
fd30: 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
fd40: 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
fd50: 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
fd60: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
fd70: 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
fd80: 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
fd90: 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
fda0: 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
fdb0: 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
fdc0: 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
fdd0: 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
fde0: 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
fdf0: 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
fe00: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
fe10: 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
fe20: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
fe30: 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oc();.    for(i=
fe40: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
fe50: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
fe60: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
fe70: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
fe80: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
fe90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
fea0: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
feb0: 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
fec0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
fed0: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
fee0: 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
fef0: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
ff00: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
ff10: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
ff20: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
ff30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
ff40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
ff50: 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
ff60: 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69  qlite3.nVdbeActi
ff70: 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  ve count variabl
ff80: 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
ff90: 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
ffa0: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
ffb0: 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
ffc0: 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
ffd0: 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
ffe0: 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
fff0: 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
10000 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
10010 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
10020 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
10030 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
10040 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
10050 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
10060 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
10070 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
10080 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
10090 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
100a0 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
100b0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
100c0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
100d0 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
100e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
100f0 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  te = 0;.  int nR
10100 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ead = 0;.  p = d
10110 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
10120 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
10130 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
10140 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  y((sqlite3_stmt*
10150 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  )p) ){.      cnt
10160 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
10170 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
10180 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Write++;.      i
10190 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
101a0 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d  ) nRead++;.    }
101b0 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
101c0 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
101d0 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41   cnt==db->nVdbeA
101e0 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72  ctive );.  asser
101f0 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e  t( nWrite==db->n
10200 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61  VdbeWrite );.  a
10210 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62  ssert( nRead==db
10220 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d  ->nVdbeRead );.}
10230 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
10240 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
10250 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
10260 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
10270 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
10280 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
10290 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
102a0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
102b0 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
102c0 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
102d0 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
102e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
102f0 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
10300 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
10310 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10320 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
10330 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
10340 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
10350 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
10360 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
10370 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
10380 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10390 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
103a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
103b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
103c0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
103d0 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
103e0 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
103f0 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
10400 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
10410 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
10420 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
10430 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
10440 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
10450 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
10460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
10470 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   If p->iStatemen
10480 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
10490 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n zero, then thi
104a0 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20  s Vdbe opened a 
104b0 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
104c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
104d0 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
104e0 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79  d here. The only
104f0 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20   exception.  ** 
10500 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72  is that an IO er
10510 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63  ror may have occ
10520 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61  urred, causing a
10530 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
10540 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68  back..  ** In th
10550 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74  is case (db->nSt
10560 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64  atement==0), and
10570 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
10580 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20  g to do..  */.  
10590 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  if( db->nStateme
105a0 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
105b0 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ent ){.    int i
105c0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
105d0 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  iSavepoint = p->
105e0 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20  iStatement-1;.. 
105f0 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d     assert( eOp==
10600 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10610 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
10620 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
10630 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
10640 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
10650 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53     assert( p->iS
10660 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
10670 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
10680 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
10690 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
106a0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
106b0 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
106c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74  ITE_OK;.      Bt
106d0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
106e0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
106f0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
10700 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
10710 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
10730 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
10740 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
10750 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10760 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
10770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10780 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
10790 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
107a0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
107b0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
107c0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
107d0 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
107e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
107f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10810 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
10820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10830 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74     }.    db->nSt
10840 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70  atement--;.    p
10850 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
10860 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
10870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10880 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
10890 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
108a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
108b0 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
108c0 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
108d0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
108e0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
108f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
10900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10910 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
10920 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
10930 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
10940 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
10950 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10960 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
10970 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
10980 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
10990 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
109a0 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20  estore the .    
109b0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
109c0 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
109d0 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20  straint counter 
109e0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
109f0 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a  had when .    **
10a00 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
10a10 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
10a20 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  pened.  */.    i
10a30 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
10a40 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
10a50 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
10a60 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
10a70 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64  DefCons;.      d
10a80 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
10a90 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
10aa0 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  fImmCons;.    }.
10ab0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10ac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
10ad0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
10ae0 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
10af0 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
10b00 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
10b10 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
10b20 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
10b30 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
10b40 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
10b50 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
10b60 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
10b70 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
10b80 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
10b90 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
10ba0 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
10bb0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
10bc0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
10bd0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
10be0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
10bf0 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
10c00 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
10c10 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
10c20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
10c30 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
10c40 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
10c50 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
10c60 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72  IGNKEY.** and wr
10c70 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
10c80 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
10c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
10ca0 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
10cb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
10cc0 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
10cd0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
10ce0 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
10cf0 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
10d00 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
10d10 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
10d20 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  & (db->nDeferred
10d30 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72  Cons+db->nDeferr
10d40 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20  edImmCons)>0) . 
10d50 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20    || (!deferred 
10d60 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
10d70 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  int>0) .  ){.   
10d80 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
10d90 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
10da0 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72  GNKEY;.    p->er
10db0 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
10dc0 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
10dd0 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
10de0 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52  ErrMsg, db, "FOR
10df0 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
10e00 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
10e10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10e20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
10e30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10e40 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
10e50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10e60 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
10e70 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
10e80 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
10e90 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
10ea0 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
10eb0 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
10ec0 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
10ed0 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
10ee0 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
10ef0 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
10f00 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
10f10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10f20 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
10f30 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
10f40 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
10f50 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
10f60 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
10f70 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
10f80 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
10f90 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
10fa0 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
10fb0 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
10fc0 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
10fd0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
10fe0 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
10ff0 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
11000 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
11010 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
11020 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
11030 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
11040 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
11050 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
11060 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
11070 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
11080 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
11090 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
110a0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
110b0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
110c0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
110d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
110e0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
110f0 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
11100 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
11110 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
11120 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
11130 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
11140 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
11150 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
11160 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
11170 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
11180 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
11190 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
111a0 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
111b0 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
111c0 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
111d0 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
111e0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
111f0 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
11200 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
11210 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
11220 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
11230 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
11240 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
11250 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
11260 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
11270 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
11280 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
11290 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
112a0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
112b0 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
112c0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
112d0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
112e0 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
112f0 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
11300 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
11310 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
11320 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
11330 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11340 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  ..  */..  if( p-
11350 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
11360 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
11370 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11380 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63   }.  if( p->aOnc
11390 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70  eFlag ) memset(p
113a0 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20  ->aOnceFlag, 0, 
113b0 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20  p->nOnceFlag);. 
113c0 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
113d0 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  (p);.  if( p->ma
113e0 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
113f0 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
11400 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11410 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
11420 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
11430 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
11440 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
11450 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
11460 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66  er started or if
11470 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74   the.  ** SQL st
11480 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  atement does not
11490 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61   read or write a
114a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
114b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
114c0 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64  =0 && p->bIsRead
114d0 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  er ){.    int mr
114e0 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
114f0 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
11500 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74  p->rc */.    int
11510 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
11520 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65  0;.    int isSpe
11530 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
11540 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
11550 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69  true if a 'speci
11560 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  al' error */..  
11570 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
11580 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
11590 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
115a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74    sqlite3VdbeEnt
115b0 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
115c0 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
115d0 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
115e0 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
115f0 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
11600 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
11610 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
11620 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
11630 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11650 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
11660 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
11670 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
11680 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
11690 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
116a0 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
116b0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74   read-only and t
116c0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
116d0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
116e0 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  T, .      ** no 
116f0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65  rollback is nece
11700 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65  ssary. Otherwise
11710 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76  , at least a sav
11720 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
11730 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
11740 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
11750 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
11760 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20  database to a . 
11770 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65       ** consiste
11780 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
11790 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  **.      ** Even
117a0 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
117b0 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  t is read-only, 
117c0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
117d0 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20  to perform.     
117e0 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20   ** a statement 
117f0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  or transaction r
11800 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
11810 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  n. If the error 
11820 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
11830 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
11840 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   to the journal,
11850 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20   sub-journal or 
11860 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
11870 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f  * file as part o
11880 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66  f an effort to f
11890 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61  ree up cache spa
118a0 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e  ce (see function
118b0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53  .      ** pagerS
118c0 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72  tress() in pager
118d0 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  .c), the rollbac
118e0 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  k is required to
118f0 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20   restore .      
11900 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
11910 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  a consistent sta
11920 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
11930 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
11940 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
11950 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
11960 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63          if( (mrc
11970 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
11980 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
11990 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74  LL) && p->usesSt
119a0 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  mtJournal ){.   
119b0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
119c0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
119d0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
119e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
119f0 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
11a00 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
11a10 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
11a20 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
11a30 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
11a40 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
11a50 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
11a60 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
11a70 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
11a80 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
11a90 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11aa0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
11ab0 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
11ac0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
11ad0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
11ae0 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
11af0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
11b00 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
11b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11b20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
11b30 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74  eck for immediat
11b40 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69  e foreign key vi
11b50 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20  olations. */.   
11b60 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
11b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11b80 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
11b90 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  k(p, 0);.    }. 
11ba0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
11bb0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
11bc0 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73   is set and this
11bd0 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74   is the only act
11be0 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20  ive writer .    
11bf0 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64  ** VM, then we d
11c00 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69  o either a commi
11c10 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  t or rollback of
11c20 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
11c30 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a  nsaction. .    *
11c40 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54  *.    ** Note: T
11c50 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72  his block also r
11c60 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68  uns if one of th
11c70 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
11c80 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a   handled .    **
11c90 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72   above has occur
11ca0 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  red. .    */.   
11cb0 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61   if( !sqlite3Vta
11cc0 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20  bInSync(db) .   
11cd0 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d    && db->autoCom
11ce0 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d  mit .     && db-
11cf0 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d  >nVdbeWrite==(p-
11d00 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20  >readOnly==0) . 
11d10 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
11d20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
11d30 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
11d40 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
11d50 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
11d60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11d70 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
11d80 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20  kFk(p, 1);.     
11d90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11db0 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72    if( NEVER(p->r
11dc0 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
11dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11de0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
11df0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11e00 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
11e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11e20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11e30 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
11e40 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d  GNKEY;.        }
11e50 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20  else{ .         
11e60 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d   /* The auto-com
11e70 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
11e80 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  , the vdbe progr
11e90 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75  am was successfu
11ea0 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  l .          ** 
11eb0 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41  or hit an 'OR FA
11ec0 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61  IL' constraint a
11ed0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
11ee0 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e  deferred foreign
11ef0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65  .          ** ke
11f00 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
11f10 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61   hold up the tra
11f20 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d  nsaction. This m
11f30 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
11f40 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72           ** is r
11f50 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
11f60 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
11f70 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20  ommit(db, p);.  
11f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11f90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
11fa0 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e  USY && p->readOn
11fb0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ly ){.          
11fc0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
11fd0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
11fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
11ff0 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
12000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12010 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12020 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
12030 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
12040 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
12050 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20  ITE_OK);.       
12060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12070 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
12080 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
12090 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
120a0 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  ImmCons = 0;.   
120b0 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
120c0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65   &= ~SQLITE_Defe
120d0 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20  rFKs;.          
120e0 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
120f0 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
12100 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12120 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
12130 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
12140 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
12150 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
12160 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
12170 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
12180 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
12190 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
121a0 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
121b0 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
121c0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
121d0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
121e0 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20  _RELEASE;.      
121f0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
12200 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
12210 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  rt ){.        eS
12220 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
12230 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
12240 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12250 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
12260 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
12270 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
12280 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
12290 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
122a0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
122b0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
122c0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
122d0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
122e0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20  eStatementOp is 
122f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
12300 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
12310 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a  action needs to.
12320 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74      ** be commit
12330 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
12340 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ck. Call sqlite3
12350 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
12360 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64  nt() to.    ** d
12370 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70  o so. If this op
12380 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
12390 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
123a0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
123b0 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  ent.    ** error
123c0 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
123d0 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e  OK or SQLITE_CON
123e0 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72  STRAINT, then pr
123f0 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  omote the.    **
12400 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
12410 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  nt error code.. 
12420 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
12430 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
12440 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12450 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
12460 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
12470 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
12480 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  c ){.        if(
12490 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
124a0 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66  K || (p->rc&0xff
124b0 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
124c0 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
124d0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
124e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
124f0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
12500 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
12510 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
12520 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12530 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
12540 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
12550 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
12560 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12570 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
12580 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
12590 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
125a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
125b0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
125c0 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
125d0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
125e0 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
125f0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
12600 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
12610 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
12620 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
12630 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
12640 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
12650 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
12660 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
12670 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
12680 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
12690 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
126a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
126b0 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
126c0 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
126d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
126e0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
126f0 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
12700 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
12710 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
12720 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
12730 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
12740 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
12750 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ve(p);.  }..  /*
12760 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
12770 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
12780 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
12790 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
127a0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
127b0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
127c0 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20  nVdbeActive--;. 
127d0 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
127e0 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57  nly ) db->nVdbeW
127f0 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  rite--;.    if( 
12800 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64  p->bIsReader ) d
12810 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a  b->nVdbeRead--;.
12820 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12830 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d  nVdbeActive>=db-
12840 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20  >nVdbeRead );.  
12850 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
12860 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64  dbeRead>=db->nVd
12870 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61  beWrite );.    a
12880 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
12890 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a  Write>=0 );.  }.
128a0 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
128b0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
128c0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
128d0 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
128e0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
128f0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
12900 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12910 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
12920 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
12930 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
12940 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
12950 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
12960 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
12970 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
12980 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
12990 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
129a0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
129b0 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
129c0 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
129d0 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
129e0 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
129f0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
12a00 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
12a10 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
12a20 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
12a30 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
12a40 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
12a50 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
12a60 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
12a70 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
12a80 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
12a90 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
12aa0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
12ab0 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
12ac0 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
12ad0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
12ae0 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
12af0 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
12b00 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
12b10 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
12b20 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
12b30 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
12b40 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
12b50 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
12b60 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
12b70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12b80 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
12b90 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
12ba0 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
12bb0 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
12bc0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
12bd0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
12be0 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
12bf0 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
12c00 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
12c10 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
12c20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
12c30 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
12c40 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
12c50 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12c60 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
12c70 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
12c80 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
12c90 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
12ca0 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
12cb0 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
12cc0 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
12cd0 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
12ce0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
12cf0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
12d00 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
12d10 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
12d20 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46  {.    u8 mallocF
12d30 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
12d40 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71  ocFailed;.    sq
12d50 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
12d60 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66  Malloc();.    if
12d70 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20  ( db->pErr==0 ) 
12d80 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74  db->pErr = sqlit
12d90 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
12da0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
12db0 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
12dc0 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
12dd0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
12de0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
12df0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
12e00 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
12e10 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
12e20 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c  led = mallocFail
12e30 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43  ed;.    db->errC
12e40 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73  ode = rc;.  }els
12e50 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
12e60 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d  ror(db, rc);.  }
12e70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12e80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
12e90 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a  NABLE_SQLLOG./*.
12ea0 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f  ** If an SQLITE_
12eb0 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f  CONFIG_SQLLOG ho
12ec0 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ok is registered
12ed0 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20   and the VM has 
12ee0 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e  been run, .** in
12ef0 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  voke it..*/.stat
12f00 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f  ic void vdbeInvo
12f10 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76  keSqllog(Vdbe *v
12f20 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
12f30 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
12f40 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53  llog && v->rc==S
12f50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a  QLITE_OK && v->z
12f60 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20  Sql && v->pc>=0 
12f70 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78  ){.    char *zEx
12f80 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33  panded = sqlite3
12f90 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c  VdbeExpandSql(v,
12fa0 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61   v->zSql);.    a
12fb0 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e  ssert( v->db->in
12fc0 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
12fd0 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20    if( zExpanded 
12fe0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12ff0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
13000 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20  llog(.          
13010 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
13020 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
13030 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
13040 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 1.      );.   
13050 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13060 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65  (v->db, zExpande
13070 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  d);.    }.  }.}.
13080 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
13090 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
130a0 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
130b0 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
130c0 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
130d0 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
130e0 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
130f0 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
13100 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
13110 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
13120 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
13130 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
13140 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
13150 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
13160 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
13170 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
13180 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
13190 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
131a0 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
131b0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
131c0 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
131d0 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
131e0 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
131f0 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
13200 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
13210 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
13220 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
13230 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
13240 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
13250 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
13260 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
13270 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
13280 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
13290 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
132a0 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
132b0 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
132c0 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
132d0 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
132e0 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
132f0 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
13300 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
13310 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
13320 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
13330 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
13340 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
13350 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
13360 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
13370 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
13380 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
13390 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
133a0 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
133b0 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
133c0 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
133d0 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
133e0 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
133f0 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
13400 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
13410 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
13420 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
13430 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
13440 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
13450 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
13460 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
13470 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13480 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
13490 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
134a0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
134b0 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
134c0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
134d0 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  f( p->runOnlyOnc
134e0 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  e ) p->expired =
134f0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
13500 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
13510 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
13520 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
13530 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
13540 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
13550 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
13560 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
13570 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
13580 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
13590 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
135a0 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
135b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
135c0 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
135d0 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
135e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
135f0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e  rWithMsg(db, p->
13600 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f  rc, p->zErrMsg ?
13610 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45   "%s" : 0, p->zE
13620 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
13630 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
13640 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
13650 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
13660 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
13670 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
13680 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
13690 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
136a0 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
136b0 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
136c0 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
136d0 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
136e0 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
136f0 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
13700 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
13710 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
13720 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
13730 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
13740 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
13750 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
13760 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
13770 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
13780 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
13790 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
137a0 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
137b0 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
137c0 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
137d0 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
137e0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c  .        char c,
137f0 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
13800 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
13810 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  - ");.        fo
13820 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a  r(i=0; (c = p->z
13830 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  Sql[i])!=0; i++)
13840 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13850 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc=='\n' ) fprin
13860 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
13870 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63            putc(c
13880 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  , out);.        
13890 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20    pc = c;.      
138a0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
138b0 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc!='\n' ) fprin
138c0 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
138d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
138e0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
138f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
13900 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar zHdr[100];.  
13910 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
13920 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48  printf(sizeof(zH
13930 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20  dr), zHdr, "%6u 
13940 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a  %12llu %8llu ",.
13950 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
13960 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
13970 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
13980 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
13990 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
139a0 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
139b0 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
139c0 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
139d0 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
139e0 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64  f(out, "%s", zHd
139f0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
13a00 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
13a10 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
13a20 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
13a30 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
13a40 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13a50 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d    p->iCurrentTim
13a60 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = 0;.  p->magi
13a70 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
13a80 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
13a90 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
13aa0 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
13ab0 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
13ac0 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
13ad0 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
13ae0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
13af0 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
13b00 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
13b10 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
13b20 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
13b30 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
13b40 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
13b50 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
13b60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13b70 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
13b80 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
13b90 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
13ba0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
13bb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13bc0 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
13bd0 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
13be0 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
13bf0 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
13c00 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
13c10 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
13c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72  .}../*.** If par
13c30 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65  ameter iOp is le
13c40 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
13c50 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  en invoke the de
13c60 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20  structor for.** 
13c70 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61  all auxiliary da
13c80 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72  ta pointers curr
13c90 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20  ently cached by 
13ca0 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
13cb0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
13cc0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  gument..**.** Or
13cd0 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61  , if iOp is grea
13ce0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
13cf0 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  l to zero, then 
13d00 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
13d10 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  s.** only invoke
13d20 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69  d for those auxi
13d30 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
13d40 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74  ers created by t
13d50 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63  he user .** func
13d60 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20  tion invoked by 
13d70 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  the OP_Function 
13d80 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75  opcode at instru
13d90 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a  ction iOp of .**
13da0 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f   VM pVdbe, and o
13db0 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a  nly then if:.**.
13dc0 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f  **    * the asso
13dd0 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  ciated function 
13de0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
13df0 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28   32nd or later (
13e00 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20  counting.**     
13e10 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
13e20 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  ght), or.**.**  
13e30 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f    * the correspo
13e40 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67  nding bit in arg
13e50 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c  ument mask is cl
13e60 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66  ear (where the f
13e70 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e  irst.**      fun
13e80 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
13e90 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62  corresponds to b
13ea0 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76  it 0 etc.)..*/.v
13eb0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
13ec0 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
13ed0 65 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f  e *pVdbe, int iO
13ee0 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
13ef0 41 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26  AuxData **pp = &
13f00 70 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b  pVdbe->pAuxData;
13f10 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b  .  while( *pp ){
13f20 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41  .    AuxData *pA
13f30 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66  ux = *pp;.    if
13f40 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c  ( (iOp<0).     |
13f50 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f  | (pAux->iOp==iO
13f60 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67  p && (pAux->iArg
13f70 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20  >31 || !(mask & 
13f80 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e  MASKBIT32(pAux->
13f90 69 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a  iArg)))).    ){.
13fa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
13fb0 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29  pAux->iArg==31 )
13fc0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  ;.      if( pAux
13fd0 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
13fe0 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
13ff0 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
14000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
14010 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b  p = pAux->pNext;
14020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
14030 46 72 65 65 28 70 56 64 62 65 2d 3e 64 62 2c 20  Free(pVdbe->db, 
14040 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
14050 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
14060 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
14070 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
14080 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
14090 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
140a0 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
140b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
140c0 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
140d0 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
140e0 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
140f0 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
14100 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
14110 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
14120 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
14130 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
14140 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
14150 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
14160 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
14170 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
14180 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
14190 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
141a0 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
141b0 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
141c0 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
141d0 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
141e0 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
141f0 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
14200 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
14210 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Next;.  int i;. 
14220 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
14230 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
14240 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
14250 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
14260 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65  nVar);.  release
14270 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
14280 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
14290 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
142a0 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
142b0 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
142c0 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
142d0 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
142e0 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
142f0 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
14300 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
14310 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
14320 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
14330 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e    }.  for(i=p->n
14340 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  zVar-1; i>=0; i-
14350 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  -) sqlite3DbFree
14360 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d  (db, p->azVar[i]
14370 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41  );.  vdbeFreeOpA
14380 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c  rray(db, p->aOp,
14390 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69   p->nOp);.  sqli
143a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
143b0 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  >aColName);.  sq
143c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
143d0 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69  p->zSql);.  sqli
143e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
143f0 3e 70 46 72 65 65 29 3b 0a 23 69 66 20 64 65 66  >pFree);.#if def
14400 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
14410 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
14420 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
14430 28 64 62 2c 20 70 2d 3e 7a 45 78 70 6c 61 69 6e  (db, p->zExplain
14440 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
14450 65 65 28 64 62 2c 20 70 2d 3e 70 45 78 70 6c 61  ee(db, p->pExpla
14460 69 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  in);.#endif.}../
14470 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
14480 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
14490 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
144a0 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
144b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
144c0 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
144d0 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
144e0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
144f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14500 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
14510 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
14520 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62  beClearObject(db
14530 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  , p);.  if( p->p
14540 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
14550 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
14560 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
14570 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
14580 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
14590 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e   db->pVdbe = p->
145a0 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
145b0 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
145c0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
145d0 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
145e0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
145f0 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
14600 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71   p->db = 0;.  sq
14610 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14620 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  p);.}../*.** The
14630 20 63 75 72 73 6f 72 20 22 70 22 20 68 61 73 20   cursor "p" has 
14640 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f  a pending seek o
14650 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61  peration that ha
14660 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a  s not yet been.*
14670 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20  * carried out.  
14680 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20  Seek the cursor 
14690 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  now.  If an erro
146a0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
146b0 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
146c0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ate error code..
146d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
146e0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61  LITE_NOINLINE ha
146f0 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
14700 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
14710 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63  ){.  int res, rc
14720 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
14730 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e  TEST.  extern in
14740 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
14750 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
14760 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65   assert( p->defe
14770 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20  rredMoveto );.  
14780 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62  assert( p->isTab
14790 6c 65 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  le );.  rc = sql
147a0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
147b0 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73  npacked(p->pCurs
147c0 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f  or, 0, p->moveto
147d0 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29  Target, 0, &res)
147e0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
147f0 75 72 6e 20 72 63 3b 0a 20 20 70 2d 3e 6c 61 73  urn rc;.  p->las
14800 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65  tRowid = p->move
14810 74 6f 54 61 72 67 65 74 3b 0a 20 20 69 66 28 20  toTarget;.  if( 
14820 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
14830 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
14840 4b 50 54 3b 0a 20 20 70 2d 3e 72 6f 77 69 64 49  KPT;.  p->rowidI
14850 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64  sValid = 1;.#ifd
14860 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
14870 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
14880 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
14890 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
148a0 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
148b0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
148c0 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
148d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
148e0 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
148f0 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
14900 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
14910 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
14920 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
14930 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
14940 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
14950 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
14960 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
14970 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
14980 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
14990 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
149a0 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
149b0 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
149c0 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
149d0 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
149e0 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
149f0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
14a00 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
14a10 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
14a20 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
14a30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
14a40 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
14a50 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
14a60 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
14a70 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
14a80 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
14a90 65 72 74 28 20 70 2d 3e 70 43 75 72 73 6f 72 21  ert( p->pCursor!
14aa0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14ab0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
14ac0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
14ad0 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d  ursor) );.  rc =
14ae0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14af0 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 70 43  sorRestore(p->pC
14b00 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72  ursor, &isDiffer
14b10 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61  entRow);.  p->ca
14b20 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
14b30 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69  E_STALE;.  if( i
14b40 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20  sDifferentRow ) 
14b50 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  p->nullRow = 1;.
14b60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14b70 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
14b80 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20  the cursor p is 
14b90 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72  ready to read or
14ba0 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74   write the row t
14bb0 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61  o which it.** wa
14bc0 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65  s last positione
14bd0 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  d.  Return an er
14be0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f  ror code if an O
14bf0 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20  OM fault or I/O 
14c00 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74  error.** prevent
14c10 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69  s us from positi
14c20 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  oning the cursor
14c30 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
14c40 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
14c50 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
14c60 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
14c70 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
14c80 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
14c90 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
14ca0 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73  .  If no move is
14cb0 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20   pending, check 
14cc0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f  to see if the ro
14cd0 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65  w has been.** de
14ce0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
14cf0 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  nder the cursor 
14d00 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d  and if it has, m
14d10 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a  ark the row as.*
14d20 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a  * a NULL row..**
14d30 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
14d40 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
14d50 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72  nting to the cor
14d60 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61  rect row and tha
14d70 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74  t row has.** not
14d80 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
14d90 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
14da0 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68   cursor, then th
14db0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
14dc0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
14dd0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
14de0 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
14df0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
14e00 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
14e10 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
14e20 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
14e30 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  (p);.  }.  if( s
14e40 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
14e50 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75  rHasMoved(p->pCu
14e60 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74  rsor) ){.    ret
14e70 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  urn handleMovedC
14e80 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20  ursor(p);.  }.  
14e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
14eb0 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
14ec0 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  ns:.**.** sqlite
14ed0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
14ee0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
14ef0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a  SerialTypeLen().
14f00 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
14f10 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  rialLen().** sql
14f20 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75  ite3VdbeSerialPu
14f30 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  t().** sqlite3Vd
14f40 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a  beSerialGet().**
14f50 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20  .** encapsulate 
14f60 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65  the code that se
14f70 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20  rializes values 
14f80 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53  for storage in S
14f90 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e  QLite.** data an
14fa0 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e  d index records.
14fb0 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64   Each serialized
14fc0 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20   value consists 
14fd0 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d  of a.** 'serial-
14fe0 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62  type' and a blob
14ff0 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65   of data. The se
15000 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20  rial type is an 
15010 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a  8-byte unsigned.
15020 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72  ** integer, stor
15030 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  ed as a varint..
15040 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69  **.** In an SQLi
15050 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  te index record,
15060 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
15070 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63   is stored direc
15080 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  tly before.** th
15090 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74  e blob of data t
150a0 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e  hat it correspon
150b0 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c  ds to. In a tabl
150c0 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65  e record, all se
150d0 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72  rial.** types ar
150e0 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
150f0 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63  start of the rec
15100 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ord, and the blo
15110 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a  bs of data at.**
15120 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20   the end. Hence 
15130 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  these functions 
15140 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72  allow the caller
15150 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a   to handle the.*
15160 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e  * serial-type an
15170 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61  d data blob sepa
15180 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rately..**.** Th
15190 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
151a0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
151b0 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20  various storage 
151c0 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61  classes for data
151d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c  :.**.**   serial
151e0 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74   type        byt
151f0 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20  es of data      
15200 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  type.**   ------
15210 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
15220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
15230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
15240 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20  **      0       
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
15260 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a             NULL.
15270 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20  **      1       
15280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
15290 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
152a0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
152b0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
152c0 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
152d0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
152e0 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20  ger.**      3   
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15300 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73    3            s
15310 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
15320 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
15330 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20              4   
15340 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
15350 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
15360 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  5               
15370 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
15380 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
15390 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20  r.**      6     
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  8            sig
153c0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
153d0 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20      7           
153e0 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
153f0 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61         IEEE floa
15400 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20  t.**      8     
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15420 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
15430 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a  eger constant 0.
15440 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20  **      9       
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
15460 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
15470 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a  er constant 1.**
15480 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20       10,11      
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65           reserve
154b0 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a  d for expansion.
154c0 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20  **    N>=12 and 
154d0 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32  even       (N-12
154e0 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a  )/2        BLOB.
154f0 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20  **    N>=13 and 
15500 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33  odd        (N-13
15510 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a  )/2        text.
15520 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20  **.** The 8 and 
15530 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64  9 types were add
15540 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c  ed in 3.3.0, fil
15550 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69  e format 4.  Pri
15560 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f  or versions.** o
15570 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  f SQLite will no
15580 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f  t understand tho
15590 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  se serial types.
155a0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
155b0 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70  n the serial-typ
155c0 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
155d0 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a  stored in pMem..
155e0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
155f0 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d  beSerialType(Mem
15600 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
15610 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20  _format){.  int 
15620 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c  flags = pMem->fl
15630 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20  ags;.  u32 n;.. 
15640 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e   if( flags&MEM_N
15650 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
15660 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
15670 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
15680 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
15690 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
156a0 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
156b0 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
156c0 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
156d0 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30  ((((i64)0x000080
156e0 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
156f0 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
15700 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
15710 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
15720 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36     if( i<(-MAX_6
15730 42 59 54 45 29 20 29 20 72 65 74 75 72 6e 20 36  BYTE) ) return 6
15740 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69  ;.      /* Previ
15750 6f 75 73 20 74 65 73 74 20 70 72 65 76 65 6e 74  ous test prevent
15760 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33 33  s:  u = -(-92233
15770 37 32 30 33 36 38 35 34 37 37 35 38 30 38 29 20  72036854775808) 
15780 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69 3b  */.      u = -i;
15790 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
157a0 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20    u = i;.    }. 
157b0 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b     if( u<=127 ){
157c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28  .      return ((
157d0 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f  i&1)==i && file_
157e0 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28  format>=4) ? 8+(
157f0 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d  u32)u : 1;.    }
15800 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
15810 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  7 ) return 2;.  
15820 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
15830 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
15840 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
15850 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  47 ) return 4;. 
15860 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
15870 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a  YTE ) return 5;.
15880 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
15890 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
158a0 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65  M_Real ){.    re
158b0 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73  turn 7;.  }.  as
158c0 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e  sert( pMem->db->
158d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
158e0 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
158f0 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73  EM_Blob) );.  as
15900 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30  sert( pMem->n>=0
15910 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70   );.  n = (u32)p
15920 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c  Mem->n;.  if( fl
15930 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
15940 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d  {.    n += pMem-
15950 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20  >u.nZero;.  }.  
15960 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
15970 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
15980 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
15990 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
159a0 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
159b0 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
159c0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
159d0 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
159e0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
159f0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
15a00 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
15a10 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
15a20 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74  e>=12 ){.    ret
15a30 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
15a40 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
15a50 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
15a60 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b  t u8 aSize[] = {
15a70 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   0, 1, 2, 3, 4, 
15a80 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30  6, 8, 8, 0, 0, 0
15a90 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72  , 0 };.    retur
15aa0 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74  n aSize[serial_t
15ab0 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ype];.  }.}../*.
15ac0 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
15ad0 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
15ae0 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
15af0 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
15b00 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
15b10 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
15b20 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
15b30 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
15b40 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
15b50 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
15b60 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
15b70 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
15b80 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
15b90 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
15ba0 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
15bb0 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
15bc0 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
15bd0 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
15be0 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
15bf0 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
15c00 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
15c10 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
15c20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
15c30 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
15c40 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
15c50 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
15c60 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
15c70 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
15c80 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
15c90 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
15ca0 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
15cb0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
15cc0 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
15cd0 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
15ce0 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
15cf0 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
15d00 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
15d10 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
15d20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
15d30 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
15d40 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
15d50 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
15d60 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
15d70 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
15d80 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
15d90 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
15da0 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
15db0 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
15dc0 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
15dd0 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
15de0 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
15df0 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
15e00 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
15e10 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
15e20 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
15e30 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
15e40 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
15e50 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
15e60 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
15e70 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
15e80 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
15e90 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
15ea0 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
15eb0 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
15ec0 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
15ed0 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
15ee0 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
15ef0 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
15f00 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
15f10 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
15f20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
15f30 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
15f40 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
15f50 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
15f60 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
15f70 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
15f80 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
15f90 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
15fa0 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
15fb0 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
15fc0 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
15fd0 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
15fe0 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
15ff0 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
16000 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
16010 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
16020 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
16030 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
16040 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
16050 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
16060 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
16070 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
16080 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
16090 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
160a0 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
160b0 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
160c0 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
160d0 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
160e0 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
160f0 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
16100 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
16110 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
16120 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
16130 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
16140 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
16150 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
16160 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
16170 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
16180 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
16190 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
161a0 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
161b0 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
161c0 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
161d0 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
161e0 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
161f0 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
16200 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
16210 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
16220 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
16230 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
16240 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
16250 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
16260 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
16270 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
16280 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
16290 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
162a0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
162b0 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
162c0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
162d0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
162e0 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
162f0 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
16300 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
16310 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
16320 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
16330 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
16340 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
16350 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  [].  The caller 
16360 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a  is responsible.*
16370 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67  * for allocating
16380 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
16390 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74   buf[] to hold t
163a0 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c  he entire field,
163b0 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66   exclusive.** of
163c0 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65   the pMem->u.nZe
163d0 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d  ro bytes for a M
163e0 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  EM_Zero value..*
163f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16400 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16410 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
16420 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
16430 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
16440 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
16450 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
16460 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
16470 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
16480 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
16490 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
164a0 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
164b0 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
164c0 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
164d0 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73  Mem *pMem, u32 s
164e0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75  erial_type){.  u
164f0 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  32 len;..  /* In
16500 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
16510 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
16520 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c  ype<=7 && serial
16530 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75  _type>0 ){.    u
16540 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b  64 v;.    u32 i;
16550 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
16560 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
16570 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
16580 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  v)==sizeof(pMem-
16590 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  >u.r) );.      m
165a0 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
165b0 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  >u.r, sizeof(v))
165c0 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
165d0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
165e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
165f0 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
16600 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
16610 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
16620 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
16630 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
16640 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
16650 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66     do{.      buf
16660 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30  [--i] = (u8)(v&0
16670 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
16680 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 8;.    }while(
16690 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   i );.    return
166a0 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
166b0 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
166c0 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
166d0 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
166e0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
166f0 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
16700 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
16710 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20  >u.nZero:0).    
16720 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74           == (int
16730 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  )sqlite3VdbeSeri
16740 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
16750 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65  _type) );.    le
16760 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  n = pMem->n;.   
16770 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65   memcpy(buf, pMe
16780 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  m->z, len);.    
16790 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
167a0 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
167b0 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
167c0 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
167d0 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73  ./* Input "x" is
167e0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75   a sequence of u
167f0 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65  nsigned characte
16800 72 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  rs that represen
16810 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61  t a.** big-endia
16820 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75  n integer.  Retu
16830 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  rn the equivalen
16840 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72  t native integer
16850 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f  .*/.#define ONE_
16860 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
16870 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66  (i8)(x)[0]).#def
16880 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  ine TWO_BYTE_INT
16890 28 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29  (x)    (256*(i8)
168a0 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29  ((x)[0])|(x)[1])
168b0 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42  .#define THREE_B
168c0 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35  YTE_INT(x)  (655
168d0 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  36*(i8)((x)[0])|
168e0 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[1]<<8)|(x)[
168f0 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52  2]).#define FOUR
16900 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28  _BYTE_UINT(x)  (
16910 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34  ((u32)(x)[0]<<24
16920 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
16930 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
16940 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
16950 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37  BYTE_INT(x) (167
16960 37 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30  77216*(i8)((x)[0
16970 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c  ])|((x)[1]<<16)|
16980 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[2]<<8)|(x)[
16990 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72  3])../*.** Deser
169a0 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20  ialize the data 
169b0 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20  blob pointed to 
169c0 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c  by buf as serial
169d0 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70   type serial_typ
169e0 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74  e.** and store t
169f0 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65  he result in pMe
16a00 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  m.  Return the n
16a10 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
16a20 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
16a30 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
16a40 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73  emented as two s
16a50 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73  eparate routines
16a60 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65   for performance
16a70 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73  ..** The few cas
16a80 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  es that require 
16a90 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
16aa0 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69  are broken out i
16ab0 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a  nto a separate.*
16ac0 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  * routine so tha
16ad0 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20  t in most cases 
16ae0 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
16af0 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b  moving the stack
16b00 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61   pointer.** is a
16b10 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74  voided..*/ .stat
16b20 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f  ic u32 SQLITE_NO
16b30 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74  INLINE serialGet
16b40 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
16b50 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
16b60 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
16b70 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
16b80 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
16b90 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
16ba0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
16bb0 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
16bc0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16be0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
16bf0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
16c00 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75  e into */.){.  u
16c10 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
16c20 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33  _UINT(buf);.  u3
16c30 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  2 y = FOUR_BYTE_
16c40 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78  UINT(buf+4);.  x
16c50 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a   = (x<<32) + y;.
16c60 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
16c70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 70 4d 65 6d  e==6 ){.    pMem
16c80 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
16c90 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  x;.    pMem->fla
16ca0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
16cb0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
16cc0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c  ->u.i<0 );.  }el
16cd0 73 65 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64  se{.#if !defined
16ce0 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
16cf0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16d00 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
16d10 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
16d20 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
16d30 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
16d40 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
16d50 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20  ame.    ** byte 
16d60 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74  order.  Or, that
16d70 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44   if SQLITE_MIXED
16d80 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
16d90 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  OAT is.    ** de
16da0 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
16db0 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
16dc0 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
16dd0 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20  re mixed.    ** 
16de0 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20  endian..    */. 
16df0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
16e00 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
16e10 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
16e20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
16e30 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
16e40 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74  ;.    u64 t2 = t
16e50 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  1;.    swapMixed
16e60 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
16e70 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
16e80 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28  eof(r1)==sizeof(
16e90 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72  t2) && memcmp(&r
16ea0 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72  1, &t2, sizeof(r
16eb0 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  1))==0 );.#endif
16ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
16ed0 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
16ee0 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d  eof(pMem->u.r)==
16ef0 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78  8 );.    swapMix
16f00 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
16f10 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d  ;.    memcpy(&pM
16f20 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a  em->u.r, &x, siz
16f30 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65  eof(x));.    pMe
16f40 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
16f50 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e  e3IsNaN(pMem->u.
16f60 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20  r) ? MEM_Null : 
16f70 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20  MEM_Real;.  }.  
16f80 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20  return 8;.}.u32 
16f90 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16fa0 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
16fb0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
16fc0 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
16fd0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
16fe0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
16ff0 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
17000 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
17010 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
17020 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
17030 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
17040 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
17050 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
17060 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
17070 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
17080 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
17090 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65  se 10:   /* Rese
170a0 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
170b0 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
170c0 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  11:   /* Reserve
170d0 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
170e0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20   */.    case 0: 
170f0 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20  {  /* NULL */.  
17100 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
17110 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
17120 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
17130 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
17140 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
17150 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
17160 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42  Mem->u.i = ONE_B
17170 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
17180 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
17190 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
171a0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
171b0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
171c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
171d0 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
171e0 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
171f0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
17200 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f  pMem->u.i = TWO_
17210 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
17220 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
17230 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
17240 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
17250 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
17260 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
17270 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
17280 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
17290 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
172a0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52   pMem->u.i = THR
172b0 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  EE_BYTE_INT(buf)
172c0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
172d0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
172e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
172f0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
17300 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
17310 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
17320 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
17330 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
17340 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
17350 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75  FOUR_BYTE_INT(bu
17360 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
17370 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
17380 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17390 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
173a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
173b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
173c0 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
173d0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
173e0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
173f0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
17400 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34  (buf+2) + (((i64
17410 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
17420 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
17430 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
17440 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
17450 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
17460 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
17470 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
17480 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
17490 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
174a0 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
174b0 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
174c0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
174d0 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75        /* These u
174e0 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  se local variabl
174f0 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69  es, so do them i
17500 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75  n a separate rou
17510 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  tine.      ** to
17520 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f   avoid having to
17530 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20   move the frame 
17540 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63  pointer in the c
17550 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
17560 20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61      return seria
17570 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f  lGet(buf,serial_
17580 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20  type,pMem);.    
17590 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
175a0 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
175b0 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
175c0 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
175d0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
175e0 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
175f0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
17600 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
17610 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17620 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
17630 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
17640 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
17650 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ] = { MEM_Blob|M
17660 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74  EM_Ephem, MEM_St
17670 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20  r|MEM_Ephem };. 
17680 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
17690 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
176a0 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72    pMem->n = (ser
176b0 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
176c0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
176d0 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c  s = aFlag[serial
176e0 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20  _type&1];.      
176f0 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a  return pMem->n;.
17700 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17710 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68  rn 0;.}./*.** Th
17720 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
17730 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
17740 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
17750 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
17760 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
17770 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
17780 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
17790 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
177a0 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
177b0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
177c0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
177d0 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
177e0 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
177f0 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
17800 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
17810 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
17820 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
17830 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
17840 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
17850 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
17860 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
17870 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
17880 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
17890 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
178a0 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
178b0 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
178c0 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
178d0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
178e0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
178f0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
17900 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
17910 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
17920 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
17930 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
17940 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
17950 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
17960 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
17970 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
17980 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
17990 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
179a0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
179b0 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
179c0 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
179d0 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
179e0 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
179f0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
17a00 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
17a10 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
17a20 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  d */.  char *pSp
17a30 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
17a40 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
17a50 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
17a60 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  ble */.  int szS
17a70 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
17a80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
17a90 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
17aa0 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
17ab0 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20  **ppFree        
17ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
17ad0 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64  T: Caller should
17ae0 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74   free this point
17af0 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  er */.){.  Unpac
17b00 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
17b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
17b20 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
17b30 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
17b40 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b60 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65  Increment pSpace
17b70 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67   by nOff to alig
17b80 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  n it */.  int nB
17b90 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
17ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17bb0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
17bc0 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
17bd0 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  /* We want to
17be0 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
17bf0 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
17c00 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
17c10 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
17c20 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
17c30 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
17c40 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
17c50 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
17c60 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
17c70 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
17c80 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
17c90 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
17ca0 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
17cb0 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
17cc0 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
17cd0 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
17ce0 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d  ) & 7;.  nByte =
17cf0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
17d00 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
17d10 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
17d20 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
17d30 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  1);.  if( nByte>
17d40 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a  szSpace+nOff ){.
17d50 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
17d60 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65  dRecord *)sqlite
17d70 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
17d80 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
17d90 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  );.    *ppFree =
17da0 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20   (char *)p;.    
17db0 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
17dc0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
17dd0 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
17de0 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66  ord*)&pSpace[nOf
17df0 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  f];.    *ppFree 
17e00 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61  = 0;.  }..  p->a
17e10 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
17e20 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
17e30 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
17e40 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
17e50 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
17e60 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
17e70 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
17e80 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
17e90 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
17ea0 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
17eb0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
17ec0 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
17ed0 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
17ee0 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
17ef0 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
17f00 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
17f10 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
17f20 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
17f30 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
17f40 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
17f50 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
17f60 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
17f70 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
17f80 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
17f90 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
17fa0 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
17fb0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
17fc0 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
17fd0 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
17fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
17ff0 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
18000 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
18010 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
18020 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
18030 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
18040 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
18050 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
18060 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
18070 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
18080 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
18090 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
180a0 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
180b0 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
180c0 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
180d0 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
180f0 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
18100 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
18110 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
18140 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
18150 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
18160 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
18170 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c  em;..  p->defaul
18180 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t_rc = 0;.  asse
18190 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
181a0 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
181b0 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
181c0 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
181d0 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
181e0 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
181f0 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
18200 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75  d<=nKey ){.    u
18210 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
18220 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
18230 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
18240 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
18250 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
18260 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
18270 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
18280 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
18290 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73    /* pMem->flags
182a0 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33   = 0; // sqlite3
182b0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
182c0 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f  will set this fo
182d0 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  r us */.    pMem
182e0 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
182f0 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
18300 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
18310 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
18320 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
18330 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20  pMem++;.    if( 
18340 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64  (++u)>=p->nField
18350 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
18360 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
18370 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
18380 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
18390 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54   u;.}..#if SQLIT
183a0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
183b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
183c0 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f  ares two index o
183d0 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b  r table record k
183e0 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  eys in the same 
183f0 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71  way.** as the sq
18400 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
18410 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65  ompare() routine
18420 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63  . Unlike VdbeRec
18430 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a  ordCompare(),.**
18440 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
18450 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20  eserializes and 
18460 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20  compares values 
18470 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  using the.** sql
18480 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
18490 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d  t() and sqlite3M
184a0 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63  emCompare() func
184b0 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65  tions. It is use
184c0 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  d.** in assert()
184d0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
184e0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f  nsure that the o
184f0 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e  ptimized code in
18500 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52  .** sqlite3VdbeR
18510 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72  ecordCompare() r
18520 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77  eturns results w
18530 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72  ith these two pr
18540 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20  imitives..**.** 
18550 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
18560 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
18570 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76  parison is equiv
18580 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64  alent to desired
18590 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72  Result..** Retur
185a0 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65  n false if there
185b0 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65   is a disagreeme
185c0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
185d0 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
185e0 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20  areDebug(.  int 
185f0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
18600 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
18610 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  t key */.  const
18620 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
18630 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68  *pPKey2, /* Righ
18640 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  t key */.  int d
18650 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20  esiredResult    
18660 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
18670 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b  ect answer */.){
18680 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
18690 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
186a0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
186b0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
186c0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
186d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
186e0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
186f0 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
18700 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
18710 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
18720 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
18730 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
18740 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
18750 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
18760 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18770 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
18780 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
18790 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
187a0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
187b0 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
187c0 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
187d0 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65  yInfo;.  if( pKe
187e0 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72  yInfo->db==0 ) r
187f0 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e  eturn 1;.  mem1.
18800 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
18810 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
18820 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
18830 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
18840 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
18850 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
18860 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18870 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
18880 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
18890 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
188a0 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
188b0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
188c0 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
188d0 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
188e0 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
188f0 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
18900 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
18910 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
18920 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
18930 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
18940 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
18950 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
18960 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
18970 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
18980 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e  lly be used unin
18990 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64  itialized, and d
189a0 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75  oing .  ** the u
189b0 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69  nnecessary initi
189c0 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20  alization has a 
189d0 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74  measurable negat
189e0 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ive performance.
189f0 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e    ** impact, sin
18a00 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
18a10 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72  is a very high r
18a20 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20  unner.  And so, 
18a30 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74  we choose.  ** t
18a40 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d  o ignore the com
18a50 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
18a60 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61  nd leave this va
18a70 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c  riable uninitial
18a80 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20  ized..  */.  /* 
18a90 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
18aa0 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  // not needed, h
18ab0 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
18ac0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
18ad0 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  */.  .  idx1 = g
18ae0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
18af0 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20  , szHdr1);.  d1 
18b00 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
18b10 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
18b20 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ield+pKeyInfo->n
18b30 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
18b40 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50  nField || CORRUP
18b50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
18b60 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
18b70 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
18b80 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
18b90 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
18ba0 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
18bb0 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
18bc0 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
18bd0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
18be0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
18bf0 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
18c00 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
18c10 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
18c20 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
18c30 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
18c40 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
18c50 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
18c60 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
18c70 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
18c80 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
18c90 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
18ca0 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
18cb0 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
18cc0 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
18cd0 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
18ce0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
18cf0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
18d00 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
18d10 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
18d20 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
18d30 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
18d40 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
18d50 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
18d60 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
18d70 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
18d80 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
18d90 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
18da0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
18db0 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  f( d1+serial_typ
18dc0 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a  e1+2>(u32)nKey1.
18dd0 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74       && d1+sqlit
18de0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
18df0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
18e00 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20  )>(u32)nKey1 .  
18e10 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
18e20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18e30 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
18e40 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
18e50 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
18e60 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
18e70 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
18e80 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
18e90 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
18ea0 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
18eb0 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
18ec0 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
18ed0 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
18ee0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20  PKey2->aMem[i], 
18ef0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
18f00 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
18f10 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
18f20 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
18f30 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
18f40 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
18f50 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
18f60 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
18f70 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
18f80 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65   = -rc;  /* Inve
18f90 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f  rt the result fo
18fa0 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  r DESC sort orde
18fb0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  r. */.      }.  
18fc0 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f      goto debugCo
18fd0 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a  mpareEnd;.    }.
18fe0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c      i++;.  }whil
18ff0 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
19000 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
19010 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ld );..  /* No m
19020 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
19030 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
19040 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
19050 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
19060 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
19070 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
19080 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
19090 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
190a0 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
190b0 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
190c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
190d0 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
190e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
190f0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
19100 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
19110 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
19120 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
19130 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
19140 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
19150 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
19160 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
19170 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
19180 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
19190 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20  value.  */.  rc 
191a0 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
191b0 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70  t_rc;..debugComp
191c0 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65  areEnd:.  if( de
191d0 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26  siredResult==0 &
191e0 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  & rc==0 ) return
191f0 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
19200 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c  dResult<0 && rc<
19210 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
19220 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
19230 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65  t>0 && rc>0 ) re
19240 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f  turn 1;.  if( CO
19250 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
19260 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  n 1;.  if( pKeyI
19270 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
19280 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
19290 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
192a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f  #endif../*.** Bo
192b0 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70  th *pMem1 and *p
192c0 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72  Mem2 contain str
192d0 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  ing values. Comp
192e0 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
192f0 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  es.** using the 
19300 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19310 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75  ce pColl. As usu
19320 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67  al, return a neg
19330 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20  ative , zero.** 
19340 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  or positive valu
19350 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c  e if *pMem1 is l
19360 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
19370 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
19380 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72  an .** *pMem2, r
19390 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d  espectively. Sim
193a0 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74  ilar in spirit t
193b0 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29  o "rc = (*pMem1)
193c0 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a   - (*pMem2);"..*
193d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
193e0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
193f0 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  g(.  const Mem *
19400 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d  pMem1,.  const M
19410 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e  em *pMem2,.  con
19420 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
19430 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20  l,.  u8 *prcErr 
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f       /* If an OO
19460 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f  M occurs, set to
19470 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f   SQLITE_NOMEM */
19480 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d  .){.  if( pMem1-
19490 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
194a0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   ){.    /* The s
194b0 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61  trings are alrea
194c0 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  dy in the correc
194d0 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c  t encoding.  Cal
194e0 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f  l the.     ** co
194f0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
19500 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20  n directly */.  
19510 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e    return pColl->
19520 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
19530 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31  r,pMem1->n,pMem1
19540 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65  ->z,pMem2->n,pMe
19550 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  m2->z);.  }else{
19560 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
19570 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c   const void *v1,
19580 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31   *v2;.    int n1
19590 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31  , n2;.    Mem c1
195a0 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20  ;.    Mem c2;.  
195b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
195c0 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d  Init(&c1, pMem1-
195d0 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
195e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
195f0 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d  emInit(&c2, pMem
19600 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
19610 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19620 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
19630 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f  &c1, pMem1, MEM_
19640 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  Ephem);.    sqli
19650 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
19660 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32  wCopy(&c2, pMem2
19670 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
19680 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61    v1 = sqlite3Va
19690 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
196a0 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f  _value*)&c1, pCo
196b0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31  ll->enc);.    n1
196c0 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63   = v1==0 ? 0 : c
196d0 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71  1.n;.    v2 = sq
196e0 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28  lite3ValueText((
196f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26  sqlite3_value*)&
19700 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  c2, pColl->enc);
19710 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20  .    n2 = v2==0 
19720 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20  ? 0 : c2.n;.    
19730 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  rc = pColl->xCmp
19740 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e  (pColl->pUser, n
19750 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a  1, v1, n2, v2);.
19760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
19770 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a  emRelease(&c1);.
19780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
19790 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a  emRelease(&c2);.
197a0 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c      if( (v1==0 |
197b0 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45  | v2==0) && prcE
197c0 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53  rr ) *prcErr = S
197d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
197e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
197f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
19800 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74   two blobs.  Ret
19810 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
19820 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
19830 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  if the first.** 
19840 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
19850 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
19860 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
19870 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  nd, respectively
19880 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62  ..** If one blob
19890 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
198a0 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20  the other, then 
198b0 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74  the shorter is t
198c0 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74  he lessor..*/.st
198d0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
198e0 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33  LINE int sqlite3
198f0 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73  BlobCompare(cons
19900 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73  t Mem *pB1, cons
19910 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69  t Mem *pB2){.  i
19920 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42  nt c = memcmp(pB
19930 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42  1->z, pB2->z, pB
19940 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42  1->n>pB2->n ? pB
19950 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a  2->n : pB1->n);.
19960 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e    if( c ) return
19970 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31   c;.  return pB1
19980 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a  ->n - pB2->n;.}.
19990 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
199a0 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61  the values conta
199b0 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20  ined by the two 
199c0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65  memory cells, re
199d0 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74  turning.** negat
199e0 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73  ive, zero or pos
199f0 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69  itive if pMem1 i
19a00 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
19a10 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
19a20 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e  r.** than pMem2.
19a30 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69   Sorting order i
19a40 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20  s NULL's first, 
19a50 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62  followed by numb
19a60 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a  ers (integers.**
19a70 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74   and reals) sort
19a80 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20  ed numerically, 
19a90 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74  followed by text
19aa0 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20   ordered by the 
19ab0 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
19ac0 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20  uence pColl and 
19ad0 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f  finally blob's o
19ae0 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70  rdered by memcmp
19af0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  ()..**.** Two NU
19b00 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  LL values are co
19b10 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62  nsidered equal b
19b20 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
19b30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
19b40 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  emCompare(const 
19b50 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73  Mem *pMem1, cons
19b60 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f  t Mem *pMem2, co
19b70 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
19b80 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66  ll){.  int f1, f
19b90 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65  2;.  int combine
19ba0 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d  d_flags;..  f1 =
19bb0 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20   pMem1->flags;. 
19bc0 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61   f2 = pMem2->fla
19bd0 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66  gs;.  combined_f
19be0 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20  lags = f1|f2;.  
19bf0 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65  assert( (combine
19c00 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  d_flags & MEM_Ro
19c10 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20  wSet)==0 );. .  
19c20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
19c30 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c  is NULL, it is l
19c40 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ess than the oth
19c50 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  er. If both valu
19c60 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  es.  ** are NULL
19c70 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f  , return 0..  */
19c80 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
19c90 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
19ca0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32  {.    return (f2
19cb0 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31  &MEM_Null) - (f1
19cc0 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  &MEM_Null);.  }.
19cd0 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
19ce0 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72 20 61  ue is a number a
19cf0 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20  nd the other is 
19d00 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  not, the number 
19d10 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
19d20 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62 65 72   both are number
19d30 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20 72 65  s, compare as re
19d40 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20 61 20  als if one is a 
19d50 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65  real, or as inte
19d60 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74  gers.  ** if bot
19d70 68 20 76 61 6c 75 65 73 20 61 72 65 20 69 6e 74  h values are int
19d80 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  egers..  */.  if
19d90 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
19da0 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  &(MEM_Int|MEM_Re
19db0 61 6c 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c  al) ){.    doubl
19dc0 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 69 66  e r1, r2;.    if
19dd0 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
19de0 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
19df0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
19e00 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   < pMem2->u.i ) 
19e10 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
19e20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
19e30 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  > pMem2->u.i ) r
19e40 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 72  eturn 1;.      r
19e50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
19e60 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52     if( (f1&MEM_R
19e70 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
19e80 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e 75 2e 72   r1 = pMem1->u.r
19e90 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
19ea0 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f1&MEM_Int)!=0 
19eb0 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 28 64  ){.      r1 = (d
19ec0 6f 75 62 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69  ouble)pMem1->u.i
19ed0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19ee0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
19ef0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 26 4d   }.    if( (f2&M
19f00 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
19f10 20 20 20 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d       r2 = pMem2-
19f20 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20  >u.r;.    }else 
19f30 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29  if( (f2&MEM_Int)
19f40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20  !=0 ){.      r2 
19f50 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d  = (double)pMem2-
19f60 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  >u.i;.    }else{
19f70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
19f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19f90 72 31 3c 72 32 20 29 20 72 65 74 75 72 6e 20 2d  r1<r2 ) return -
19fa0 31 3b 0a 20 20 20 20 69 66 28 20 72 31 3e 72 32  1;.    if( r1>r2
19fb0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
19fc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
19fd0 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
19fe0 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e  e is a string an
19ff0 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61  d the other is a
1a000 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e   blob, the strin
1a010 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  g is less..  ** 
1a020 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69  If both are stri
1a030 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69  ngs, compare usi
1a040 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ng the collating
1a050 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
1a060 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1a070 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
1a080 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d  .    if( (f1 & M
1a090 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1a0a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1a0b0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20    }.    if( (f2 
1a0c0 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1a0d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1a0e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
1a0f0 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1a100 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20  =pMem2->enc );. 
1a110 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1a120 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1a130 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  F8 || .         
1a140 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53     pMem1->enc==S
1a150 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c  QLITE_UTF16LE ||
1a160 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1a170 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a  ITE_UTF16BE );..
1a180 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
1a190 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75  tion sequence mu
1a1a0 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74  st be defined at
1a1b0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65   this point, eve
1a1c0 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  n if.    ** the 
1a1d0 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65  user deletes the
1a1e0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1a1f0 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64  nce after the vd
1a200 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20  be program is.  
1a210 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74    ** compiled (t
1a220 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61  his was not alwa
1a230 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20  ys the case)..  
1a240 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1a250 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c   !pColl || pColl
1a260 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69  ->xCmp );..    i
1a270 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
1a280 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d    return vdbeCom
1a290 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d  pareMemString(pM
1a2a0 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c  em1, pMem2, pCol
1a2b0 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 0);.    }.   
1a2c0 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f   /* If a NULL po
1a2d0 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64  inter was passed
1a2e0 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20   as the collate 
1a2f0 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74  function, fall t
1a300 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f  hrough.    ** to
1a310 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61   the blob case a
1a320 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e  nd use memcmp().
1a330 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20    */.  }. .  /* 
1a340 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74  Both values must
1a350 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70   be blobs.  Comp
1a360 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  are using memcmp
1a370 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ().  */.  return
1a380 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1a390 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32  are(pMem1, pMem2
1a3a0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
1a3b0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1a3c0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1a3d0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72  unction is a ser
1a3e0 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a  ial-type that.**
1a3f0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1a400 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c  an integer - all
1a410 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
1a420 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76  1 and 9 inclusiv
1a430 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20  e .** except 7. 
1a440 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74  The second point
1a450 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
1a460 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65  ntaining an inte
1a470 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72  ger value.** ser
1a480 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e  ialized accordin
1a490 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65  g to serial_type
1a4a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1a4b0 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20  deserializes.** 
1a4c0 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20  and returns the 
1a4d0 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
1a4e0 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44   i64 vdbeRecordD
1a4f0 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72  ecodeInt(u32 ser
1a500 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ial_type, const 
1a510 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
1a520 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   y;.  assert( CO
1a530 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72  RRUPT_DB || (ser
1a540 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73  ial_type>=1 && s
1a550 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26  erial_type<=9 &&
1a560 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29   serial_type!=7)
1a570 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
1a580 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1a590 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73   case 0:.    cas
1a5a0 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 1:.      testc
1a5b0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1a5c0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1a5d0 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  n ONE_BYTE_INT(a
1a5e0 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32  Key);.    case 2
1a5f0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1a600 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1a610 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1a620 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1a630 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20  );.    case 3:. 
1a640 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1a650 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1a660 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45       return THRE
1a670 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1a680 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a  ;.    case 4: {.
1a690 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a6a0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1a6b0 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
1a6c0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1a6d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1a6e0 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
1a6f0 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1a700 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a710 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1a720 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f  .      return FO
1a730 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1a740 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
1a750 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1a760 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  NT(aKey);.    }.
1a770 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20      case 6: {.  
1a780 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52      u64 x = FOUR
1a790 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1a7a0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a7b0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1a7c0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1a7d0 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1a7e0 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1a7f0 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1a800 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d  *(i64*)&x;.    }
1a810 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
1a820 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29  serial_type - 8)
1a830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1a840 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
1a850 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
1a860 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65  rows or index re
1a870 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69  cords.** specifi
1a880 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b  ed by {nKey1, pK
1a890 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e  ey1} and pPKey2.
1a8a0 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e    It returns a n
1a8b0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
1a8c0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
1a8d0 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20  eger if key1 is 
1a8e0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1a8f0 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74   to or .** great
1a900 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54  er than key2.  T
1a910 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  he {nKey1, pKey1
1a920 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  } key must be a 
1a930 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20  blob.** created 
1a940 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1a950 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
1a960 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
1a970 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
1a980 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
1a990 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
1a9a0 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
1a9b0 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
1a9c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
1a9d0 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e  ent bSkip is non
1a9e0 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73  -zero, it is ass
1a9f0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
1aa00 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1aa10 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74  .** determined t
1aa20 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69  hat the first fi
1aa30 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73  elds of the keys
1aa40 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a   are equal..**.*
1aa50 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
1aa60 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
1aa70 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
1aa80 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1aa90 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65  . If all .** fie
1aaa0 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20  lds that appear 
1aab0 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65  in both keys are
1aac0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b   equal, then pPK
1aad0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1aae0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
1aaf0 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61  .**.** If databa
1ab00 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1ab10 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74   discovered, set
1ab20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1ab30 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43   to .** SQLITE_C
1ab40 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72  ORRUPT and retur
1ab50 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65  n 0. If an OOM e
1ab60 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1ab70 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d  red, .** pPKey2-
1ab80 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20  >errCode is set 
1ab90 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1aba0 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  and, if it is no
1abb0 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d  t NULL, the.** m
1abc0 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61  alloc-failed fla
1abd0 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73  g set on databas
1abe0 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32  e handle (pPKey2
1abf0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e  ->pKeyInfo->db).
1ac00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1ac10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1ac20 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20  WithSkip(.  int 
1ac30 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1ac40 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
1ac50 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1ac60 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1ac70 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2,         /* 
1ac80 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1ac90 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20  nt bSkip        
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1acb0 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20  * If true, skip 
1acc0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1acd0 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acf0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1ad00 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1ad10 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1ad20 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  nt */.  int i;  
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad40 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1ad50 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74   of next field t
1ad60 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75  o compare */.  u
1ad70 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ad90 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64  * Size of record
1ada0 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
1adb0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1add0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1ade0 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e  of first type in
1adf0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
1ae00 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1ae30 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50    Mem *pRhs = pP
1ae40 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20  Key2->aMem;     
1ae50 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20    /* Next field 
1ae60 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d  of pPKey2 to com
1ae70 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  pare */.  KeyInf
1ae80 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  o *pKeyInfo = pP
1ae90 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
1aea0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1aeb0 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
1aec0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1aed0 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d  har *)pKey1;.  M
1aee0 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49  em mem1;..  /* I
1aef0 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c  f bSkip is true,
1af00 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
1af10 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74   has already det
1af20 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
1af30 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20   first.  ** two 
1af40 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1af50 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20  keys are equal. 
1af60 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20  Fix the various 
1af70 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20  stack variables 
1af80 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69  so.  ** that thi
1af90 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73  s routine begins
1afa0 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68   comparing at th
1afb0 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20  e second field. 
1afc0 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29  */.  if( bSkip )
1afd0 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20  {.    u32 s1;.  
1afe0 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74    idx1 = 1 + get
1aff0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1b000 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48  1], s1);.    szH
1b010 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  dr1 = aKey1[0];.
1b020 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20      d1 = szHdr1 
1b030 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  + sqlite3VdbeSer
1b040 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a  ialTypeLen(s1);.
1b050 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70      i = 1;.    p
1b060 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rhs++;.  }else{.
1b070 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61      idx1 = getVa
1b080 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1b090 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20  Hdr1);.    d1 = 
1b0a0 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20  szHdr1;.    if( 
1b0b0 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  d1>(unsigned)nKe
1b0c0 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b  y1 ){ .      pPK
1b0d0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1b0e0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1b0f0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
1b100 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72  turn 0;  /* Corr
1b110 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
1b120 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a      i = 0;.  }..
1b130 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1b140 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
1b150 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
1b160 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
1b170 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65  ements */.  asse
1b180 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1b190 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b  Info->nField+pPK
1b1a0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1b1b0 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
1b1c0 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c  nField .       |
1b1d0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1b1e0 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1b1f0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
1b200 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
1b210 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1b220 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1b230 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1b240 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1b250 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1b260 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1b270 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20  l_type;..    /* 
1b280 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65  RHS is an intege
1b290 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68  r */.    if( pRh
1b2a0 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  s->flags & MEM_I
1b2b0 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  nt ){.      seri
1b2c0 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1b2d0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73  idx1];.      tes
1b2e0 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1b2f0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1b300 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1b310 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =12 ){.        r
1b320 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1b330 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1b340 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1b350 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1b360 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1b370 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1b380 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20       double rhs 
1b390 3d 20 28 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e  = (double)pRhs->
1b3a0 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  u.i;.        sql
1b3b0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1b3c0 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1b3d0 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
1b3e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
1b3f0 65 6d 31 2e 75 2e 72 3c 72 68 73 20 29 7b 0a 20  em1.u.r<rhs ){. 
1b400 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1b410 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b420 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 72 68 73  if( mem1.u.r>rhs
1b430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1b440 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1b450 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b460 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20        i64 lhs = 
1b470 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1b480 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c  Int(serial_type,
1b490 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20   &aKey1[d1]);.  
1b4a0 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20        i64 rhs = 
1b4b0 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
1b4c0 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
1b4d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1b4e0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1b4f0 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
1b500 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1b510 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1b520 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1b530 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c    /* RHS is real
1b540 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1b550 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1b560 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
1b570 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1b580 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1b590 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1b5a0 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 20  e>=12 ){.       
1b5b0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1b5c0 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1b5d0 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
1b5e0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1b5f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b600 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 70    double rhs = p
1b610 52 68 73 2d 3e 75 2e 72 3b 0a 20 20 20 20 20 20  Rhs->u.r;.      
1b620 20 20 64 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20    double lhs;.  
1b630 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b640 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1b650 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1b660 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
1b670 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1b680 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1b690 20 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 75      lhs = mem1.u
1b6a0 2e 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  .r;.        }els
1b6b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73  e{.          lhs
1b6c0 20 3d 20 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e   = (double)mem1.
1b6d0 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  u.i;.        }. 
1b6e0 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72         if( lhs<r
1b6f0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1b700 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1b710 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72   }else if( lhs>r
1b720 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1b730 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1b740 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1b750 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1b760 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  a string */.    
1b770 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1b780 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
1b790 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
1b7a0 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1b7b0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1b7c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b7d0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1b7e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1b7f0 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
1b800 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1b810 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b820 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
1b830 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
1b840 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1b850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
1b860 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em1.n = (serial_
1b870 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1b880 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1b890 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28  ( (d1+mem1.n)==(
1b8a0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1b8b0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1b8c0 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31  se( (d1+mem1.n+1
1b8d0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1b8e0 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
1b8f0 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20  ( (d1+mem1.n) > 
1b900 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1b910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
1b920 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1b930 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1b940 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1b950 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1b960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1b970 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1b980 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b      }else if( pK
1b990 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1b9a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1b9b0 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
1b9c0 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  o->enc;.        
1b9d0 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
1b9e0 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20  Info->db;.      
1b9f0 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d      mem1.flags =
1ba00 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20   MEM_Str;.      
1ba10 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68      mem1.z = (ch
1ba20 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a  ar*)&aKey1[d1];.
1ba30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
1ba40 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1ba50 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20 20  ing(.           
1ba60 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20     &mem1, pRhs, 
1ba70 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1ba80 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72  i], &pPKey2->err
1ba90 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 29  Code.          )
1baa0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1bab0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1bac0 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e  Cmp = MIN(mem1.n
1bad0 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
1bae0 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
1baf0 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
1bb00 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
1bb10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1bb20 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20  0 ) rc = mem1.n 
1bb30 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20  - pRhs->n; .    
1bb40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1bb50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1bb60 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20  is a blob */.   
1bb70 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
1bb80 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
1bb90 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72   ){.      getVar
1bba0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
1bbb0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
1bbc0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bbd0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1bbe0 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1bbf0 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c  erial_type<12 ||
1bc00 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20   (serial_type & 
1bc10 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
1bc20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1bc30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1bc40 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61  nt nStr = (seria
1bc50 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
1bc60 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1bc70 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28  se( (d1+nStr)==(
1bc80 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1bc90 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1bca0 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d  se( (d1+nStr+1)=
1bcb0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1bcc0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1bcd0 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73  (d1+nStr) > (uns
1bce0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
1bcf0 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
1bd00 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1bd10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1bd20 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
1bd30 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1bd40 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
1bd50 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1bd60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1bd70 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
1bd80 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  nStr, pRhs->n);.
1bd90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1bda0 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1bdb0 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1bdc0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1bdd0 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74  rc==0 ) rc = nSt
1bde0 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20  r - pRhs->n;.   
1bdf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1be00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1be10 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   is null */.    
1be20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69  else{.      seri
1be30 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1be40 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  idx1];.      rc 
1be50 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  = (serial_type!=
1be60 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
1be70 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1be80 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1be90 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
1bea0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
1beb0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1bec0 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
1bed0 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1bee0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1bef0 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20  Key2, rc) );.   
1bf00 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
1bf10 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  szMalloc==0 );  
1bf20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
1bf30 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  elow */.      re
1bf40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1bf50 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68      i++;.    pRh
1bf60 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73  s++;.    d1 += s
1bf70 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1bf80 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1bf90 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b  ype);.    idx1 +
1bfa0 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  = sqlite3VarintL
1bfb0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
1bfc0 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1bfd0 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31  (unsigned)szHdr1
1bfe0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
1bff0 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73  ield && d1<=(uns
1c000 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a  igned)nKey1 );..
1c010 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1c020 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1c030 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1c040 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1c050 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
1c060 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
1c070 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1c080 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1c090 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1c0a0 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1c0b0 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1c0c0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1c0d0 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73  &mem1).  */.  as
1c0e0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1c0f0 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1c100 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1c110 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74   that one or bot
1c120 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  h of the keys ra
1c130 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1c140 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1c150 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1c160 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1c170 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1c180 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
1c190 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73  value.  */.  ass
1c1a0 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
1c1b0 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52  .       || vdbeR
1c1c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1c1d0 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1c1e0 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e  pPKey2, pPKey2->
1c1f0 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20  default_rc) .   
1c200 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d      || pKeyInfo-
1c210 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1c220 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  d.  );.  return 
1c230 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1c240 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
1c250 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1c260 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  re(.  int nKey1,
1c270 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1c280 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1c290 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1c2a0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
1c2b0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1c2c0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75  key */.){.  retu
1c2d0 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
1c2e0 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
1c2f0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1c300 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  2, 0);.}.../*.**
1c310 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1c320 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
1c330 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
1c340 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1c350 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61  re() .** that (a
1c360 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
1c370 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61  d of pPKey2 is a
1c380 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28  n integer, and (
1c390 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d  b) the .** size-
1c3a0 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
1c3b0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1c3c0 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66   (pKey1/nKey1) f
1c3d0 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a  its in a single.
1c3e0 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73  ** byte (i.e. is
1c3f0 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e   less than 128).
1c400 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
1c410 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62  concerns about b
1c420 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c  uffer overreads,
1c430 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c440 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e   only used.** on
1c450 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20 74   schemas where t
1c460 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64  he maximum valid
1c470 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
1c480 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73  63 bytes or less
1c490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c4a0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1c4b0 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79  eInt(.  int nKey
1c4c0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1c4d0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1c4e0 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1c4f0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
1c500 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1c510 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
1c520 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f  u8 *aKey = &((co
1c530 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a  nst u8*)pKey1)[*
1c540 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1c550 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20   & 0x3F];.  int 
1c560 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28  serial_type = ((
1c570 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29  const u8*)pKey1)
1c580 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  [1];.  int res;.
1c590 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78    u32 y;.  u64 x
1c5a0 3b 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b 65  ;.  i64 v = pPKe
1c5b0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b  y2->aMem[0].u.i;
1c5c0 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 61  .  i64 lhs;..  a
1c5d0 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b  ssert( (*(u8*)pK
1c5e0 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f  ey1)<=0x3F || CO
1c5f0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77  RRUPT_DB );.  sw
1c600 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1c610 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a  e ){.    case 1:
1c620 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
1c630 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1c640 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42       lhs = ONE_B
1c650 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1c660 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1c670 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1c680 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c690 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
1c6a0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c6b0 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1c6c0 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
1c6d0 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1c6e0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1c6f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c700 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
1c710 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
1c720 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1c730 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54   lhs = THREE_BYT
1c740 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1c750 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1c760 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1c770 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1c780 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
1c790 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1c7a0 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  */.      y = FOU
1c7b0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1c7c0 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28  );.      lhs = (
1c7d0 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
1c7e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1c7f0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1c800 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c810 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
1c820 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c830 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1c840 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1c850 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
1c860 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1c870 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1c880 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1c890 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1c8a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1c8b0 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65  e 6: { /* 8-byte
1c8c0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1c8d0 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55  */.      x = FOU
1c8e0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1c8f0 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
1c900 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
1c910 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
1c920 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34       lhs = *(i64
1c930 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&x;.      test
1c940 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1c950 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c960 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20  }.    case 8: . 
1c970 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20       lhs = 0;.  
1c980 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1c990 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73  ase 9:.      lhs
1c9a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
1c9b0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  k;..    /* This 
1c9c0 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65  case could be re
1c9d0 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68  moved without ch
1c9e0 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c  anging the resul
1c9f0 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20  ts of running.  
1ca00 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20    ** this code. 
1ca10 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75  Including it cau
1ca20 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72  ses gcc to gener
1ca30 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69  ate a faster swi
1ca40 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74  tch .    ** stat
1ca50 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65  ement (since the
1ca60 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68   range of switch
1ca70 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61   targets now sta
1ca80 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a  rts at zero and.
1ca90 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67      ** is contig
1caa0 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e  uous) but does n
1cab0 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70  ot cause any dup
1cac0 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62  licate code to b
1cad0 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20  e generated.    
1cae0 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c  ** (as gcc is cl
1caf0 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63  ever enough to c
1cb00 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c  ombine the two l
1cb10 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65  ike cases). Othe
1cb20 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  r .    ** compil
1cb30 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d  ers might be sim
1cb40 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63  ilar.  */ .    c
1cb50 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20  ase 0: case 7:. 
1cb60 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1cb70 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1cb80 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
1cb90 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20  1, pPKey2);..   
1cba0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1cbb0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1cbc0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1cbd0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1cbe0 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Key2);.  }..  if
1cbf0 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v>lhs ){.    r
1cc00 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
1cc10 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c  .  }else if( v<l
1cc20 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
1cc30 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65  pPKey2->r2;.  }e
1cc40 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  lse if( pPKey2->
1cc50 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20  nField>1 ){.    
1cc60 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65  /* The first fie
1cc70 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b  lds of the two k
1cc80 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43  eys are equal. C
1cc90 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c  ompare the trail
1cca0 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ing .    ** fiel
1ccb0 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20  ds.  */.    res 
1ccc0 3d 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  = vdbeRecordComp
1ccd0 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
1cce0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1ccf0 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
1cd00 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
1cd10 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
1cd20 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
1cd30 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
1cd40 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a  o trailing.    *
1cd50 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e  * fields. Return
1cd60 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1cd70 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  _rc in this case
1cd80 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70  . */.    res = p
1cd90 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1cda0 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
1cdb0 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
1cdc0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1cdd0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
1cde0 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  es) );.  return 
1cdf0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  res;.}../*.** Th
1ce00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1ce10 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
1ce20 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
1ce30 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1ce40 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
1ce50 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
1ce60 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 74  f pPKey2 is a st
1ce70 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74  ring, that (b) t
1ce80 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a  he first field.*
1ce90 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  * uses the colla
1cea0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
1ceb0 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 61  NARY and (c) tha
1cec0 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
1ced0 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20  ader varint .** 
1cee0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1cef0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
1cf00 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
1cf10 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  yte..*/.static i
1cf20 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1cf30 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e  pareString(.  in
1cf40 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1cf50 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1cf60 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1cf70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1cf80 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
1cf90 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
1cfa0 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20  const u8 *aKey1 
1cfb0 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  = (const u8*)pKe
1cfc0 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  y1;.  int serial
1cfd0 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73  _type;.  int res
1cfe0 3b 0a 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32  ;..  getVarint32
1cff0 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69  (&aKey1[1], seri
1d000 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20  al_type);.  if( 
1d010 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29  serial_type<12 )
1d020 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
1d030 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20  y2->r1;      /* 
1d040 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
1d050 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e   a number or a n
1d060 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ull */.  }else i
1d070 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65  f( !(serial_type
1d080 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20   & 0x01) ){ .   
1d090 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1d0a0 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  2;      /* (pKey
1d0b0 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c  1/nKey1) is a bl
1d0c0 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ob */.  }else{. 
1d0d0 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20     int nCmp;.   
1d0e0 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69   int nStr;.    i
1d0f0 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31  nt szHdr = aKey1
1d100 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d  [0];..    nStr =
1d110 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
1d120 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28  ) / 2;.    if( (
1d130 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20  szHdr + nStr) > 
1d140 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70  nKey1 ){.      p
1d150 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1d160 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1d170 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1d180 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
1d190 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1d1a0 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d    }.    nCmp = M
1d1b0 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  IN( pPKey2->aMem
1d1c0 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20  [0].n, nStr );. 
1d1d0 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
1d1e0 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70  &aKey1[szHdr], p
1d1f0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a  PKey2->aMem[0].z
1d200 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66  , nCmp);..    if
1d210 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
1d220 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70    res = nStr - p
1d230 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
1d240 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ;.      if( res=
1d250 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
1d260 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
1d270 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
1d280 72 65 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64  res = vdbeRecord
1d290 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
1d2a0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1d2b0 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  Key2, 1);.      
1d2c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d2d0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1d2e0 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
1d2f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1d300 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
1d310 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
1d320 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20  Key2->r2;.      
1d330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1d340 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
1d350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1d360 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
1d370 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1d380 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73  y2->r2;.    }els
1d390 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  e{.      res = p
1d3a0 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d  PKey2->r1;.    }
1d3b0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1d3c0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1d3d0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1d3e0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
1d3f0 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
1d400 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c  UPT_DB.       ||
1d410 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1d420 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
1d430 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
1d440 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
1d450 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1d460 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64   to an sqlite3Vd
1d470 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1d480 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e  ) compatible fun
1d490 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c  ction.** suitabl
1d4a0 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  e for comparing 
1d4b0 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72  serialized recor
1d4c0 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b  ds to the unpack
1d4d0 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64  ed record passed
1d4e0 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  .** as the only 
1d4f0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63  argument..*/.Rec
1d500 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74  ordCompare sqlit
1d510 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
1d520 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e(UnpackedRecord
1d530 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e   *p){.  /* varin
1d540 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
1d550 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65  t() and varintRe
1d560 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1d570 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a  g() both assume.
1d580 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69    ** that the si
1d590 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
1d5a0 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20  int that occurs 
1d5b0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1d5c0 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a  each record.  **
1d5d0 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
1d5e0 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  e byte (i.e. is 
1d5f0 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61  127 or less). va
1d600 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
1d610 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f  eInt().  ** also
1d620 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
1d630 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
1d640 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79  read a buffer by
1d650 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20   at least the . 
1d660 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73   ** maximum poss
1d670 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65  ible legal heade
1d680 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79  r size plus 8 by
1d690 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65  tes. Because the
1d6a0 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61  re is.  ** guara
1d6b0 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c  nteed to be at l
1d6c0 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74  east 74 (but not
1d6d0 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70   136) bytes of p
1d6e0 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
1d6f0 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65   each.  ** buffe
1d700 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69  r passed to vari
1d710 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
1d720 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20  nt() this makes 
1d730 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  it convenient to
1d740 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20  .  ** limit the 
1d750 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
1d760 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69  er to 64 bytes i
1d770 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  n cases where th
1d780 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20  e first field.  
1d790 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ** is an integer
1d7a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1d7b0 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65  easiest way to e
1d7c0 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69  nforce this limi
1d7d0 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  t is to consider
1d7e0 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69   only records wi
1d7f0 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64  th.  ** 13 field
1d800 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68  s or less. If th
1d810 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73  e first field is
1d820 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65   an integer, the
1d830 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20   maximum legal. 
1d840 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20   ** header size 
1d850 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31  is (12*5 + 1 + 1
1d860 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69  ) bytes.  */.  i
1d870 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  f( (p->pKeyInfo-
1d880 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65  >nField + p->pKe
1d890 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c  yInfo->nXField)<
1d8a0 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  =13 ){.    int f
1d8b0 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30  lags = p->aMem[0
1d8c0 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28  ].flags;.    if(
1d8d0 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   p->pKeyInfo->aS
1d8e0 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20  ortOrder[0] ){. 
1d8f0 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a       p->r1 = 1;.
1d900 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31        p->r2 = -1
1d910 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d920 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20     p->r1 = -1;. 
1d930 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a       p->r2 = 1;.
1d940 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1d950 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20  lags & MEM_Int) 
1d960 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d970 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1d980 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eInt;.    }.    
1d990 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
1d9a0 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
1d9b0 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
1d9c0 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  s & MEM_Null );.
1d9d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
1d9e0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
1d9f0 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
1da00 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d   & (MEM_Real|MEM
1da10 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29  _Null|MEM_Blob))
1da20 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e  ==0 && p->pKeyIn
1da30 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20  fo->aColl[0]==0 
1da40 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1da50 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72   flags & MEM_Str
1da60 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1da70 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1da80 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a  reString;.    }.
1da90 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
1daa0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1dab0 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ompare;.}../*.**
1dac0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
1dad0 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
1dae0 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
1daf0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1db00 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
1db10 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
1db20 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
1db30 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
1db40 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
1db50 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1db60 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
1db70 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
1db80 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
1db90 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  ise..**.** pCur 
1dba0 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e  might be pointin
1dbb0 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  g to text obtain
1dbc0 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70  ed from a corrup
1dbd0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  t database file.
1dbe0 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65  .** So the conte
1dbf0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  nt cannot be tru
1dc00 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70  sted.  Do approp
1dc10 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20  riate checks on 
1dc20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  the content..*/.
1dc30 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
1dc40 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20  dxRowid(sqlite3 
1dc50 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  *db, BtCursor *p
1dc60 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
1dc70 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
1dc80 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
1dc90 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
1dca0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1dcb0 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
1dcc0 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
1dcd0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
1dce0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
1dcf0 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
1dd00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1dd10 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
1dd20 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65  m m, v;..  /* Ge
1dd30 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
1dd40 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20  e index entry.  
1dd50 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74  Only indices ent
1dd60 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a  ries of less.  *
1dd70 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20  * than 2GiB are 
1dd80 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69  support - anythi
1dd90 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65  ng large must be
1dda0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1ddb0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63  tion..  ** Any c
1ddc0 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
1ddd0 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33  ected in sqlite3
1dde0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
1ddf0 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a  r(), though, so.
1de00 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63    ** this code c
1de10 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65  an safely assume
1de20 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69   that nCellKey i
1de30 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f  s 32-bits  .  */
1de40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1de50 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
1de60 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
1de70 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
1de80 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
1de90 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
1dea0 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
1deb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
1dec0 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
1ded0 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
1dee0 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
1def0 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  il */.  assert( 
1df00 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
1df10 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
1df20 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
1df30 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
1df40 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
1df50 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
1df60 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  try */.  sqlite3
1df70 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
1df80 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
1df90 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
1dfa0 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
1dfb0 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (u32)nCellKey, 1
1dfc0 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
1dfd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1dfe0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1dff0 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
1e000 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
1e010 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
1e020 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
1e030 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
1e040 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
1e050 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
1e060 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
1e070 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
1e080 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
1e090 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
1e0a0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
1e0b0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
1e0c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
1e0d0 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
1e0e0 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
1e0f0 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
1e100 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
1e110 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
1e120 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
1e130 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
1e140 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
1e150 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
1e160 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
1e170 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
1e180 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
1e190 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
1e1a0 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
1e1b0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
1e1c0 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
1e1d0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
1e1e0 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
1e1f0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
1e200 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
1e210 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
1e220 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
1e230 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
1e240 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
1e250 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
1e260 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
1e270 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
1e280 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
1e290 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
1e2a0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
1e2b0 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
1e2c0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
1e2d0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
1e2e0 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
1e2f0 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
1e300 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
1e310 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
1e320 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
1e330 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
1e340 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
1e350 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
1e360 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
1e370 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
1e380 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
1e390 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
1e3a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1e3b0 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
1e3c0 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
1e3d0 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
1e3e0 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
1e3f0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1e400 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
1e410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1e420 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
1e430 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1e440 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
1e450 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
1e460 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
1e470 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
1e480 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
1e490 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
1e4a0 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
1e4b0 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
1e4c0 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d  se( m.szMalloc!=
1e4d0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
1e4e0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
1e4f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1e500 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e510 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1e520 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
1e530 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
1e540 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
1e550 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73  inting to agains
1e560 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
1e570 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64  ing in pUnpacked
1e580 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
1e590 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
1e5a0 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
1e5b0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1e5c0 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
1e5d0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1e5e0 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
1e5f0 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  than pUnpacked. 
1e600 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1e610 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
1e620 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73  .** pUnpacked is
1e630 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
1e640 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
1e650 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
1e660 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
1e670 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
1e680 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
1e690 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
1e6a0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
1e6b0 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
1e6c0 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65   as well.  Hence
1e6d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  , this routine o
1e6e0 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65  nly compares the
1e6f0 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66   prefixes .** of
1e700 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20   the keys prior 
1e710 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  to the final row
1e720 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69  id, not the enti
1e730 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  re key..*/.int s
1e740 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
1e750 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Compare(.  sqlit
1e760 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1e770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1e780 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1e790 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  on */.  VdbeCurs
1e7a0 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
1e7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e7c0 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
1e7d0 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
1e7e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1e7f0 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20  Unpacked,       
1e800 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
1e810 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20  ion of key */.  
1e820 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20  int *res        
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
1e850 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
1e860 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
1e870 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
1e880 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
1e890 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e  sor *pCur = pC->
1e8a0 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d  pCursor;.  Mem m
1e8b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1e8c0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1e8d0 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
1e8e0 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
1e8f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1e900 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
1e910 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
1e920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e930 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
1e940 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
1e950 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
1e960 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
1e970 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
1e980 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
1e990 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
1e9a0 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a  ause of the way.
1e9b0 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
1e9c0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
1e9d0 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
1e9e0 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
1e9f0 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
1ea00 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
1ea10 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
1ea20 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
1ea30 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1ea40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ea50 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
1ea60 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c  3VdbeMemInit(&m,
1ea70 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20   db, 0);.  rc = 
1ea80 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
1ea90 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
1eaa0 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  sor, 0, (u32)nCe
1eab0 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
1eac0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1ead0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1eae0 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
1eaf0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1eb00 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
1eb10 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ked);.  sqlite3V
1eb20 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1eb30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1eb40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1eb50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1eb60 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
1eb70 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
1eb80 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1eb90 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
1eba0 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
1ebb0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
1ebc0 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
1ebd0 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
1ebe0 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
1ebf0 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
1ec00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1ec10 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
1ec20 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
1ec30 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
1ec40 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
1ec50 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
1ec60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
1ec70 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
1ec80 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
1ec90 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
1eca0 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
1ecb0 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
1ecc0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1ecd0 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
1ece0 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
1ecf0 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
1ed00 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
1ed10 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
1ed20 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
1ed30 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
1ed40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
1ed50 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
1ed60 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
1ed70 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
1ed80 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
1ed90 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
1eda0 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
1edb0 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
1edc0 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
1edd0 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
1ede0 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
1edf0 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
1ee00 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
1ee10 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
1ee20 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
1ee30 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
1ee40 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
1ee50 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
1ee60 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
1ee70 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
1ee80 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
1ee90 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
1eea0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1eeb0 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
1eec0 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
1eed0 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
1eee0 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
1eef0 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
1ef00 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
1ef10 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
1ef20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ef30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
1ef40 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1ef50 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
1ef60 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
1ef70 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
1ef80 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f  turn v->db;.}../
1ef90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1efa0 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
1efb0 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
1efc0 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
1efd0 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
1efe0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
1eff0 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
1f000 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
1f010 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
1f020 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
1f030 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
1f040 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
1f050 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
1f060 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
1f070 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
1f080 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
1f090 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
1f0a0 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
1f0b0 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
1f0c0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
1f0d0 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
1f0e0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
1f0f0 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
1f100 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
1f110 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
1f120 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
1f130 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
1f140 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
1f150 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
1f160 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
1f170 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
1f180 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
1f190 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
1f1a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1f1b0 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
1f1c0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
1f1d0 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
1f1e0 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
1f1f0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
1f200 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
1f210 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
1f220 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
1f230 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
1f240 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
1f250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f260 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20  return pRet;.   
1f270 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f280 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  0;.}../*.** Conf
1f290 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62  igure SQL variab
1f2a0 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20  le iVar so that 
1f2b0 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61  binding a new va
1f2c0 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c  lue to it signal
1f2d0 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f  s.** to sqlite3_
1f2e0 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61  reoptimize() tha
1f2f0 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74  t re-preparing t
1f300 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79  he statement may
1f310 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20   result.** in a 
1f320 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61  better query pla
1f330 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
1f340 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
1f350 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
1f360 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ar){.  assert( i
1f370 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69  Var>0 );.  if( i
1f380 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d  Var>32 ){.    v-
1f390 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66  >expmask = 0xfff
1f3a0 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fffff;.  }else{.
1f3b0 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c      v->expmask |
1f3c0 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56  = ((u32)1 << (iV
1f3d0 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  ar-1));.  }.}..#
1f3e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f3f0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1f400 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
1f410 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
1f420 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65  t from an sqlite
1f430 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28  3_vtab.zErrMsg (
1f440 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
1f450 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
1f460 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
1f470 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64  alloc) into a Vd
1f480 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  be.zErrMsg (text
1f490 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
1f4a0 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
1f4b0 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
1f4c0 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  oc)..*/.void sql
1f4d0 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72  ite3VtabImportEr
1f4e0 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71  rmsg(Vdbe *p, sq
1f4f0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
1f500 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
1f510 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c  b = p->db;.  sql
1f520 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1f530 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
1f540 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
1f550 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
1f560 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
1f570 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1f580 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
1f590 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
1f5a0 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f   = 0;.}.#endif /
1f5b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
1f5c0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a        RTUALTABLE */.