/ Hex Artifact Content
Login

Artifact a05adc3c96abdaf3db14768ddd63132fc9678060:


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 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
51c0: 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 6e 73   last opcode ins
51d0: 65 72 74 65 64 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erted.*/.int sql
51e0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72  ite3VdbeDeletePr
51f0: 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  iorOpcode(Vdbe *
5200: 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28  p, u8 op){.  if(
5210: 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e   (p->nOp-1)>(p->
5220: 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70  pParse->iFixedOp
5230: 29 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  ) && p->aOp[p->n
5240: 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70  Op-1].opcode==op
5250: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
5260: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
5270: 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20  p, p->nOp-1);.  
5280: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
5290: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
52a0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
52b0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
52c0: 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61   of the P4 opera
52d0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
52e0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
52f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5300: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
5310: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
5320: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
5330: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
5340: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
5350: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
5360: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
5370: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
5380: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
5390: 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e  ram..**.** If n>
53a0: 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f  =0 then the P4 o
53b0: 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69  perand is dynami
53c0: 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  c, meaning that 
53d0: 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65  a copy of.** the
53e0: 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20   string is made 
53f0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
5400: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
5410: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41  3_malloc()..** A
5420: 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d   value of n==0 m
5430: 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20  eans copy bytes 
5440: 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64  of zP4 up to and
5450: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a   including the.*
5460: 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74  * first null byt
5470: 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20  e.  If n>0 then 
5480: 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f  copy n+1 bytes o
5490: 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74  f zP4..** .** Ot
54a0: 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20  her values of n 
54b0: 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43  (P4_STATIC, P4_C
54c0: 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64  OLLSEQ etc.) ind
54d0: 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70  icate that zP4 p
54e0: 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74  oints.** to a st
54f0: 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72  ring or structur
5500: 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e  e that is guaran
5510: 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f  teed to exist fo
5520: 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f  r the lifetime o
5530: 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49  f.** the Vdbe. I
5540: 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65  n these cases we
5550: 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74   can just copy t
5560: 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  he pointer..**.*
5570: 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e  * If addr<0 then
5580: 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68   change P4 on th
5590: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
55a0: 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63  inserted instruc
55b0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
55c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
55d0: 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  4(Vdbe *p, int a
55e0: 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ddr, const char 
55f0: 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *zP4, int n){.  
5600: 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74  Op *pOp;.  sqlit
5610: 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74  e3 *db;.  assert
5620: 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  ( p!=0 );.  db =
5630: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
5640: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5650: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
5660: 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c   if( p->aOp==0 |
5670: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
5680: 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21  ed ){.    if( n!
5690: 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  =P4_VTAB ){.    
56a0: 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20    freeP4(db, n, 
56b0: 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29  (void*)*(char**)
56c0: 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &zP4);.    }.   
56d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
56e0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
56f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
5700: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  r<p->nOp );.  if
5710: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
5720: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
5730: 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  1;.  }.  pOp = &
5740: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
5750: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
5760: 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 0a  ype==P4_NOTUSED.
5770: 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70         || pOp->p
5780: 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 0a  4type==P4_INT32.
5790: 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70         || pOp->p
57a0: 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46  4type==P4_KEYINF
57b0: 4f 20 29 3b 0a 20 20 66 72 65 65 50 34 28 64 62  O );.  freeP4(db
57c0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
57d0: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
57e0: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66  ->p4.p = 0;.  if
57f0: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
5800: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68  .    /* Note: th
5810: 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c  is cast is safe,
5820: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
5830: 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77  gin data point w
5840: 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a  as an int.    **
5850: 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74   that was cast t
5860: 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20  o a (const char 
5870: 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e  *). */.    pOp->
5880: 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54  p4.i = SQLITE_PT
5890: 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20  R_TO_INT(zP4);. 
58a0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
58b0: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c   P4_INT32;.  }el
58c0: 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b  se if( zP4==0 ){
58d0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
58e0: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   0;.    pOp->p4t
58f0: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
5900: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
5910: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20  =P4_KEYINFO ){. 
5920: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5930: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5940: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5950: 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65  KEYINFO;.  }else
5960: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
5970: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5980: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5990: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
59a0: 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71   P4_VTAB;.    sq
59b0: 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56  lite3VtabLock((V
59c0: 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20  Table *)zP4);.  
59d0: 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62    assert( ((VTab
59e0: 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70  le *)zP4)->db==p
59f0: 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20  ->db );.  }else 
5a00: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
5a10: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
5a20: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
5a30: 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64  p4type = (signed
5a40: 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65   char)n;.  }else
5a50: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
5a60: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
5a70: 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70  en30(zP4);.    p
5a80: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
5a90: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
5aa0: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
5ab0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5ac0: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
5ad0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50  ./*.** Set the P
5ae0: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
5af0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63  cently added opc
5b00: 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e  ode to the KeyIn
5b10: 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  fo for the.** in
5b20: 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  dex given..*/.vo
5b30: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
5b40: 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65  tP4KeyInfo(Parse
5b50: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
5b60: 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a  *pIdx){.  Vdbe *
5b70: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
5b80: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
5b90: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
5ba0: 49 64 78 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Idx!=0 );.  sqli
5bb0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
5bc0: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 73 71  v, -1, (char*)sq
5bd0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
5be0: 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78  dex(pParse, pIdx
5bf0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
5c00: 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
5c10: 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  NFO);.}..#ifdef 
5c20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
5c30: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f  PLAIN_COMMENTS./
5c40: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
5c50: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d  comment on the m
5c60: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
5c70: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ed instruction. 
5c80: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20   Or.** insert a 
5c90: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68  No-op and add th
5ca0: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61  e comment to tha
5cb0: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  t new instructio
5cc0: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65  n.  This.** make
5cd0: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  s the code easie
5ce0: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67  r to read during
5cf0: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e   debugging.  Non
5d00: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e  e of this happen
5d10: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63  s.** in a produc
5d20: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  tion build..*/.s
5d30: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56  tatic void vdbeV
5d40: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
5d50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
5d60: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
5d70: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
5d80: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
5d90: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5da0: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
5db0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5dc0: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
5dd0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5de0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
5df0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5e00: 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71  p->aOp );.    sq
5e10: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
5e20: 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  b, p->aOp[p->nOp
5e30: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  -1].zComment);. 
5e40: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
5e50: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73  -1].zComment = s
5e60: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
5e70: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
5e80: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
5e90: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
5ea0: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
5eb0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5ec0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
5ed0: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
5ee0: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
5ef0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64  zFormat);.    vd
5f00: 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46  beVComment(p, zF
5f10: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
5f20: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
5f30: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
5f40: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
5f50: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
5f60: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
5f70: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
5f80: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
5f90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
5fa0: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
5fb0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
5fc0: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
5fd0: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
5fe0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
5ff0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
6000: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
6010: 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  UG */..#ifdef SQ
6020: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
6030: 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  GE./*.** Set the
6040: 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 69 53   value if the iS
6050: 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72  rcLine field for
6060: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
6070: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
6080: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6090: 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d  e3VdbeSetLineNum
60a0: 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ber(Vdbe *v, int
60b0: 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74   iLine){.  sqlit
60c0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31  e3VdbeGetOp(v,-1
60d0: 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  )->iSrcLine = iL
60e0: 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ine;.}.#endif /*
60f0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
6100: 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ERAGE */../*.** 
6110: 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64  Return the opcod
6120: 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64  e for a given ad
6130: 64 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61  dress.  If the a
6140: 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68  ddress is -1, th
6150: 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  en.** return the
6160: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
6170: 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a  nserted opcode..
6180: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
6190: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
61a0: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  or has occurred 
61b0: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  prior to the cal
61c0: 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20  ling of this.** 
61d0: 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20  routine, then a 
61e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d  pointer to a dum
61f0: 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62  my VdbeOp will b
6200: 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61  e returned.  Tha
6210: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72  t opcode.** is r
6220: 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20  eadable but not 
6230: 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68  writable, though
6240: 20 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61   it is cast to a
6250: 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e   writable value.
6260: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f  .** The return o
6270: 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65  f a dummy opcode
6280: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c   allows the call
6290: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e   to continue fun
62a0: 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65  ctioning.** afte
62b0: 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77  r an OOM fault w
62c0: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
62d0: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
62e0: 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d   the return from
62f0: 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
6300: 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69  e is a valid poi
6310: 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63 61 75  nter.  But becau
6320: 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63  se the dummy.opc
6330: 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d  ode is 0,.** dum
6340: 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  my will never be
6350: 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68   written to.  Th
6360: 69 73 20 69 73 20 76 65 72 69 66 69 65 64 20 62  is is verified b
6370: 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f  y code inspectio
6380: 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e  n and.** by runn
6390: 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e  ing with Valgrin
63a0: 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  d..*/.VdbeOp *sq
63b0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
63c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
63d0: 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63  ){.  /* C89 spec
63e0: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
63f0: 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20  onstant "dummy" 
6400: 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  will be initiali
6410: 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20  zed to all.  ** 
6420: 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  zeros, which is 
6430: 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67  correct.  MSVC g
6440: 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69  enerates a warni
6450: 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ng, nevertheless
6460: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64  . */.  static Vd
6470: 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20  beOp dummy;  /* 
6480: 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20  Ignore the MSVC 
6490: 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f  warning about no
64a0: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a   initializer */.
64b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
64c0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
64d0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
64e0: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
64f0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
6500: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  }.  assert( (add
6510: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
6520: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
6530: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6540: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
6550: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
6560: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
6570: 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b  &dummy;.  }else{
6580: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e  .    return &p->
6590: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d  aOp[addr];.  }.}
65a0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
65b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
65c0: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a  AIN_COMMENTS)./*
65d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  .** Return an in
65e0: 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
65f0: 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d  one of the param
6600: 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63  eters to the opc
6610: 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72  ode pOp.** deter
6620: 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74  mined by charact
6630: 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  er c..*/.static 
6640: 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63  int translateP(c
6650: 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20  har c, const Op 
6660: 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d  *pOp){.  if( c==
6670: 27 31 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '1' ) return pOp
6680: 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p1;.  if( c=='
6690: 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  2' ) return pOp-
66a0: 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33  >p2;.  if( c=='3
66b0: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
66c0: 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27  p3;.  if( c=='4'
66d0: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
66e0: 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  4.i;.  return pO
66f0: 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->p5;.}../*.** 
6700: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
6710: 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e   for the "commen
6720: 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44  t" field of a VD
6730: 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e  BE opcode listin
6740: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e  g..**.** The Syn
6750: 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20  opsis: field in 
6760: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
6770: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69  vdbe.c source fi
6780: 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65  le gets converte
6790: 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61  d.** to an extra
67a0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
67b0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
67c0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
67d0: 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20  e().  In the.** 
67e0: 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72  absence of other
67f0: 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20   comments, this 
6800: 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73  synopsis becomes
6810: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
6820: 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53  the opcode..** S
6830: 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  ome translation 
6840: 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  occurs:.**.**   
6850: 20 20 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e      "PX"      ->
6860: 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20    "r[X]".**     
6870: 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20    "PX@PY"   ->  
6880: 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f  "r[X..X+Y-1]"  o
6890: 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73  r "r[x]" if y is
68a0: 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20   0 or 1.**      
68b0: 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22   "PX@PY+1" ->  "
68c0: 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72  r[X..X+Y]"    or
68d0: 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20   "r[x]" if y is 
68e0: 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e  0.**       "PY..
68f0: 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59  PY"  ->  "r[X..Y
6900: 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d  ]"      or "r[x]
6910: 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61  " if y<=x.*/.sta
6920: 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43  tic int displayC
6930: 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20  omment(.  const 
6940: 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20  Op *pOp,     /* 
6950: 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65  The opcode to be
6960: 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   commented */.  
6970: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
6980: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79     /* Previously
6990: 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20   obtained value 
69a0: 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72  for P4 */.  char
69b0: 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f   *zTemp,       /
69c0: 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 68  * Write result h
69d0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ere */.  int nTe
69e0: 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  mp          /* S
69f0: 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69  pace available i
6a00: 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a  n zTemp[] */.){.
6a10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
6a20: 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  pName;.  const c
6a30: 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a  har *zSynopsis;.
6a40: 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20    int nOpName;. 
6a50: 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a   int ii, jj;.  z
6a60: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  OpName = sqlite3
6a70: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
6a80: 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61  opcode);.  nOpNa
6a90: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
6aa0: 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20  en30(zOpName);. 
6ab0: 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70   if( zOpName[nOp
6ac0: 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69  Name+1] ){.    i
6ad0: 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a  nt seenCom = 0;.
6ae0: 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20      char c;.    
6af0: 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e  zSynopsis = zOpN
6b00: 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b  ame += nOpName +
6b10: 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a   1;.    for(ii=j
6b20: 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20  j=0; jj<nTemp-1 
6b30: 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69  && (c = zSynopsi
6b40: 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29  s[ii])!=0; ii++)
6b50: 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  {.      if( c=='
6b60: 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  P' ){.        c 
6b70: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69  = zSynopsis[++ii
6b80: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ];.        if( c
6b90: 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20 20  =='4' ){.       
6ba0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6bb0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
6bc0: 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50  emp+jj, "%s", zP
6bd0: 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
6be0: 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a  e if( c=='X' ){.
6bf0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6c00: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6c10: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
6c20: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
6c30: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  nt);.          s
6c40: 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20  eenCom = 1;.    
6c50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6c60: 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74 72       int v1 = tr
6c70: 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70 29  anslateP(c, pOp)
6c80: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
6c90: 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  v2;.          sq
6ca0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6cb0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
6cc0: 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20 20  j, "%d", v1);.  
6cd0: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e          if( strn
6ce0: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
6cf0: 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30 20  +1, "@P", 2)==0 
6d00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
6d10: 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  i += 3;.        
6d20: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
6d30: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
6d40: 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  jj);.           
6d50: 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65 50   v2 = translateP
6d60: 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20  (zSynopsis[ii], 
6d70: 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pOp);.          
6d80: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
6d90: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31  ynopsis+ii+1,"+1
6da0: 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ",2)==0 ){.     
6db0: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 32           ii += 2
6dc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6dd0: 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  v2++;.          
6de0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
6df0: 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20 20  if( v2>1 ){.    
6e00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6e10: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6e20: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
6e30: 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b  ..%d", v1+v2-1);
6e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6e50: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
6e60: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
6e70: 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33  psis+ii+1, "..P3
6e80: 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d  ", 4)==0 && pOp-
6e90: 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >p3==0 ){.      
6ea0: 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20        ii += 4;. 
6eb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6ec0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20     }.        jj 
6ed0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
6ee0: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
6ef0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6f00: 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d     zTemp[jj++] =
6f10: 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   c;.      }.    
6f20: 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 43  }.    if( !seenC
6f30: 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35  om && jj<nTemp-5
6f40: 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e   && pOp->zCommen
6f50: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
6f60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6f70: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
6f80: 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  "; %s", pOp->zCo
6f90: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a  mment);.      jj
6fa0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
6fb0: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
6fc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c     }.    if( jj<
6fd0: 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a  nTemp ) zTemp[jj
6fe0: 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  ] = 0;.  }else i
6ff0: 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  f( pOp->zComment
7000: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7010: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7020: 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70  zTemp, "%s", pOp
7030: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
7040: 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72   jj = sqlite3Str
7050: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
7060: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70  }else{.    zTemp
7070: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20  [0] = 0;.    jj 
7080: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
7090: 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n jj;.}.#endif /
70a0: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
70b0: 2f 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  /...#if !defined
70c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
70d0: 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65  LAIN) || !define
70e0: 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20  d(NDEBUG) \.    
70f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
7100: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
7110: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
7120: 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  G)./*.** Compute
7130: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
7140: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
7150: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
7160: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
7170: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
7180: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
7190: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
71a0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
71b0: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
71c0: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
71d0: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
71e0: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
71f0: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
7200: 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =20 );.  switch(
7210: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
7220: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
7230: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
7240: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79   i, j;.      Key
7250: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
7260: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
7270: 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o;.      assert(
7280: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
7290: 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Order!=0 );.    
72a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
72b0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
72c0: 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66   "k(%d", pKeyInf
72d0: 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  o->nField);.    
72e0: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72    i = sqlite3Str
72f0: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20  len30(zTemp);.  
7300: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
7310: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
7320: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
7330: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
7340: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
7350: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  j];.        cons
7360: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
7370: 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a  pColl ? pColl->z
7380: 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 20  Name : "nil";.  
7390: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
73a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
73b0: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
73c0: 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d 70  ( n==6 && memcmp
73d0: 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 2c  (zColl,"BINARY",
73e0: 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  6)==0 ){.       
73f0: 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a     zColl = "B";.
7400: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b            n = 1;
7410: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7420: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70     if( i+n>nTemp
7430: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
7440: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
7450: 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20  ,",...",4);.    
7460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
7480: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
7490: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
74a0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
74b0: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
74c0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
74d0: 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -';.        }.  
74e0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
74f0: 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e  emp[i], zColl, n
7500: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b  +1);.        i +
7510: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
7520: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
7530: 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  ')';.      zTemp
7540: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  [i] = 0;.      a
7550: 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29  ssert( i<nTemp )
7560: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7570: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7580: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
7590: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
75a0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
75b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
75c0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
75d0: 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30 73 29 22  zTemp, "(%.20s)"
75e0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
75f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7600: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7610: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
7620: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
7630: 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a   pOp->p4.pFunc;.
7640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7650: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7660: 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70  emp, "%s(%d)", p
7670: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
7680: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
7690: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
76a0: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b  case P4_INT64: {
76b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
76c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
76d0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70  Temp, "%lld", *p
76e0: 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20  Op->p4.pI64);.  
76f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7700: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
7710: 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  32: {.      sqli
7720: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7730: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c  mp, zTemp, "%d",
7740: 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20   pOp->p4.i);.   
7750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7760: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
7770: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7780: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7790: 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22  , zTemp, "%.16g"
77a0: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  , *pOp->p4.pReal
77b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
77c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
77d0: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d  4_MEM: {.      M
77e0: 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e  em *pMem = pOp->
77f0: 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  p4.pMem;.      i
7800: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
7810: 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
7820: 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e      zP4 = pMem->
7830: 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  z;.      }else i
7840: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
7850: 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
7860: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7870: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7880: 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d  p, "%lld", pMem-
7890: 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.i);.      }el
78a0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
78b0: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
78c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
78d0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
78e0: 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c   zTemp, "%.16g",
78f0: 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20   pMem->u.r);.   
7900: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
7910: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
7920: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
7930: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7940: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e  nTemp, zTemp, "N
7950: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ULL");.      }el
7960: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
7970: 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  rt( pMem->flags 
7980: 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
7990: 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c        zP4 = "(bl
79a0: 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ob)";.      }.  
79b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
79c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
79d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
79e0: 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54  E.    case P4_VT
79f0: 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
7a00: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
7a10: 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
7a20: 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71  >pVtab;.      sq
7a30: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7a40: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74  Temp, zTemp, "vt
7a50: 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62  ab:%p:%p", pVtab
7a60: 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  , pVtab->pModule
7a70: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7a80: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
7a90: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
7aa0: 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y: {.      sqlit
7ab0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7ac0: 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72  p, zTemp, "intar
7ad0: 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ray");.      bre
7ae0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7af0: 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  se P4_SUBPROGRAM
7b00: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
7b10: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7b20: 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72 61  , zTemp, "progra
7b30: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
7b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7b50: 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20   P4_ADVANCE: {. 
7b60: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
7b70: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
7b80: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
7b90: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d  t: {.      zP4 =
7ba0: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
7bb0: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a    if( zP4==0 ){.
7bc0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54          zP4 = zT
7bd0: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  emp;.        zTe
7be0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
7bf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
7c00: 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b  ssert( zP4!=0 );
7c10: 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d  .  return zP4;.}
7c20: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
7c30: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
7c40: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
7c50: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
7c60: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
7c70: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
7c80: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
7c90: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
7ca0: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
7cb0: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
7cc0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
7cd0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
7ce0: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
7cf0: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
7d00: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
7d10: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20   p->btreeMask.  
7d20: 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20  The p->lockMask 
7d30: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62  value is the sub
7d40: 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72  set of.** p->btr
7d50: 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61  eeMask of databa
7d60: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ses that will re
7d70: 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f  quire a lock..*/
7d80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7d90: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
7da0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
7db0: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
7dc0: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
7dd0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
7de0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
7df0: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
7e00: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
7e10: 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  8 );.  DbMaskSet
7e20: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69  (p->btreeMask, i
7e30: 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26  );.  if( i!=1 &&
7e40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61   sqlite3BtreeSha
7e50: 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62  rable(p->db->aDb
7e60: 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20  [i].pBt) ){.    
7e70: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63  DbMaskSet(p->loc
7e80: 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d  kMask, i);.  }.}
7e90: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
7ea0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
7eb0: 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49  D_CACHE) && SQLI
7ec0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a  TE_THREADSAFE>0.
7ed0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  /*.** If SQLite 
7ee0: 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73  is compiled to s
7ef0: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
7f00: 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20  che mode and to 
7f10: 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a 2a  be threadsafe,.*
7f20: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  * this routine o
7f30: 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 78  btains the mutex
7f40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7f50: 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73   each BtShared s
7f60: 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 74  tructure.** that
7f70: 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 64   may be accessed
7f80: 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
7f90: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
7fa0: 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74  . In doing so it
7fb0: 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68   also.** sets th
7fc0: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65  e BtShared.db me
7fd0: 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20  mber of each of 
7fe0: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
7ff0: 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e  uctures, ensurin
8000: 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f  g.** that the co
8010: 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c  rrect busy-handl
8020: 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  er callback is i
8030: 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72  nvoked if requir
8040: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ed..**.** If SQL
8050: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
8060: 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 73  dsafe but does s
8070: 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61  upport shared-ca
8080: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a  che mode, then.*
8090: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  * sqlite3BtreeEn
80a0: 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 64  ter() is invoked
80b0: 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68   to set the BtSh
80c0: 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65  ared.db variable
80d0: 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42  s.** of all of B
80e0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
80f0: 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69  es accessible vi
8100: 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  a the database h
8110: 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69  andle .** associ
8120: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
8130: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
8140: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
8150: 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  afe and does not
8160: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
8170: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73  cache mode, this
8180: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
8190: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
81a0: 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  he p->btreeMask 
81b0: 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d 61  field is a bitma
81c0: 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 73  sk of all btrees
81d0: 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61 72   that the prepar
81e0: 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ed .** statement
81f0: 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73 65   p will ever use
8200: 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65 20  .  Let N be the 
8210: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69  number of bits i
8220: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a  n p->btreeMask.*
8230: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
8240: 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20 75  to btrees that u
8250: 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65 2e  se shared cache.
8260: 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74 69    Then the runti
8270: 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f  me of.** this ro
8280: 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42  utine is N*N.  B
8290: 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65 6c  ut as N is rarel
82a0: 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 74  y more than 1, t
82b0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a  his should not.*
82c0: 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  * be a problem..
82d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
82e0: 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a 70  dbeEnter(Vdbe *p
82f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
8300: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
8310: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
8320: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
8330: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
8340: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
8350: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
8360: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
8370: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
8380: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
8390: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
83a0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
83b0: 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73  f( i!=1 && DbMas
83c0: 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  kTest(p->lockMas
83d0: 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61  k,i) && ALWAYS(a
83e0: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
83f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
8400: 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e  reeEnter(aDb[i].
8410: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
8420: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
8430: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8440: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
8450: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
8460: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e  DSAFE>0./*.** Un
8470: 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20  lock all of the 
8480: 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c  btrees previousl
8490: 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61  y locked by a ca
84a0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
84b0: 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69  eEnter()..*/.voi
84c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
84d0: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
84e0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
84f0: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
8500: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
8510: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
8520: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
8530: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
8540: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64  mmon case */.  d
8550: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
8560: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
8570: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
8580: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
8590: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
85a0: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
85b0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
85c0: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
85d0: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
85e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
85f0: 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  ve(aDb[i].pBt);.
8600: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
8610: 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
8620: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
8630: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8640: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69  DEBUG)./*.** Pri
8650: 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  nt a single opco
8660: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
8670: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65  e is used for de
8680: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
8690: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
86a0: 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70  ePrintOp(FILE *p
86b0: 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20  Out, int pc, Op 
86c0: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
86d0: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
86e0: 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d  50];.  char zCom
86f0: 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  [100];.  static 
8700: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
8710: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
8720: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
8730: 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  13s %.2X %s\n";.
8740: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
8750: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
8760: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
8770: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
8780: 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65  of(zPtr));.#ifde
8790: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
87a0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
87b0: 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  .  displayCommen
87c0: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d  t(pOp, zP4, zCom
87d0: 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b  , sizeof(zCom));
87e0: 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d  .#else.  zCom[0]
87f0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f   = 0;.#endif.  /
8800: 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74  * NB:  The sqlit
8810: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66  e3OpcodeName() f
8820: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
8830: 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63  mented by code c
8840: 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74  reated.  ** by t
8850: 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
8860: 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61   and mkopcodec.a
8870: 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63 68  wk scripts which
8880: 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a   extract the.  *
8890: 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  * information fr
88a0: 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f  om the vdbe.c so
88b0: 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66  urce text */.  f
88c0: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
88d0: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20  rmat1, pc, .    
88e0: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e    sqlite3OpcodeN
88f0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
8900: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
8910: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34  p2, pOp->p3, zP4
8920: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20  , pOp->p5,.     
8930: 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c   zCom.  );.  ffl
8940: 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e  ush(pOut);.}.#en
8950: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  dif../*.** Relea
8960: 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e  se an array of N
8970: 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f   Mem elements.*/
8980: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
8990: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d  easeMemArray(Mem
89a0: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
89b0: 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20  f( p && N ){.   
89c0: 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b   Mem *pEnd = &p[
89d0: 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  N];.    sqlite3 
89e0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
89f0: 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65   u8 malloc_faile
8a00: 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
8a10: 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62  iled;.    if( db
8a20: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29  ->pnBytesFreed )
8a30: 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  {.      do{.    
8a40: 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c      if( p->szMal
8a50: 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46  loc ) sqlite3DbF
8a60: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
8a70: 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  oc);.      }whil
8a80: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b  e( (++p)<pEnd );
8a90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
8aa0: 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
8ab0: 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31     assert( (&p[1
8ac0: 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d  ])==pEnd || p[0]
8ad0: 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a  .db==p[1].db );.
8ae0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
8af0: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65  lite3VdbeCheckMe
8b00: 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29  mInvariants(p) )
8b10: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ;..      /* This
8b20: 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79   block is really
8b30: 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73   an inlined vers
8b40: 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
8b50: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20  beMemRelease(). 
8b60: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b       ** that tak
8b70: 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  es advantage of 
8b80: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
8b90: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61  e memory cell va
8ba0: 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  lue is .      **
8bb0: 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55   being set to NU
8bc0: 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69  LL after releasi
8bd0: 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72  ng any dynamic r
8be0: 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20  esources..      
8bf0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
8c00: 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f  justification fo
8c10: 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f  r duplicating co
8c20: 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72  de is that accor
8c30: 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a  ding to .      *
8c40: 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69  * callgrind, thi
8c50: 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61  s causes a certa
8c60: 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20  in test case to 
8c70: 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20  hit the CPU 4.7 
8c80: 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e  .      ** percen
8c90: 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75  t less (x86 linu
8ca0: 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34  x, gcc version 4
8cb0: 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20  .1.2, -O6) than 
8cc0: 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  if .      ** sql
8cd0: 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29  ite3MemRelease()
8ce0: 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f   were called fro
8cf0: 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32  m here. With -O2
8d00: 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20  , this jumps.   
8d10: 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72     ** to 6.6 per
8d20: 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63  cent. The test c
8d30: 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67  ase is inserting
8d40: 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20   1000 rows into 
8d50: 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a  a table .      *
8d60: 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65  * with no indexe
8d70: 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  s using a single
8d80: 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54   prepared INSERT
8d90: 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64   statement, bind
8da0: 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  () .      ** and
8db0: 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74   reset(). Insert
8dc0: 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e  s are grouped in
8dd0: 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  to a transaction
8de0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8df0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
8e00: 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b  ags & MEM_Agg );
8e10: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8e20: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
8e30: 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Dyn );.      tes
8e40: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
8e50: 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b 0a 20  & MEM_Frame );. 
8e60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8e70: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
8e80: 77 53 65 74 20 29 3b 0a 20 20 20 20 20 20 69 66  wSet );.      if
8e90: 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  ( p->flags&(MEM_
8ea0: 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  Agg|MEM_Dyn|MEM_
8eb0: 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74  Frame|MEM_RowSet
8ec0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
8ed0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
8ee0: 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  se(p);.      }el
8ef0: 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c  se if( p->szMall
8f00: 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  oc ){.        sq
8f10: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8f20: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
8f30: 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63       p->szMalloc
8f40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
8f50: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
8f60: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
8f70: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
8f80: 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 64 62 2d  <pEnd );.    db-
8f90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
8fa0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
8fb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
8fc0: 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f  te a VdbeFrame o
8fd0: 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f  bject and its co
8fe0: 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d  ntents. VdbeFram
8ff0: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a  e objects are.**
9000: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
9010: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
9020: 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64  ode in sqlite3Vd
9030: 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69  beExec()..*/.voi
9040: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
9050: 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61  meDelete(VdbeFra
9060: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  me *p){.  int i;
9070: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56  .  Mem *aMem = V
9080: 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a  dbeFrameMem(p);.
9090: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61    VdbeCursor **a
90a0: 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
90b0: 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
90c0: 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72  ChildMem];.  for
90d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c  (i=0; i<p->nChil
90e0: 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  dCsr; i++){.    
90f0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
9100: 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73  ursor(p->v, apCs
9110: 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  r[i]);.  }.  rel
9120: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65  easeMemArray(aMe
9130: 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29  m, p->nChildMem)
9140: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
9150: 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a  e(p->v->db, p);.
9160: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
9170: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
9180: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
9190: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
91a0: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
91b0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
91c0: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
91d0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
91e0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
91f0: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
9200: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
9210: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
9220: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
9230: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
9240: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
9250: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
9260: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
9270: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
9280: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
9290: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
92a0: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
92b0: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
92c0: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
92d0: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
92e0: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
92f0: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
9300: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
9310: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
9320: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
9330: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
9340: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
9350: 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68  Y PLAN..**.** Wh
9360: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
9370: 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 6e  , first the main
9380: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 74   program is list
9390: 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f 66  ed, then each of
93a0: 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 20  .** the trigger 
93b0: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 20  subprograms are 
93c0: 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e  listed one by on
93d0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
93e0: 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 62  3VdbeList(.  Vdb
93f0: 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 20  e *p            
9400: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
9410: 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  BE */.){.  int n
9420: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9440: 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f 77  /* Stop when row
9450: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 74   count reaches t
9460: 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  his */.  int nSu
9470: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9490: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 76   Number of sub-v
94a0: 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 72  dbes seen so far
94b0: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
94c0: 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 20   **apSub = 0;   
94d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
94e0: 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ray of sub-vdbes
94f0: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20   */.  Mem *pSub 
9500: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
9520: 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61  mory cell hold a
9530: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 73  rray of subprogs
9540: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
9550: 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 20  b = p->db;      
9560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9570: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
9580: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
9590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
95c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
95d0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
95e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
95f0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
9600: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
9610: 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  em[1];          
9620: 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
9630: 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  of result set */
9640: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
9650: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 65  xplain );.  asse
9660: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
9670: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a  BE_MAGIC_RUN );.
9680: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
9690: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
96a0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
96b0: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
96c0: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a  E_NOMEM );..  /*
96d0: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
96e0: 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f  s opcode does no
96f0: 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 74  t use dynamic st
9700: 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74  rings for.  ** t
9710: 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 6c  he result, resul
9720: 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  t columns may be
9730: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
9740: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
9750: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
9760: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
9770: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
9780: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
9790: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65  oding..  */.  re
97a0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 4d  leaseMemArray(pM
97b0: 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65  em, 8);.  p->pRe
97c0: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20  sultSet = 0;..  
97d0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
97e0: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f  E_NOMEM ){.    /
97f0: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
9800: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
9810: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
9820: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
9830: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
9840: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
9850: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
9860: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
9870: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
9880: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
9890: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ROR;.  }..  /* W
98a0: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
98b0: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65  f output rows re
98c0: 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74  aches nRow, that
98d0: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20   means the.  ** 
98e0: 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69  listing has fini
98f0: 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33  shed and sqlite3
9900: 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72  _step() should r
9910: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
9920: 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20  E..  ** nRow is 
9930: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
9940: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
9950: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
9960: 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65  m, plus.  ** the
9970: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
9980: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c  er of rows in al
9990: 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  l trigger subpro
99a0: 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65  grams encountere
99b0: 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20  d.  ** so far.  
99c0: 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77  The nRow value w
99d0: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20  ill increase as 
99e0: 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70  new trigger subp
99f0: 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a  rograms are.  **
9a00: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75   encountered, bu
9a10: 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65  t p->pc will eve
9a20: 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70  ntually catch up
9a30: 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20   to nRow..  */. 
9a40: 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   nRow = p->nOp;.
9a50: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
9a60: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==1 ){.    /* Th
9a70: 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79  e first 8 memory
9a80: 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20   cells are used 
9a90: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
9aa0: 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a  et.  So we will.
9ab0: 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65      ** commandee
9ac0: 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74  r the 9th cell t
9ad0: 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65  o use as storage
9ae0: 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66   for an array of
9af0: 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a   pointers.    **
9b00: 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70   to trigger subp
9b10: 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44  rograms.  The VD
9b20: 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  BE is guaranteed
9b30: 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73   to have at leas
9b40: 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73  t 9.    ** cells
9b50: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
9b60: 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20  ( p->nMem>9 );. 
9b70: 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d     pSub = &p->aM
9b80: 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70  em[9];.    if( p
9b90: 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  Sub->flags&MEM_B
9ba0: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lob ){.      /* 
9bb0: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  On the first cal
9bc0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  l to sqlite3_ste
9bd0: 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68  p(), pSub will h
9be0: 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  old a NULL.  It 
9bf0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  is.      ** init
9c00: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f  ialized to a BLO
9c10: 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50  B by the P4_SUBP
9c20: 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e  ROGRAM processin
9c30: 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f  g logic below */
9c40: 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53  .      nSub = pS
9c50: 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62  ub->n/sizeof(Vdb
9c60: 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62  e*);.      apSub
9c70: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
9c80: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d  *)pSub->z;.    }
9c90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9ca0: 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSub; i++){.    
9cb0: 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b    nRow += apSub[
9cc0: 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  i]->nOp;.    }. 
9cd0: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
9ce0: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
9cf0: 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70  ile( i<nRow && p
9d00: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
9d10: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
9d20: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
9d30: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
9d40: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
9d50: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
9d60: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
9d70: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
9d80: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
9d90: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
9da0: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
9db0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9dc0: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
9dd0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
9de0: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73  zErrMsg, db, "%s
9df0: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
9e00: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
9e10: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34  e{.    char *zP4
9e20: 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  ;.    Op *pOp;. 
9e30: 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20     if( i<p->nOp 
9e40: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
9e50: 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62  output line numb
9e60: 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  er is small enou
9e70: 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73  gh that we are s
9e80: 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20  till in the.    
9e90: 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61    ** main progra
9ea0: 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20  m. */.      pOp 
9eb0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
9ec0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
9ed0: 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74  * We are current
9ee0: 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72  ly listing subpr
9ef0: 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20  ograms.  Figure 
9f00: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e  out which one an
9f10: 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20  d.      ** pick 
9f20: 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  up the appropria
9f30: 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20  te opcode. */.  
9f40: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
9f50: 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20   i -= p->nOp;.  
9f60: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d      for(j=0; i>=
9f70: 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a  apSub[j]->nOp; j
9f80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d  ++){.        i -
9f90: 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  = apSub[j]->nOp;
9fa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
9fb0: 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e  Op = &apSub[j]->
9fc0: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aOp[i];.    }.  
9fd0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
9fe0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ==1 ){.      pMe
9ff0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
a000: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
a010: 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20  u.i = i;        
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a030: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72          /* Progr
a040: 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  am counter */.  
a050: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20      pMem++;.  . 
a060: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
a070: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   = MEM_Static|ME
a080: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
a090: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
a0a0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70  (char*)sqlite3Op
a0b0: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
a0c0: 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65  code); /* Opcode
a0d0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
a0e0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
a0f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
a100: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a110: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
a120: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
a130: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
a140: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  Mem++;..      /*
a150: 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67   When an OP_Prog
a160: 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e  ram opcode is en
a170: 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c  counter (the onl
a180: 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61  y opcode that ha
a190: 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f  s.      ** a P4_
a1a0: 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d  SUBPROGRAM argum
a1b0: 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65  ent), expand the
a1c0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
a1d0: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
a1e0: 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20  s.      ** kept 
a1f0: 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20  in p->aMem[9].z 
a200: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20  to hold the new 
a210: 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69  program - assumi
a220: 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72  ng this subprogr
a230: 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  am.      ** has 
a240: 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
a250: 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a   seen..      */.
a260: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
a270: 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f  4type==P4_SUBPRO
a280: 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  GRAM ){.        
a290: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75  int nByte = (nSu
a2a0: 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50  b+1)*sizeof(SubP
a2b0: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
a2c0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
a2d0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62   for(j=0; j<nSub
a2e0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
a2f0: 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d    if( apSub[j]==
a300: 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  pOp->p4.pProgram
a310: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
a320: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
a330: 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54  j==nSub && SQLIT
a340: 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62  E_OK==sqlite3Vdb
a350: 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e  eMemGrow(pSub, n
a360: 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29  Byte, nSub!=0) )
a370: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  {.          apSu
a380: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
a390: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
a3a0: 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62        apSub[nSub
a3b0: 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ++] = pOp->p4.pP
a3c0: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
a3d0: 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d    pSub->flags |=
a3e0: 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20   MEM_Blob;.     
a3f0: 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e       pSub->n = n
a400: 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  Sub*sizeof(SubPr
a410: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
a420: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
a430: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
a440: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
a450: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
a460: 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  ->p1;           
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a480: 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P1 */.    pMem
a490: 2b 2b 3b 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 32 3b 20 20 20 20 20 20 20 20  pOp->p2;        
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4e0: 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70    /* P2 */.    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 33 3b 20 20 20 20 20   = pOp->p3;     
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 33 20 2a 2f 0a 20 20       /* P3 */.  
a550: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69    pMem++;..    i
a560: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
a570: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
a580: 70 4d 65 6d 2c 20 33 32 29 20 29 7b 20 2f 2a 20  pMem, 32) ){ /* 
a590: 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  P4 */.      asse
a5a0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
a5b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
a5c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
a5d0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a5e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a5f0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
a600: 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61      zP4 = displa
a610: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
a620: 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  , 32);.    if( z
a630: 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20  P4!=pMem->z ){. 
a640: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a650: 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20  MemSetStr(pMem, 
a660: 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zP4, -1, SQLITE_
a670: 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65  UTF8, 0);.    }e
a680: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
a690: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
a6a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
a6b0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a6c0: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
a6d0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
a6e0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a  ITE_UTF8;.    }.
a6f0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
a700: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
a710: 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =1 ){.      if( 
a720: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
a730: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
a740: 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20  m, 4) ){.       
a750: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
a760: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a770: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
a780: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
a790: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
a7a0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
a7b0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
a7c0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
a7d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
a7e0: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
a7f0: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
a800: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
a810: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
a820: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
a830: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
a840: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a850: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
a860: 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71  NTS.      if( sq
a870: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
a880: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
a890: 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20   500) ){.       
a8a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
a8b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a8c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
a8d0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
a8e0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
a8f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
a900: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
a910: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c   pMem->n = displ
a920: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
a930: 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30  P4, pMem->z, 500
a940: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
a950: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
a960: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d  ;.#else.      pM
a970: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a980: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
a990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
a9a0: 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66  omment */.#endif
a9b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e  .    }..    p->n
a9c0: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20  ResColumn = 8 - 
a9d0: 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29  4*(p->explain-1)
a9e0: 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74  ;.    p->pResult
a9f0: 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Set = &p->aMem[1
aa00: 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ];.    p->rc = S
aa10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
aa20: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
aa30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
aa40: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
aa50: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
aa60: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
aa70: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
aa80: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
aa90: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
aaa0: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
aab0: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
aac0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
aad0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f  l(Vdbe *p){.  co
aae0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
aaf0: 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29  .  if( p->zSql )
ab00: 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71  {.    z = p->zSq
ab10: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
ab20: 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20  ->nOp>=1 ){.    
ab30: 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f  const VdbeOp *pO
ab40: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
ab50: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
ab60: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
ab70: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
ab80: 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70        z = pOp->p
ab90: 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  4.z;.      while
aba0: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
abb0: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
abc0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20  }.  }.  if( z ) 
abd0: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
abe0: 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64  ]\n", z);.}.#end
abf0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
ac00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
ac10: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
ac20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
ac30: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
ac40: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
ac50: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
ac60: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
ac70: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
ac80: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
ac90: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
aca0: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
acb0: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
acc0: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
acd0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
ace0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
acf0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
ad00: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
ad10: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
ad20: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
ad30: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
ad40: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
ad50: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
ad60: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
ad70: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
ad80: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
ad90: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
ada0: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
adb0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
adc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
add0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
ade0: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
adf0: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
ae00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
ae10: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
ae20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ae30: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
ae40: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
ae50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
ae60: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
ae70: 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73  3IoTrace("SQL %s
ae80: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
ae90: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
aea0: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
aeb0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
aec0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  RACE */../*.** A
aed0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72  llocate space fr
aee0: 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20  om a fixed size 
aef0: 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75 72  buffer and retur
af00: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
af10: 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20 49  * that space.  I
af20: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  f insufficient s
af30: 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
af40: 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  e, return NULL..
af50: 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70  **.** The pBuf p
af60: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
af70: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  initial value of
af80: 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68   a pointer which
af90: 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65   will.** receive
afa0: 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   the new memory.
afb0: 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c    pBuf is normal
afc0: 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75  ly NULL.  If pBu
afd0: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
afe0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
aff0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73  memory space has
b000: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
b010: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61 74  located and that
b020: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
b030: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f   should not allo
b040: 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d  cate any new mem
b050: 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20  ory.  When pBuf 
b060: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73  is not.** NULL s
b070: 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75  imply return pBu
b080: 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74  f.  Only allocat
b090: 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61  e new memory spa
b0a0: 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20  ce when pBuf.** 
b0b0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e  is NULL..**.** n
b0c0: 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62  Byte is the numb
b0d0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
b0e0: 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  pace needed..**.
b0f0: 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74  ** *ppFrom point
b100: 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73  s to available s
b110: 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f  pace and pEnd po
b120: 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20  ints to the end 
b130: 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61  of the.** availa
b140: 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e  ble space.  When
b150: 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61   space is alloca
b160: 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20  ted, *ppFrom is 
b170: 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a  advanced past.**
b180: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
b190: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
b1a0: 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69  .**.** *pnByte i
b1b0: 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74  s a counter of t
b1c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
b1d0: 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61 74  es of space that
b1e0: 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20   have failed.** 
b1f0: 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66  to allocate.  If
b200: 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66 66   there is insuff
b210: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20  icient space in 
b220: 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73  *ppFrom to satis
b230: 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  fy the.** reques
b240: 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  t, then incremen
b250: 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65  t *pnByte by the
b260: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72   amount of the r
b270: 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  equest..*/.stati
b280: 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61  c void *allocSpa
b290: 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  ce(.  void *pBuf
b2a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
b2b0: 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  ere return point
b2c0: 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  er will be store
b2d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
b2e0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
b2f0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
b300: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
b310: 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20  u8 **ppFrom,    
b320: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
b330: 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70  Allocate from *p
b340: 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70  pFrom */.  u8 *p
b350: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
b360: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
b370: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  byte past the en
b380: 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66  d of *ppFrom buf
b390: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  fer */.  int *pn
b3a0: 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Byte          /*
b3b0: 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63   If allocation c
b3c0: 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69  annot be made, i
b3d0: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
b3e0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
b3f0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
b400: 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29  NMENT(*ppFrom) )
b410: 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20 72  ;.  if( pBuf ) r
b420: 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42  eturn pBuf;.  nB
b430: 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79  yte = ROUND8(nBy
b440: 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70  te);.  if( &(*pp
b450: 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20  From)[nByte] <= 
b460: 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66  pEnd ){.    pBuf
b470: 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f   = (void*)*ppFro
b480: 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b  m;.    *ppFrom +
b490: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65  = nByte;.  }else
b4a0: 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d  {.    *pnByte +=
b4b0: 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65   nByte;.  }.  re
b4c0: 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a  turn pBuf;.}../*
b4d0: 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56  .** Rewind the V
b4e0: 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20  DBE back to the 
b4f0: 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65  beginning in pre
b500: 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  paration for.** 
b510: 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76  running it..*/.v
b520: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
b530: 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a  ewind(Vdbe *p){.
b540: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
b550: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
b560: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
b570: 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64  E).  int i;.#end
b580: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  if.  assert( p!=
b590: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
b5a0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
b5b0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
b5c0: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
b5d0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
b5e0: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
b5f0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
b600: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
b610: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
b620: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
b630: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
b640: 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20  . */.  p->magic 
b650: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
b660: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
b670: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31  _DEBUG.  for(i=1
b680: 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
b690: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b6a0: 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d  ->aMem[i].db==p-
b6b0: 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >db );.  }.#endi
b6c0: 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  f.  p->pc = -1;.
b6d0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
b6e0: 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  _OK;.  p->errorA
b6f0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
b700: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
b710: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
b720: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
b730: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
b740: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
b750: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
b760: 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  5;.  p->iStateme
b770: 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b  nt = 0;.  p->nFk
b780: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a  Constraint = 0;.
b790: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
b7a0: 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ILE.  for(i=0; i
b7b0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
b7c0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
b7d0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70   = 0;.    p->aOp
b7e0: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
b7f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
b800: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
b810: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
b820: 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20  r execution for 
b830: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
b840: 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67  fter.** creating
b850: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
b860: 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f  hine.  This invo
b870: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
b880: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
b890: 67 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  g registers and 
b8a0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
b8b0: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
b8c0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
b8d0: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
b8e0: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
b8f0: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
b900: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
b910: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
b920: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
b930: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
b940: 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79  e called exactly
b950: 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69   once on each vi
b960: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
b970: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
b980: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
b990: 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22  he VM has been "
b9a0: 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73  packaged" and is
b9b0: 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e   ready.** to run
b9c0: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
b9d0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
b9e0: 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74   further calls t
b9f0: 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  o .** sqlite3Vdb
ba00: 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f  eAddOp() functio
ba10: 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ns are prohibite
ba20: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
ba30: 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20   disconnects.** 
ba40: 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
ba50: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74  e Parse object t
ba60: 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72  hat helped gener
ba70: 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74  ate it so that t
ba80: 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62  he.** the Vdbe b
ba90: 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65  ecomes an indepe
baa0: 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64  ndent entity and
bab0: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
bac0: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74  t can be.** dest
bad0: 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  royed..**.** Use
bae0: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
baf0: 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75  Rewind() procedu
bb00: 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20  re to restore a 
bb10: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
bb20: 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69  back.** to its i
bb30: 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74  nitial state aft
bb40: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  er it has been r
bb50: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  un..*/.void sqli
bb60: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
bb70: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
bba0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
bbb0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
bbc0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
bbd0: 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ntext */.){.  sq
bbe0: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc00: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
bc10: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
bc20: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bc40: 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74  umber of paramet
bc50: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ers */.  int nMe
bc60: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
bc70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
bc80: 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72  r of VM memory r
bc90: 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e  egisters */.  in
bca0: 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20  t nCursor;      
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bcc0: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
bcd0: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
bce0: 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20  int nArg;       
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
bd10: 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67  ments in subprog
bd20: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  rams */.  int nO
bd30: 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  nce;            
bd40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bd50: 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e  er of OP_Once in
bd60: 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
bd70: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd90: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
bda0: 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20  /.  u8 *zCsr;   
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdc0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
bdd0: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  ilable for alloc
bde0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  ation */.  u8 *z
bdf0: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
be00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
be10: 73 74 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c  st byte past all
be20: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  ocated memory */
be30: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78    /* How much ex
be60: 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65  tra memory is ne
be70: 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eded */..  asser
be80: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
be90: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
bea0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
beb0: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
bec0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
bed0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
bee0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d   assert( pParse=
bef0: 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20  =p->pParse );.  
bf00: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
bf10: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
bf20: 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  Failed==0 );.  n
bf30: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56  Var = pParse->nV
bf40: 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61  ar;.  nMem = pPa
bf50: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75  rse->nMem;.  nCu
bf60: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
bf70: 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50  Tab;.  nArg = pP
bf80: 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20  arse->nMaxArg;. 
bf90: 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d   nOnce = pParse-
bfa0: 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f  >nOnce;.  if( nO
bfb0: 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d  nce==0 ) nOnce =
bfc0: 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74   1; /* Ensure at
bfd0: 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
bfe0: 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b  in p->aOnceFlag[
bff0: 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  ] */.  .  /* For
c000: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
c010: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
c020: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
c030: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
c040: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
c050: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
c060: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
c070: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
c080: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
c090: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
c0a0: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
c0b0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
c0c0: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
c0d0: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
c0e0: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
c0f0: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
c100: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
c110: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
c120: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
c130: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
c140: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
c150: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
c160: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
c170: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
c180: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
c190: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
c1a0: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
c1b0: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
c1c0: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
c1d0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
c1e0: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
c1f0: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
c200: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
c210: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
c220: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
c230: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
c240: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ents in..  */.  
c250: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zCsr = (u8*)&p->
c260: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20  aOp[p->nOp];    
c270: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
c280: 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20  y avaliable for 
c290: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
c2a0: 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zEnd = (u8*)&p->
c2b0: 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f 70 41  aOp[pParse->nOpA
c2c0: 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74  lloc];  /* First
c2d0: 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f   byte past end o
c2e0: 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72  f zCsr[] */..  r
c2f0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
c300: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75  , &nArg);.  p->u
c310: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
c320: 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73   (u8)(pParse->is
c330: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
c340: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
c350: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
c360: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
c370: 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20  0 ){.    nMem = 
c380: 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  10;.  }.  memset
c390: 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a  (zCsr, 0, zEnd-z
c3a0: 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20  Csr);.  zCsr += 
c3b0: 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26  (zCsr - (u8*)0)&
c3c0: 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  7;.  assert( EIG
c3d0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
c3e0: 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e  T(zCsr) );.  p->
c3f0: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20  expired = 0;..  
c400: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65  /* Memory for re
c410: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74  gisters, paramet
c420: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63  ers, cursor, etc
c430: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  , is allocated i
c440: 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  n two.  ** passe
c450: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
c460: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
c470: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70   reuse unused sp
c480: 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ace at the .  **
c490: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
c4a0: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
c4b0: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
c4c0: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
c4d0: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
c4e0: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
c4f0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
c500: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
c510: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
c520: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
c530: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72   rest using a fr
c540: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  esh allocation. 
c550: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
c560: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
c570: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
c580: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
c590: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
c5a0: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
c5b0: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
c5c0: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
c5d0: 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66  array can signif
c5e0: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
c5f0: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
c600: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
c610: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
c620: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
c630: 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30   {.    nByte = 0
c640: 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  ;.    p->aMem = 
c650: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d  allocSpace(p->aM
c660: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
c670: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
c680: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
c690: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53  p->aVar = allocS
c6a0: 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56  pace(p->aVar, nV
c6b0: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  ar*sizeof(Mem), 
c6c0: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
c6d0: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41  yte);.    p->apA
c6e0: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
c6f0: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
c700: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43  izeof(Mem*), &zC
c710: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
c720: 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  );.    p->azVar 
c730: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
c740: 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  azVar, nVar*size
c750: 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72  of(char*), &zCsr
c760: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
c770: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  .    p->apCsr = 
c780: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
c790: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
c7a0: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
c7b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73              &zCs
c7d0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
c7e0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c  ;.    p->aOnceFl
c7f0: 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ag = allocSpace(
c800: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f  p->aOnceFlag, nO
c810: 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  nce, &zCsr, zEnd
c820: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  , &nByte);.    i
c830: 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  f( nByte ){.    
c840: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
c850: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
c860: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
c870: 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d   }.    zCsr = p-
c880: 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64  >pFree;.    zEnd
c890: 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b   = &zCsr[nByte];
c8a0: 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65  .  }while( nByte
c8b0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
c8c0: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e  ailed );..  p->n
c8d0: 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72  Cursor = nCursor
c8e0: 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67  ;.  p->nOnceFlag
c8f0: 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20   = nOnce;.  if( 
c900: 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70  p->aVar ){.    p
c910: 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29  ->nVar = (ynVar)
c920: 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  nVar;.    for(n=
c930: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
c940: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e  .      p->aVar[n
c950: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
c960: 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  ll;.      p->aVa
c970: 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  r[n].db = db;.  
c980: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
c990: 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d  >azVar ){.    p-
c9a0: 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d  >nzVar = pParse-
c9b0: 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63  >nzVar;.    memc
c9c0: 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61  py(p->azVar, pPa
c9d0: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e  rse->azVar, p->n
c9e0: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  zVar*sizeof(p->a
c9f0: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d  zVar[0]));.    m
ca00: 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a  emset(pParse->az
ca10: 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  Var, 0, pParse->
ca20: 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61  nzVar*sizeof(pPa
ca30: 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b  rse->azVar[0]));
ca40: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d  .  }.  if( p->aM
ca50: 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65  em ){.    p->aMe
ca60: 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20  m--;            
ca70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
ca80: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
ca90: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e  .nMem */.    p->
caa0: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cac0: 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30        not from 0
cad0: 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20  ..nMem-1 */.    
cae0: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
caf0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
cb00: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
cb10: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
cb20: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
cb30: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
cb40: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e    }.  p->explain
cb50: 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61   = pParse->expla
cb60: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  in;.  sqlite3Vdb
cb70: 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f  eRewind(p);.}../
cb80: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
cb90: 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
cba0: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
cbb0: 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
cbc0: 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
cbd0: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
cbe0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
cbf0: 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
cc00: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
cc10: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
cc20: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
cc30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f  .  sqlite3VdbeSo
cc40: 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
cc50: 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78   pCx);.  if( pCx
cc60: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c  ->pBt ){.    sql
cc70: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
cc80: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a  Cx->pBt);.    /*
cc90: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
cca0: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
ccb0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
ccc0: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
ccd0: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
cce0: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73  above. */.  }els
ccf0: 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73  e if( pCx->pCurs
cd00: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
cd10: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
cd20: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
cd30: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
cd40: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
cd50: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d  TABLE.  if( pCx-
cd60: 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a  >pVtabCursor ){.
cd70: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
cd80: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
cd90: 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61  rsor = pCx->pVta
cda0: 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e  bCursor;.    con
cdb0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
cdc0: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74  e *pModule = pVt
cdd0: 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d  abCursor->pVtab-
cde0: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d  >pModule;.    p-
cdf0: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
ce00: 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  1;.    pModule->
ce10: 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73  xClose(pVtabCurs
ce20: 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  or);.    p->inVt
ce30: 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
ce40: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
ce50: 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65  * Copy the value
ce60: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
ce70: 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74  VdbeFrame struct
ce80: 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e  ure to its Vdbe.
ce90: 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64   This.** is used
cea0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
ceb0: 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75  hen a trigger su
cec0: 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c  b-program is hal
ced0: 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a  ted to restore.*
cee0: 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  * control to the
cef0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a   main program..*
cf00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
cf10: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64  eFrameRestore(Vd
cf20: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  beFrame *pFrame)
cf30: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46  {.  Vdbe *v = pF
cf40: 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f  rame->v;.  v->aO
cf50: 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65  nceFlag = pFrame
cf60: 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76  ->aOnceFlag;.  v
cf70: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46  ->nOnceFlag = pF
cf80: 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b  rame->nOnceFlag;
cf90: 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61  .  v->aOp = pFra
cfa0: 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f  me->aOp;.  v->nO
cfb0: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b  p = pFrame->nOp;
cfc0: 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72  .  v->aMem = pFr
cfd0: 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->aMem;.  v->
cfe0: 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  nMem = pFrame->n
cff0: 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20  Mem;.  v->apCsr 
d000: 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b  = pFrame->apCsr;
d010: 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  v->nCursor = 
d020: 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b  pFrame->nCursor;
d030: 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f  .  v->db->lastRo
d040: 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61  wid = pFrame->la
d050: 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43  stRowid;.  v->nC
d060: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
d070: 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72  nChange;.  retur
d080: 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a  n pFrame->pc;.}.
d090: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
d0a0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
d0b0: 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79  Also release any
d0c0: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
d0d0: 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69  held by the VM i
d0e0: 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20  n the Vdbe.aMem 
d0f0: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
d100: 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e  array. This is n
d110: 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20  ecessary as the 
d120: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61  memory cell arra
d130: 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a  y may contain.**
d140: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62   pointers to Vdb
d150: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20  eFrame objects, 
d160: 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72  which may in tur
d170: 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  n contain pointe
d180: 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75  rs to.** open cu
d190: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rsors..*/.static
d1a0: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
d1b0: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
d1c0: 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
d1d0: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
d1e0: 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f   *pFrame;.    fo
d1f0: 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
d200: 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
d210: 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
d220: 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
d230: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
d240: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65  meRestore(pFrame
d250: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61  );.  }.  p->pFra
d260: 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72  me = 0;.  p->nFr
d270: 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ame = 0;..  if( 
d280: 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20  p->apCsr ){.    
d290: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
d2a0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
d2b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64  ; i++){.      Vd
d2c0: 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70  beCursor *pC = p
d2d0: 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20  ->apCsr[i];.    
d2e0: 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20    if( pC ){.    
d2f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
d300: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
d310: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43  ;.        p->apC
d320: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  sr[i] = 0;.     
d330: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
d340: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
d350: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
d360: 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70  y(&p->aMem[1], p
d370: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77  ->nMem);.  }.  w
d380: 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61  hile( p->pDelFra
d390: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
d3a0: 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70  ame *pDel = p->p
d3b0: 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d  DelFrame;.    p-
d3c0: 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65  >pDelFrame = pDe
d3d0: 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20  l->pParent;.    
d3e0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
d3f0: 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20  Delete(pDel);.  
d400: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
d410: 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63  ny auxdata alloc
d420: 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74  ations made by t
d430: 68 65 20 56 4d 20 2a 2f 0a 20 20 73 71 6c 69 74  he VM */.  sqlit
d440: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
d450: 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20  ata(p, -1, 0);. 
d460: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78   assert( p->pAux
d470: 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Data==0 );.}../*
d480: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
d490: 20 56 4d 20 61 66 74 65 72 20 61 20 73 69 6e 67   VM after a sing
d4a0: 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69  le run..*/.stati
d4b0: 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56  c void Cleanup(V
d4c0: 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
d4d0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
d4e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
d4f0: 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74  EBUG.  /* Execut
d500: 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
d510: 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20  ments to ensure 
d520: 74 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70  that the Vdbe.ap
d530: 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20  Csr[] and .  ** 
d540: 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61  Vdbe.aMem[] arra
d550: 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ys have already 
d560: 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e  been cleaned up.
d570: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20    */.  int i;.  
d580: 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66  if( p->apCsr ) f
d590: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
d5a0: 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72  rsor; i++) asser
d5b0: 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d  t( p->apCsr[i]==
d5c0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  0 );.  if( p->aM
d5d0: 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  em ){.    for(i=
d5e0: 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69  1; i<=p->nMem; i
d5f0: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
d600: 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45  Mem[i].flags==ME
d610: 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20  M_Undefined );. 
d620: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
d630: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d640: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
d650: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
d660: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
d670: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
d680: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
d690: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
d6a0: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
d6b0: 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a  ed by this SQL.*
d6c0: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  * statement. Thi
d6d0: 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20  s is now set at 
d6e0: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61  compile time, ra
d6f0: 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67  ther than during
d700: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  .** execution of
d710: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
d720: 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65  m so that sqlite
d730: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29  3_column_count()
d740: 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65   can.** be calle
d750: 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74  d on an SQL stat
d760: 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c  ement before sql
d770: 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a  ite3_step()..*/.
d780: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
d790: 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20  SetNumCols(Vdbe 
d7a0: 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75  *p, int nResColu
d7b0: 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c  mn){.  Mem *pCol
d7c0: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Name;.  int n;. 
d7d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d7e0: 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ->db;..  release
d7f0: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
d800: 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
d810: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
d820: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d830: 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
d840: 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75  ;.  n = nResColu
d850: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20  mn*COLNAME_N;.  
d860: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
d870: 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b  (u16)nResColumn;
d880: 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d  .  p->aColName =
d890: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d   pColName = (Mem
d8a0: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
d8b0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
d8c0: 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28  (Mem)*n );.  if(
d8d0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20   p->aColName==0 
d8e0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c  ) return;.  whil
d8f0: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
d900: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67    pColName->flag
d910: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
d920: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d    pColName->db =
d930: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c   p->db;.    pCol
d940: 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Name++;.  }.}../
d950: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
d960: 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20  e of the idx'th 
d970: 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74  column to be ret
d980: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
d990: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a   statement..** z
d9a0: 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70  Name must be a p
d9b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20  ointer to a nul 
d9c0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
d9d0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  g..**.** This ca
d9e0: 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20  ll must be made 
d9f0: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
da00: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
da10: 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  mCols()..**.** T
da20: 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
da30: 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62  er, xDel, must b
da40: 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  e one of SQLITE_
da50: 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f  DYNAMIC, SQLITE_
da60: 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c  STATIC.** or SQL
da70: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49  ITE_TRANSIENT. I
da80: 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44  f it is SQLITE_D
da90: 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65  YNAMIC, then the
daa0: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
dab0: 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77  ** to by zName w
dac0: 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20  ill be freed by 
dad0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20  sqlite3DbFree() 
dae0: 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73  when the vdbe is
daf0: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69   destroyed..*/.i
db00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
db10: 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65  tColName(.  Vdbe
db20: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db40: 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69  Vdbe being confi
db50: 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  gured */.  int i
db60: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
db70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
db80: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a  ndex of column z
db90: 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20  Name applies to 
dba0: 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20  */.  int var,   
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbc0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
dbd0: 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f  the COLNAME_* co
dbe0: 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  nstants */.  con
dbf0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
dc20: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61  er containing na
dc30: 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  me */.  void (*x
dc40: 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20  Del)(void*)     
dc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
dc60: 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74  ry management st
dc70: 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65  rategy for zName
dc80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
dc90: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
dca0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
dcb0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b  p->nResColumn );
dcc0: 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43  .  assert( var<C
dcd0: 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66  OLNAME_N );.  if
dce0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
dcf0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73  ailed ){.    ass
dd00: 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78  ert( !zName || x
dd10: 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41  Del!=SQLITE_DYNA
dd20: 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  MIC );.    retur
dd30: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
dd40: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
dd50: 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a  >aColName!=0 );.
dd60: 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70    pColName = &(p
dd70: 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76  ->aColName[idx+v
dd80: 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  ar*p->nResColumn
dd90: 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
dda0: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
ddb0: 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
ddc0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
ddd0: 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72  , xDel);.  asser
dde0: 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61  t( rc!=0 || !zNa
ddf0: 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d  me || (pColName-
de00: 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29  >flags&MEM_Term)
de10: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
de20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72  rc;.}../*.** A r
de30: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
de40: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20  nsaction may or 
de50: 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76  may not be activ
de60: 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  e on database ha
de70: 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61  ndle.** db. If a
de80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
de90: 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69  active, commit i
dea0: 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  t. If there is a
deb0: 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
dec0: 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d  ction spanning m
ded0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
dee0: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
def0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65   routine.** take
df00: 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61  s care of the ma
df10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69  ster journal tri
df20: 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ckery..*/.static
df30: 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28   int vdbeCommit(
df40: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
df50: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
df60: 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30    int nTrans = 0
df70: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
df80: 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61  databases with a
df90: 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74  n active write-t
dfa0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
dfb0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
dfc0: 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63  OK;.  int needXc
dfd0: 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64  ommit = 0;..#ifd
dfe0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
dff0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
e000: 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f   With this optio
e010: 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79  n, sqlite3VtabSy
e020: 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  nc() is defined 
e030: 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20  to be simply .  
e040: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20  ** SQLITE_OK so 
e050: 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a  p is not used. .
e060: 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41    */.  UNUSED_PA
e070: 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64  RAMETER(p);.#end
e080: 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  if..  /* Before 
e090: 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
e0a0: 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
e0b0: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
e0c0: 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
e0d0: 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
e0e0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
e0f0: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
e100: 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
e110: 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
e120: 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
e130: 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
e140: 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
e150: 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
e160: 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
e170: 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
e180: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
e190: 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
e1a0: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
e1b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
e1c0: 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20  Sync(db, p);..  
e1d0: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
e1e0: 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
e1f0: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
e200: 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
e210: 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
e220: 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
e230: 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
e240: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
e250: 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
e260: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
e270: 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
e280: 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
e290: 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
e2a0: 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
e2b0: 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
e2c0: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
e2d0: 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
e2e0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
e2f0: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
e300: 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
e310: 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
e320: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
e330: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
e340: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
e350: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
e360: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
e370: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
e380: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
e390: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
e3a0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
e3b0: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
e3c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
e3d0: 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
e3e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e3f0: 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
e400: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65  Lock(sqlite3Btre
e410: 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20  ePager(pBt));.  
e420: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e430: 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20  Leave(pBt);.    
e440: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  }.  }.  if( rc!=
e450: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e460: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
e470: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
e480: 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61  re any write-tra
e490: 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  nsactions at all
e4a0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d  , invoke the com
e4b0: 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  mit hook */.  if
e4c0: 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26  ( needXcommit &&
e4d0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
e4e0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d  back ){.    rc =
e4f0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
e500: 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74  back(db->pCommit
e510: 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Arg);.    if( rc
e520: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
e530: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
e540: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20  NT_COMMITHOOK;. 
e550: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
e560: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
e570: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
e580: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e590: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
e5a0: 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
e5b0: 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
e5c0: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
e5d0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
e5e0: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
e5f0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
e600: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
e610: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
e620: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
e630: 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
e640: 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
e650: 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
e660: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
e670: 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20  ase is :memory: 
e680: 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  or a temp file. 
e690: 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63   In .  ** that c
e6a0: 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75  ase we do not su
e6b0: 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
e6c0: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
e6d0: 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a   so use the .  *
e6e0: 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  * simple case th
e6f0: 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  en too..  */.  i
e700: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
e710: 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72  len30(sqlite3Btr
e720: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
e730: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20  ->aDb[0].pBt)). 
e740: 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20    || nTrans<=1. 
e750: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
e760: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e770: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
e780: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
e790: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
e7a0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
e7b0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
e7c0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
e7d0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
e7e0: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
e7f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
e800: 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79   the commit only
e810: 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65   if all database
e820: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
e830: 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e  omplete phase 1.
e840: 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20   .    ** If one 
e850: 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d  of the BtreeComm
e860: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
e870: 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69  ls fails, this i
e880: 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20  ndicates an.    
e890: 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c  ** IO error whil
e8a0: 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  e deleting or tr
e8b0: 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e  uncating a journ
e8c0: 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75  al file. It is u
e8d0: 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20  nlikely,.    ** 
e8e0: 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  but could happen
e8f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
e900: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
e910: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
e920: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
e930: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
e940: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
e950: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
e960: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
e970: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
e980: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
e990: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
e9a0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
e9b0: 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30  tPhaseTwo(pBt, 0
e9c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e9d0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e9e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e9f0: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
ea00: 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(db);.    }.  }
ea10: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c  ..  /* The compl
ea20: 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20  ex case - There 
ea30: 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  is a multi-file 
ea40: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
ea50: 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54  n active..  ** T
ea60: 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d  his requires a m
ea70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ea80: 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  le to ensure the
ea90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
eaa0: 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61    ** committed a
eab0: 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  tomically..  */.
eac0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ead0: 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73  MIT_DISKIO.  els
eae0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e{.    sqlite3_v
eaf0: 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70  fs *pVfs = db->p
eb00: 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  Vfs;.    int nee
eb10: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  dSync = 0;.    c
eb20: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
eb30: 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
eb40: 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
eb50: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
eb60: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
eb70: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
eb80: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
eb90: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
eba0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
ebb0: 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20   *pMaster = 0;. 
ebc0: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
ebd0: 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  0;.    int res;.
ebe0: 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75      int retryCou
ebf0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  nt = 0;.    int 
ec00: 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20  nMainFile;..    
ec10: 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
ec20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ec30: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69  name */.    nMai
ec40: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53  nFile = sqlite3S
ec50: 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c  trlen30(zMainFil
ec60: 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  e);.    zMaster 
ec70: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
ec80: 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58  (db, "%s-mjXXXXX
ec90: 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c  X9XXz", zMainFil
eca0: 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73  e);.    if( zMas
ecb0: 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ter==0 ) return 
ecc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ecd0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
ece0: 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20   iRandom;.      
ecf0: 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29  if( retryCount )
ed00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  {.        if( re
ed10: 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a  tryCount>100 ){.
ed20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ed30: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
ed40: 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25  L, "MJ delete: %
ed50: 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
ed60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
ed70: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
ed80: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
ed90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
eda0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
edb0: 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20  tryCount==1 ){. 
edc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
edd0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
ede0: 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25  , "MJ collide: %
edf0: 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
ee00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ee10: 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74        retryCount
ee20: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
ee30: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
ee40: 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69  eof(iRandom), &i
ee50: 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73  Random);.      s
ee60: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ee70: 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61  13, &zMaster[nMa
ee80: 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36  inFile], "-mj%06
ee90: 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20  X9%02X",.       
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d          (iRandom
eec0: 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69  >>8)&0xffffff, i
eed0: 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20  Random&0xff);.  
eee0: 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70      /* The antip
eef0: 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61  enultimate chara
ef00: 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74  cter of the mast
ef10: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
ef20: 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65  must.      ** be
ef30: 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61   "9" to avoid na
ef40: 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68  me collisions wh
ef50: 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c  en using 8+3 fil
ef60: 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20  enames. */.     
ef70: 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72   assert( zMaster
ef80: 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
ef90: 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39  (zMaster)-3]=='9
efa0: 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ' );.      sqlit
efb0: 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d  e3FileSuffix3(zM
efc0: 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72  ainFile, zMaster
efd0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
efe0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
eff0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
f000: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
f010: 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77  S, &res);.    }w
f020: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
f030: 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20  _OK && res );.  
f040: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f050: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
f060: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
f070: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
f080: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f090: 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c  OpenMalloc(pVfs,
f0a0: 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74   zMaster, &pMast
f0b0: 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  er, .          S
f0c0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
f0d0: 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
f0e0: 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
f0f0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
f100: 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
f110: 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
f120: 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  NAL, 0.      );.
f130: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
f140: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f150: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
f160: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
f170: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f180: 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
f190: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
f1a0: 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
f1b0: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
f1c0: 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
f1d0: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
f1e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f1f0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
f200: 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
f210: 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
f220: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
f230: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
f240: 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
f250: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
f260: 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
f270: 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
f280: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f290: 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
f2a0: 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
f2b0: 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
f2c0: 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
f2d0: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
f2e0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
f2f0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
f300: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
f310: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
f320: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
f330: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
f340: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
f350: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
f360: 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
f370: 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
f380: 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
f390: 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20     if( zFile==0 
f3a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
f3b0: 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72  tinue;  /* Ignor
f3c0: 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f  e TEMP and :memo
f3d0: 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
f3e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f3f0: 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
f400: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
f410: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
f420: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
f430: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
f440: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
f450: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
f460: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
f470: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
f480: 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
f490: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
f4a0: 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
f4b0: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
f4c0: 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
f4d0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
f4e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
f4f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f500: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f510: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
f520: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
f530: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
f540: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
f550: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
f560: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
f570: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
f580: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f5a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
f5b0: 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
f5c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
f5d0: 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
f5e0: 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
f5f0: 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
f600: 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
f610: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
f620: 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  f( needSync .   
f630: 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33    && 0==(sqlite3
f640: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
f650: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
f660: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
f670: 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26  QUENTIAL).     &
f680: 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
f690: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
f6a0: 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45  (pMaster, SQLITE
f6b0: 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20  _SYNC_NORMAL)). 
f6c0: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
f6d0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
f6e0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
f6f0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
f700: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
f710: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
f720: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
f730: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
f740: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
f750: 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20  /* Sync all the 
f760: 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65  db files involve
f770: 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  d in the transac
f780: 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63  tion. The same c
f790: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  all.    ** sets 
f7a0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f7b0: 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61  al pointer in ea
f7c0: 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ch individual jo
f7d0: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a  urnal. If.    **
f7e0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
f7f0: 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65   here, do not de
f800: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
f810: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
f820: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
f830: 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
f840: 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
f850: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
f860: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
f870: 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68  itPhaseOne(), th
f880: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68  en there is a ch
f890: 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20  ance that the.  
f8a0: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
f8b0: 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nal file will be
f8c0: 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77   orphaned. But w
f8d0: 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20  e cannot delete 
f8e0: 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61  it,.    ** in ca
f8f0: 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  se the master jo
f900: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
f910: 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
f920: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
f930: 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20   ** file before 
f940: 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75  the failure occu
f950: 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rred..    */.   
f960: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
f970: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
f980: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
f990: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
f9a0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
f9b0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
f9c0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
f9d0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
f9e0: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d  PhaseOne(pBt, zM
f9f0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  aster);.      }.
fa00: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fa10: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
fa20: 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
fa30: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  t( rc!=SQLITE_BU
fa40: 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  SY );.    if( rc
fa50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fa60: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
fa70: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
fa80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fa90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
faa0: 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  Delete the maste
fab0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
fac0: 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65  This commits the
fad0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66   transaction. Af
fae0: 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ter.    ** doing
faf0: 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74   this the direct
fb00: 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67  ory is synced ag
fb10: 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69  ain before any i
fb20: 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a  ndividual.    **
fb30: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c   transaction fil
fb40: 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  es are deleted..
fb50: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
fb60: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
fb70: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31  pVfs, zMaster, 1
fb80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
fb90: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
fba0: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
fbb0: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29   0;.    if( rc )
fbc0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
fbd0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
fbe0: 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
fbf0: 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
fc00: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
fc10: 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
fc20: 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
fc30: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
fc40: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
fc50: 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73  () are only clos
fc60: 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20  ing files and.  
fc70: 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72    ** deleting or
fc80: 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72   truncating jour
fc90: 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
fca0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
fcb0: 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
fcc0: 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
fcd0: 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72  don't really car
fce0: 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
fcf0: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   of the.    ** t
fd00: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
fd10: 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
fd20: 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  , but some stray
fd30: 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
fd40: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c  .    ** may be l
fd50: 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
fd60: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
fd70: 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
fd80: 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
fd90: 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
fda0: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
fdb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
fdc0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
fdd0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
fde0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
fdf0: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
fe00: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
fe10: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
fe20: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
fe30: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
fe40: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29  PhaseTwo(pBt, 1)
fe50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fe60: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
fe70: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
fe80: 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
fe90: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
fea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
feb0: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a  Commit(db);.  }.
fec0: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
fed0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54   rc;.}../* .** T
fee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
fef0: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
ff00: 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20  te3.nVdbeActive 
ff10: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
ff20: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
ff30: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
ff40: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
ff50: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
ff60: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
ff70: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
ff80: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
ff90: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
ffa0: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
ffb0: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
ffc0: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
ffd0: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
ffe0: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
fff0: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
10000 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
10010 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
10020 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
10030 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
10040 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
10050 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
10060 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
10070 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
10080 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20  0;.  int nWrite 
10090 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  = 0;.  int nRead
100a0 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
100b0 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
100c0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  p ){.    if( sql
100d0 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28  ite3_stmt_busy((
100e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29  sqlite3_stmt*)p)
100f0 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
10100 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65  .      if( p->re
10110 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69  adOnly==0 ) nWri
10120 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  te++;.      if( 
10130 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e  p->bIsReader ) n
10140 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Read++;.    }.  
10150 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
10160 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e    }.  assert( cn
10170 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t==db->nVdbeActi
10180 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ve );.  assert( 
10190 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62  nWrite==db->nVdb
101a0 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65  eWrite );.  asse
101b0 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e  rt( nRead==db->n
101c0 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65  VdbeRead );.}.#e
101d0 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
101e0 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
101f0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
10200 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
10210 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
10220 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
10230 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
10240 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
10250 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
10260 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
10270 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
10280 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
10290 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
102a0 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
102b0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
102c0 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
102d0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
102e0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
102f0 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
10300 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
10310 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
10320 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10330 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
10340 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
10350 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
10360 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
10370 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
10380 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
10390 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
103a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
103b0 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
103c0 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
103d0 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Op){.  sqlite3 *
103e0 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62  const db = p->db
103f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
10400 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
10410 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69   p->iStatement i
10420 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
10430 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56  ero, then this V
10440 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20  dbe opened a .  
10450 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
10460 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nsaction that sh
10470 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68  ould be closed h
10480 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78  ere. The only ex
10490 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  ception.  ** is 
104a0 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72  that an IO error
104b0 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72   may have occurr
104c0 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65  ed, causing an e
104d0 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
104e0 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  k..  ** In this 
104f0 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65  case (db->nState
10500 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68  ment==0), and th
10510 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
10520 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o do..  */.  if(
10530 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
10540 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
10550 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
10560 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61     const int iSa
10570 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74  vepoint = p->iSt
10580 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20  atement-1;..    
10590 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56  assert( eOp==SAV
105a0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
105b0 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  || eOp==SAVEPOIN
105c0 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20  T_RELEASE);.    
105d0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
105e0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20  tement>0 );.    
105f0 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
10600 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
10610 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
10620 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66  point) );..    f
10630 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
10640 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
10650 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
10660 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65  _OK;.      Btree
10670 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
10680 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
10690 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
106a0 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
106b0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
106c0 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
106d0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
106e0 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
106f0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
10700 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
10710 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
10720 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
10730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
10740 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
10750 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
10760 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
10770 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
10780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10790 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
107a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
107b0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
107c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
107d0 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65  }.    db->nState
107e0 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69  ment--;.    p->i
107f0 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
10800 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
10820 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
10830 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
10840 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10850 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
10860 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
10870 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
10880 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
10890 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
108a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
108b0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
108c0 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
108d0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
108e0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
108f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10900 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
10910 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10920 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
10930 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
10940 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ore the .    ** 
10950 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
10960 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
10970 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
10980 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
10990 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   when .    ** th
109a0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
109b0 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
109c0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
109d0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
109e0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
109f0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
10a00 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
10a10 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Cons;.      db->
10a20 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
10a30 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
10a40 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  mCons;.    }.  }
10a50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10a60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
10a70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
10a80 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
10a90 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
10aa0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e  database .** han
10ab0 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  dle associated w
10ac0 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65  ith the VM passe
10ad0 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
10ae0 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
10af0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  .** committed. I
10b00 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
10b10 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64  tanding deferred
10b20 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
10b30 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61  straint.** viola
10b40 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  tions, return SQ
10b50 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65  LITE_ERROR. Othe
10b60 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
10b70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
10b80 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
10b90 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61   FK violations a
10ba0 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
10bb0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
10bc0 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74  ITE_ERROR, set t
10bd0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
10be0 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f   VM to SQLITE_CO
10bf0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
10c00 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  KEY.** and write
10c10 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
10c20 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  e to it. Then re
10c30 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
10c40 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  R..*/.#ifndef SQ
10c50 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
10c60 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65  N_KEY.int sqlite
10c70 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62  3VdbeCheckFk(Vdb
10c80 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72  e *p, int deferr
10c90 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ed){.  sqlite3 *
10ca0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
10cb0 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28  ( (deferred && (
10cc0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
10cd0 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  s+db->nDeferredI
10ce0 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c  mmCons)>0) .   |
10cf0 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
10d00 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
10d10 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d  >0) .  ){.    p-
10d20 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e  >rc = SQLITE_CON
10d30 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
10d40 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  EY;.    p->error
10d50 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
10d60 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  t;.    sqlite3Se
10d70 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
10d80 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52 45 49 47  Msg, db, "FOREIG
10d90 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
10da0 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
10db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
10dc0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
10dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
10de0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
10df0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
10e00 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
10e10 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
10e20 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
10e30 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
10e40 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
10e50 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
10e60 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
10e70 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
10e80 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
10e90 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
10ea0 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
10eb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10ec0 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
10ed0 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
10ee0 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
10ef0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
10f00 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
10f10 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
10f20 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
10f30 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
10f40 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
10f50 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
10f60 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
10f70 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
10f80 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
10f90 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
10fa0 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
10fb0 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
10fc0 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
10fd0 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
10fe0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
10ff0 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
11000 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
11010 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
11020 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
11030 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
11040 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
11050 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
11080 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
11090 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
110a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
110b0 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
110c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
110d0 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
110e0 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
110f0 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
11100 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
11110 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
11120 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
11130 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
11140 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
11150 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
11160 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
11170 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
11180 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
11190 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
111a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
111b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
111c0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
111d0 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
111e0 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
111f0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
11200 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
11210 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
11220 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
11230 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
11240 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
11250 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
11260 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
11270 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
11280 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
11290 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
112a0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
112b0 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
112c0 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
112d0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
112e0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
112f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11300 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
11310 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
11320 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c    if( p->aOnceFl
11330 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61  ag ) memset(p->a
11340 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e  OnceFlag, 0, p->
11350 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c  nOnceFlag);.  cl
11360 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
11370 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
11380 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
11390 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
113a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
113b0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
113c0 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
113d0 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
113e0 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
113f0 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
11400 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68  started or if th
11410 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
11420 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  ment does not re
11430 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61  ad or write a da
11440 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f  tabase file.  */
11450 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
11460 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  && p->bIsReader 
11470 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
11480 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
11490 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
114a0 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
114b0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
114c0 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
114d0 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
114e0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
114f0 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
11500 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
11510 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
11520 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
11530 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
11540 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
11550 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
11560 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
11570 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
11580 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
11590 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
115a0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
115b0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
115c0 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
115d0 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
115e0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d              || m
115f0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
11600 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  RUPT || mrc==SQL
11610 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66  ITE_FULL;.    if
11620 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  ( isSpecialError
11630 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
11640 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
11650 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20  ad-only and the 
11660 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
11670 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20  LITE_INTERRUPT, 
11680 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c  .      ** no rol
11690 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61  lback is necessa
116a0 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
116b0 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f  t least a savepo
116c0 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
116d0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
116e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  e rolled back to
116f0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
11700 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20  abase to a .    
11710 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20    ** consistent 
11720 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
11730 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66        ** Even if
11740 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
11750 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20  s read-only, it 
11760 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
11770 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  perform.      **
11780 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
11790 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
117a0 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  back operation. 
117b0 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20  If the error .  
117c0 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20      ** occurred 
117d0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
117e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75   the journal, su
117f0 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74  b-journal or dat
11800 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
11810 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ile as part of a
11820 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65  n effort to free
11830 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20   up cache space 
11840 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20  (see function.  
11850 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65      ** pagerStre
11860 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29  ss() in pager.c)
11870 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  , the rollback i
11880 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65  s required to re
11890 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  store .      ** 
118a0 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63  the pager to a c
118b0 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
118c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
118d0 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
118e0 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
118f0 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
11900 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53       if( (mrc==S
11910 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
11920 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  rc==SQLITE_FULL)
11930 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   && p->usesStmtJ
11940 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
11950 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
11960 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
11970 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  LBACK;.        }
11980 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11990 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64  /* We are forced
119a0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
119b0 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
119c0 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69  tion. Before doi
119d0 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
119e0 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74  so, abort any ot
119f0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74  her statements t
11a00 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65  his handle curre
11a10 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e  ntly has active.
11a20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
11a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
11a40 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
11a50 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
11a60 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  BACK);.         
11a70 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
11a80 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
11a90 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
11aa0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
11ab0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11ac0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
11ad0 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
11ae0 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
11af0 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
11b00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11b10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
11b20 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
11b30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
11b40 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
11b50 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
11b60 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
11b70 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
11b80 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
11b90 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
11ba0 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
11bb0 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
11bc0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
11bd0 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
11be0 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
11bf0 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
11c00 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
11c10 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
11c20 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
11c30 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
11c40 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
11c50 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
11c60 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
11c70 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
11c80 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56   .     && db->nV
11c90 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65  dbeWrite==(p->re
11ca0 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
11cb0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
11cc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
11cd0 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
11ce0 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
11cf0 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
11d00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11d10 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
11d20 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
11d30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11d40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
11d50 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
11d60 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
11d70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11d80 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
11d90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11da0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
11db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11dc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
11dd0 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
11de0 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EY;.        }els
11df0 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e{ .          /*
11e00 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
11e10 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
11e20 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
11e30 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a  was successful .
11e40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
11e50 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
11e60 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
11e70 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
11e80 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
11e90 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63          ** key c
11ea0 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f  onstraints to ho
11eb0 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  ld up the transa
11ec0 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ction. This mean
11ed0 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20  s a commit .    
11ee0 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
11ef0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ired. */.       
11f00 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
11f10 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
11f20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
11f30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
11f40 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20   && p->readOnly 
11f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
11f60 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
11f70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
11f80 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
11f90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11fa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11fb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
11fc0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
11fd0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
11fe0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
11ff0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  _OK);.        }e
12000 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
12010 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
12020 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
12030 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
12040 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
12050 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
12060 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b   ~SQLITE_DeferFK
12070 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  s;.          sql
12080 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
12090 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
120a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
120b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
120c0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
120d0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
120e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
120f0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
12100 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
12110 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30   eStatementOp==0
12120 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
12130 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
12140 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
12150 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
12160 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
12170 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  p = SAVEPOINT_RE
12180 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c  LEASE;.      }el
12190 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
121a0 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
121b0 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
121c0 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
121d0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
121e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
121f0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
12200 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
12210 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
12220 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12230 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
12240 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
12250 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
12260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12270 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
12280 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
12290 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
122a0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
122b0 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
122c0 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
122d0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
122e0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
122f0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
12300 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
12310 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
12320 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
12330 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
12340 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
12350 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
12360 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
12370 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
12380 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
12390 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
123a0 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
123b0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
123c0 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74  */.    if( eStat
123d0 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20  ementOp ){.     
123e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
123f0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
12400 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29  p, eStatementOp)
12410 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
12420 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
12430 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
12440 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d  | (p->rc&0xff)==
12450 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
12460 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  T ){.          p
12470 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
12480 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
12490 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
124a0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  g);.          p-
124b0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
124c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
124d0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
124e0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
124f0 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
12500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
12510 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
12520 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
12530 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
12540 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
12550 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
12560 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50  as an INSERT, UP
12570 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61  DATE or DELETE a
12580 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  nd no statement 
12590 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
125a0 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c  ** has been roll
125b0 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20  ed back, update 
125c0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
125d0 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63  nection change-c
125e0 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a  ounter. .    */.
125f0 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67      if( p->chang
12600 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20  eCntOn ){.      
12610 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
12620 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  !=SAVEPOINT_ROLL
12630 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
12640 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
12650 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68  anges(db, p->nCh
12660 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ange);.      }el
12670 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
12680 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
12690 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  s(db, 0);.      
126a0 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e  }.      p->nChan
126b0 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ge = 0;.    }.. 
126c0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
126d0 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
126e0 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
126f0 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65  p);.  }..  /* We
12700 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
12710 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
12720 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
12730 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
12740 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
12750 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64  0 ){.    db->nVd
12760 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20  beActive--;.    
12770 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
12780 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74   ) db->nVdbeWrit
12790 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  e--;.    if( p->
127a0 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e  bIsReader ) db->
127b0 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20  nVdbeRead--;.   
127c0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
127d0 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56  beActive>=db->nV
127e0 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61  dbeRead );.    a
127f0 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
12800 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57  Read>=db->nVdbeW
12810 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65  rite );.    asse
12820 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  rt( db->nVdbeWri
12830 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70  te>=0 );.  }.  p
12840 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
12850 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65  AGIC_HALT;.  che
12860 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
12870 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  db);.  if( p->db
12880 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12890 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
128a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
128b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74  .  /* If the aut
128c0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
128d0 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68   set to true, th
128e0 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61  en any locks tha
128f0 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a  t were held.  **
12900 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   by connection d
12910 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  b have now been 
12920 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73  released. Call s
12930 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
12940 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a  Unlocked() .  **
12950 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72   to invoke any r
12960 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e  equired unlock-n
12970 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
12980 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
12990 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
129a0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
129b0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b  ionUnlocked(db);
129c0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
129d0 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
129e0 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
129f0 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53  mit==0 || db->nS
12a00 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  tatement==0 );. 
12a10 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
12a20 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51  SQLITE_BUSY ? SQ
12a30 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49  LITE_BUSY : SQLI
12a40 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TE_OK);.}.../*.*
12a50 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
12a60 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
12a70 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
12a80 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
12a90 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
12aa0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
12ab0 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
12ac0 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
12ad0 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
12ae0 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
12af0 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
12b00 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
12b10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
12b20 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  py the error cod
12b30 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
12b40 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
12b50 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64   the VDBE passed
12b60 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
12b70 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73   argument to its
12b80 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12b90 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77   (so that they w
12ba0 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72  ill be .** retur
12bb0 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  ned by calls to 
12bc0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
12bd0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72  ) and sqlite3_er
12be0 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54  rmsg())..**.** T
12bf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
12c00 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20  s not clear the 
12c10 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20  VDBE error code 
12c20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74  or message, just
12c30 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20  .** copies them 
12c40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
12c50 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
12c60 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
12c70 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29  erError(Vdbe *p)
12c80 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
12c90 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
12ca0 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
12cb0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
12cc0 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c     u8 mallocFail
12cd0 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ed = db->mallocF
12ce0 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74  ailed;.    sqlit
12cf0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
12d00 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64  loc();.    if( d
12d10 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d  b->pErr==0 ) db-
12d20 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56  >pErr = sqlite3V
12d30 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
12d40 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
12d50 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
12d60 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
12d70 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
12d80 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
12d90 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
12da0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
12db0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12dc0 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b   = mallocFailed;
12dd0 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65  .    db->errCode
12de0 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = rc;.  }else{.
12df0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12e00 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  (db, rc);.  }.  
12e10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
12e20 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
12e30 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20  LE_SQLLOG./*.** 
12e40 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  If an SQLITE_CON
12e50 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20  FIG_SQLLOG hook 
12e60 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e  is registered an
12e70 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
12e80 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b  n run, .** invok
12e90 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
12ea0 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53  void vdbeInvokeS
12eb0 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a  qllog(Vdbe *v){.
12ec0 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
12ed0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
12ee0 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49  g && v->rc==SQLI
12ef0 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c  TE_OK && v->zSql
12f00 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && v->pc>=0 ){.
12f10 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e      char *zExpan
12f20 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ded = sqlite3Vdb
12f30 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d  eExpandSql(v, v-
12f40 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65  >zSql);.    asse
12f50 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e  rt( v->db->init.
12f60 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69  busy==0 );.    i
12f70 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a  f( zExpanded ){.
12f80 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
12f90 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
12fa0 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  g(.          sql
12fb0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
12fc0 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e  .pSqllogArg, v->
12fd0 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31  db, zExpanded, 1
12fe0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
12ff0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
13000 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b  >db, zExpanded);
13010 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
13020 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65  se.# define vdbe
13030 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a  InvokeSqllog(x).
13040 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c  #endif../*.** Cl
13050 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
13060 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
13070 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
13080 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
13090 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
130a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
130b0 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
130c0 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
130d0 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
130e0 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
130f0 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
13100 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
13110 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
13120 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
13130 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
13140 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
13150 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
13160 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
13170 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
13180 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
13190 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
131a0 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
131b0 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
131c0 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
131d0 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
131e0 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
131f0 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
13200 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
13210 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
13220 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
13230 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
13240 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
13250 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
13260 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
13270 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
13280 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
13290 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71  t now..  */.  sq
132a0 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
132b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
132c0 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
132d0 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
132e0 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
132f0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
13300 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
13310 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
13320 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
13330 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
13340 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
13350 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
13360 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
13370 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
13380 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
13390 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
133a0 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
133b0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
133c0 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
133d0 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
133e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
133f0 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49  >=0 ){.    vdbeI
13400 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a  nvokeSqllog(p);.
13410 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54      sqlite3VdbeT
13420 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b  ransferError(p);
13430 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
13440 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
13450 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
13460 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  sg = 0;.    if( 
13470 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29  p->runOnlyOnce )
13480 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
13490 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
134a0 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
134b0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
134c0 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
134d0 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
134e0 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
134f0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
13500 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
13510 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
13520 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
13530 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
13540 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
13550 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
13560 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
13570 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
13580 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
13590 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c  thMsg(db, p->rc,
135a0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25   p->zErrMsg ? "%
135b0 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d  s" : 0, p->zErrM
135c0 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
135d0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
135e0 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
135f0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
13600 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
13610 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
13620 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
13630 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
13640 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
13650 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
13660 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
13670 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
13680 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
13690 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
136a0 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
136b0 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
136c0 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
136d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
136e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
136f0 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
13700 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
13710 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
13720 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
13730 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
13740 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
13750 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
13760 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69  , "\n");.      i
13770 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
13780 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63        char c, pc
13790 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70   = 0;.        fp
137a0 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
137b0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
137c0 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c  =0; (c = p->zSql
137d0 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
137e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d           if( pc=
137f0 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
13800 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
13810 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f         putc(c, o
13820 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ut);.          p
13830 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d  c = c;.        }
13840 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21  .        if( pc!
13850 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
13860 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
13870 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
13880 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
13890 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
138a0 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20  zHdr[100];.     
138b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
138c0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29  ntf(sizeof(zHdr)
138d0 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32  , zHdr, "%6u %12
138e0 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20  llu %8llu ",.   
138f0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
13900 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
13910 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
13920 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
13930 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
13940 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
13950 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
13960 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
13970 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
13980 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b  ut, "%s", zHdr);
13990 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
139a0 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
139b0 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
139c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
139d0 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
139e0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
139f0 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d  ->iCurrentTime =
13a00 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   0;.  p->magic =
13a10 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
13a20 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
13a30 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
13a40 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
13a50 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
13a60 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
13a70 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
13a80 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
13a90 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
13aa0 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
13ab0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
13ac0 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
13ad0 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
13ae0 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
13af0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
13b00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13b10 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
13b20 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
13b30 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
13b40 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
13b50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
13b60 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
13b70 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
13b80 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
13b90 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
13ba0 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
13bb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13bc0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  ./*.** If parame
13bd0 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20  ter iOp is less 
13be0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
13bf0 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  invoke the destr
13c00 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c  uctor for.** all
13c10 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
13c20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74  pointers current
13c30 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65  ly cached by the
13c40 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a   VM passed as.**
13c50 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
13c60 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ent..**.** Or, i
13c70 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72  f iOp is greater
13c80 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
13c90 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
13ca0 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a   destructor is.*
13cb0 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66  * only invoked f
13cc0 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61  or those auxilia
13cd0 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
13ce0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
13cf0 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  user .** functio
13d00 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  n invoked by the
13d10 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63   OP_Function opc
13d20 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69  ode at instructi
13d30 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d  on iOp of .** VM
13d40 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79   pVdbe, and only
13d50 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   then if:.**.** 
13d60 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61     * the associa
13d70 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  ted function par
13d80 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32  ameter is the 32
13d90 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75  nd or later (cou
13da0 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72  nting.**      fr
13db0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
13dc0 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ), or.**.**    *
13dd0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
13de0 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65  ng bit in argume
13df0 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  nt mask is clear
13e00 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73   (where the firs
13e10 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69  t.**      functi
13e20 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72  on parameter cor
13e30 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20  responds to bit 
13e40 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64  0 etc.)..*/.void
13e50 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
13e60 74 65 41 75 78 44 61 74 61 28 56 64 62 65 20 2a  teAuxData(Vdbe *
13e70 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20  pVdbe, int iOp, 
13e80 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78  int mask){.  Aux
13e90 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64  Data **pp = &pVd
13ea0 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20  be->pAuxData;.  
13eb0 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20  while( *pp ){.  
13ec0 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20    AuxData *pAux 
13ed0 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28  = *pp;.    if( (
13ee0 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28  iOp<0).     || (
13ef0 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26  pAux->iOp==iOp &
13f00 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31  & (pAux->iArg>31
13f10 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53   || !(mask & MAS
13f20 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72  KBIT32(pAux->iAr
13f30 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
13f40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75     testcase( pAu
13f50 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20  x->iArg==31 );. 
13f60 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
13f70 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
13f80 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
13f90 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
13fa0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
13fb0 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20   pAux->pNext;.  
13fc0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13fd0 65 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75  e(pVdbe->db, pAu
13fe0 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
13ff0 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e       pp= &pAux->
14000 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
14010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
14020 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
14030 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
14040 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
14050 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14060 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20  ,.** except for 
14070 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77  object itself, w
14080 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65  hich is preserve
14090 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  d..**.** The dif
140a0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
140b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
140c0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
140d0 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
140e0 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
140f0 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
14100 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
14110 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
14120 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
14130 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14140 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68  ion and frees th
14150 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e  e object itself.
14160 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14170 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
14180 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
14190 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67  e *p){.  SubProg
141a0 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78  ram *pSub, *pNex
141b0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
141c0 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
141d0 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
141e0 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
141f0 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61  (p->aVar, p->nVa
14200 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  r);.  releaseMem
14210 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
14220 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
14230 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
14240 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
14250 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
14260 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
14270 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
14280 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
14290 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
142a0 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
142b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
142c0 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
142d0 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61  .  for(i=p->nzVa
142e0 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20  r-1; i>=0; i--) 
142f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14300 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a  , p->azVar[i]);.
14310 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
14320 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d  y(db, p->aOp, p-
14330 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  >nOp);.  sqlite3
14340 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
14350 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
14360 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14370 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
14380 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
14390 72 65 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  ree);.#if define
143a0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
143b0 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20  TREE_EXPLAIN).  
143c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
143d0 2c 20 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a  , p->zExplain);.
143e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
143f0 64 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29  db, p->pExplain)
14400 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
14410 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
14420 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
14430 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
14440 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  te(Vdbe *p){.  s
14450 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
14460 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
14470 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
14480 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
14490 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
144a0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
144b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
144c0 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70  learObject(db, p
144d0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
144e0 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
144f0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
14500 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
14510 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
14520 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
14530 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
14540 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
14550 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
14560 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
14570 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
14580 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
14590 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
145a0 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
145b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
145c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
145d0 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70  rsor "p" has a p
145e0 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72  ending seek oper
145f0 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e  ation that has n
14600 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63  ot yet been.** c
14610 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65  arried out.  See
14620 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77  k the cursor now
14630 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  .  If an error o
14640 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a  ccurs, return.**
14650 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
14660 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
14670 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
14680 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
14690 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
146a0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
146b0 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
146c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
146d0 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  T.  extern int s
146e0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
146f0 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  unt;.#endif.  as
14700 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65  sert( p->deferre
14710 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73  dMoveto );.  ass
14720 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
14730 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
14740 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
14750 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  cked(p->pCursor,
14760 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
14770 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
14780 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14790 20 72 63 3b 0a 20 20 70 2d 3e 6c 61 73 74 52 6f   rc;.  p->lastRo
147a0 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54  wid = p->movetoT
147b0 61 72 67 65 74 3b 0a 20 20 69 66 28 20 72 65 73  arget;.  if( res
147c0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=0 ) return SQL
147d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
147e0 3b 0a 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61  ;.  p->rowidIsVa
147f0 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  lid = 1;.#ifdef 
14800 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
14810 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
14820 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  nt++;.#endif.  p
14830 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
14840 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
14850 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
14860 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53  TALE;.  return S
14870 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14880 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73  ** Something has
14890 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70   moved cursor "p
148a0 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20  " out of place. 
148b0 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69   Maybe the row i
148c0 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64  t was.** pointed
148d0 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20   to was deleted 
148e0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69  out from under i
148f0 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65  t.  Or maybe the
14900 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65   btree was.** re
14910 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65  balanced.  Whate
14920 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74  ver the cause, t
14930 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70  ry to restore "p
14940 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69  " to the place i
14950 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64  t.** is supposed
14960 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e   to be pointing.
14970 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73    If the row was
14980 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
14990 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63  m under the.** c
149a0 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63  ursor, set the c
149b0 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
149c0 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f  o a NULL row..*/
149d0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
149e0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
149f0 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64  leMovedCursor(Vd
14a00 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
14a10 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52  int isDifferentR
14a20 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74  ow, rc;.  assert
14a30 28 20 70 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20  ( p->pCursor!=0 
14a40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
14a50 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
14a60 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73  asMoved(p->pCurs
14a70 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  or) );.  rc = sq
14a80 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
14a90 52 65 73 74 6f 72 65 28 70 2d 3e 70 43 75 72 73  Restore(p->pCurs
14aa0 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74  or, &isDifferent
14ab0 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65  Row);.  p->cache
14ac0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
14ad0 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69  TALE;.  if( isDi
14ae0 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e  fferentRow ) p->
14af0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72  nullRow = 1;.  r
14b00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14b10 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
14b20 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
14b30 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
14b40 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
14b50 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
14b60 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
14b70 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
14b80 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
14b90 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
14ba0 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
14bb0 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
14bc0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
14bd0 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
14be0 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
14bf0 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
14c00 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
14c10 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
14c20 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
14c30 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
14c40 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
14c50 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
14c60 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
14c70 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
14c80 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
14c90 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
14ca0 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
14cb0 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
14cc0 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
14cd0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
14ce0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
14cf0 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
14d00 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
14d10 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
14d20 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
14d30 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
14d40 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
14d50 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
14d60 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
14d70 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
14d80 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
14d90 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65  ){.  if( p->defe
14da0 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
14db0 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44    return handleD
14dc0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29  eferredMoveto(p)
14dd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
14de0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
14df0 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
14e00 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
14e10 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
14e20 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  or(p);.  }.  ret
14e30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14e40 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
14e50 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a  owing functions:
14e60 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  .**.** sqlite3Vd
14e70 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a  beSerialType().*
14e80 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
14e90 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20  ialTypeLen().** 
14ea0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14eb0 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lLen().** sqlite
14ec0 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29  3VdbeSerialPut()
14ed0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
14ee0 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a  erialGet().**.**
14ef0 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65   encapsulate the
14f00 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61   code that seria
14f10 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72  lizes values for
14f20 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69   storage in SQLi
14f30 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69  te.** data and i
14f40 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61  ndex records. Ea
14f50 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  ch serialized va
14f60 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  lue consists of 
14f70 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70  a.** 'serial-typ
14f80 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66  e' and a blob of
14f90 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61   data. The seria
14fa0 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62  l type is an 8-b
14fb0 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20  yte unsigned.** 
14fc0 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20  integer, stored 
14fd0 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a  as a varint..**.
14fe0 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20  ** In an SQLite 
14ff0 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68  index record, th
15000 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
15010 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79   stored directly
15020 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62   before.** the b
15030 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74  lob of data that
15040 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20   it corresponds 
15050 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72  to. In a table r
15060 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61  ecord, all seria
15070 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73  l.** types are s
15080 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
15090 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
150a0 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20  , and the blobs 
150b0 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68  of data at.** th
150c0 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65  e end. Hence the
150d0 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c  se functions all
150e0 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  ow the caller to
150f0 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73   handle the.** s
15100 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64  erial-type and d
15110 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74  ata blob separat
15120 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ely..**.** The f
15130 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
15140 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72  escribes the var
15150 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61  ious storage cla
15160 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a  sses for data:.*
15170 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79  *.**   serial ty
15180 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20  pe        bytes 
15190 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70  of data      typ
151a0 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
151b0 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
151c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
151d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
151e0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
151f0 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
15200 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20          NULL.** 
15210 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
15220 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
15230 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
15240 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32  nteger.**      2
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15260 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
15270 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
15280 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
15290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
152a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
152b0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
152c0 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
152d0 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20           4      
152e0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
152f0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20  eger.**      5  
15300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15310 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
15320 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
15330 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20  *      6        
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
15350 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
15360 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
15370 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20   7              
15380 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
15390 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a      IEEE float.*
153a0 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20  *      8        
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
153c0 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
153d0 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20  r constant 0.** 
153e0 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20       9          
153f0 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
15400 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
15410 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20  constant 1.**   
15420 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20    10,11         
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15440 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66        reserved f
15450 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20  or expansion.** 
15460 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65     N>=12 and eve
15470 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32  n       (N-12)/2
15480 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20          BLOB.** 
15490 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64     N>=13 and odd
154a0 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32          (N-13)/2
154b0 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a          text.**.
154c0 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74  ** The 8 and 9 t
154d0 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20  ypes were added 
154e0 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66  in 3.3.0, file f
154f0 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20  ormat 4.  Prior 
15500 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53  versions.** of S
15510 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75  QLite will not u
15520 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20  nderstand those 
15530 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f  serial types..*/
15540 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
15550 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66  he serial-type f
15560 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
15570 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a  red in pMem..*/.
15580 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
15590 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70  erialType(Mem *p
155a0 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
155b0 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61  rmat){.  int fla
155c0 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
155d0 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 69 66  ;.  u32 n;..  if
155e0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ( flags&MEM_Null
155f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
15600 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
15610 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
15620 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
15630 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
15640 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
15650 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
15660 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
15670 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
15680 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
15690 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
156a0 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
156b0 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
156c0 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54  if( i<(-MAX_6BYT
156d0 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b 0a 20  E) ) return 6;. 
156e0 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
156f0 20 74 65 73 74 20 70 72 65 76 65 6e 74 73 3a 20   test prevents: 
15700 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37 32 30   u = -(-92233720
15710 33 36 38 35 34 37 37 35 38 30 38 29 20 2a 2f 0a  36854775808) */.
15720 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20        u = -i;.  
15730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
15740 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
15750 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20  if( u<=127 ){.  
15760 20 20 20 20 72 65 74 75 72 6e 20 28 28 69 26 31      return ((i&1
15770 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72  )==i && file_for
15780 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32  mat>=4) ? 8+(u32
15790 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20  )u : 1;.    }.  
157a0 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
157b0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
157c0 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20  f( u<=8388607 ) 
157d0 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66  return 3;.    if
157e0 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
157f0 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20  ) return 4;.    
15800 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45  if( u<=MAX_6BYTE
15810 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20   ) return 5;.   
15820 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20   return 6;.  }. 
15830 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
15840 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eal ){.    retur
15850 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
15860 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  t( pMem->db->mal
15870 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61  locFailed || fla
15880 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
15890 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72  Blob) );.  asser
158a0 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b  t( pMem->n>=0 );
158b0 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d  .  n = (u32)pMem
158c0 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
158d0 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
158e0 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
158f0 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 72 65 74  nZero;.  }.  ret
15900 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20  urn ((n*2) + 12 
15910 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74  + ((flags&MEM_St
15920 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r)!=0));.}../*.*
15930 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
15940 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
15950 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
15960 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
15970 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
15980 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
15990 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
159a0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
159b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
159c0 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  12 ){.    return
159d0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
159e0 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
159f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
15a00 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c  8 aSize[] = { 0,
15a10 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20   1, 2, 3, 4, 6, 
15a20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30  8, 8, 0, 0, 0, 0
15a30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   };.    return a
15a40 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65  Size[serial_type
15a50 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ];.  }.}../*.** 
15a60 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20  If we are on an 
15a70 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74  architecture wit
15a80 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66  h mixed-endian f
15a90 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e  loating .** poin
15aa0 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68  ts (ex: ARM7) th
15ab0 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65  en swap the lowe
15ac0 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  r 4 bytes with t
15ad0 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62  he .** upper 4 b
15ae0 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ytes.  Return th
15af0 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
15b00 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65  For most archite
15b10 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20  ctures, this is 
15b20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28  a no-op..**.** (
15b30 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72  later):  It is r
15b40 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68  eported to me th
15b50 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64  at the mixed-end
15b60 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f  ian problem.** o
15b70 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73  n ARM7 is an iss
15b80 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74  ue with GCC, not
15b90 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63   with the ARM7 c
15ba0 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a  hip.  It seems.*
15bb0 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72  * that early ver
15bc0 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f  sions of GCC sto
15bd0 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64  red the two word
15be0 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a  s of a 64-bit.**
15bf0 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72   float in the wr
15c00 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20  ong order.  And 
15c10 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62  that error has b
15c20 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a  een propagated.*
15c30 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54  * ever since.  T
15c40 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20  he blame is not 
15c50 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68  necessarily with
15c60 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a   GCC, though..**
15c70 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20   GCC might have 
15c80 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65  just copying the
15c90 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20   problem from a 
15ca0 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a  prior compiler..
15cb0 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c  ** I am also tol
15cc0 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  d that newer ver
15cd0 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61  sions of GCC tha
15ce0 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65  t follow a diffe
15cf0 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20  rent.** ABI get 
15d00 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72  the byte order r
15d10 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65  ight..**.** Deve
15d20 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c  lopers using SQL
15d30 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73  ite on an ARM7 s
15d40 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e  hould compile an
15d50 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61  d run their.** a
15d60 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67  pplication using
15d70 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d   -DSQLITE_DEBUG=
15d80 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  1 at least once.
15d90 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20    With DEBUG.** 
15da0 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73  enabled, some as
15db0 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c  serts below will
15dc0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
15dd0 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a   byte order of.*
15de0 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
15df0 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65   values is corre
15e00 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d  ct..**.** (2007-
15e10 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61  08-30)  Frank va
15e20 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69  n Vugt has studi
15e30 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ed this problem 
15e40 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68  closely.** and h
15e50 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64  as send his find
15e60 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69  ings to the SQLi
15e70 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20  te developers.  
15e80 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20  Frank.** writes 
15e90 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20  that some Linux 
15ea0 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c  kernels offer fl
15eb0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72  oating point har
15ec0 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69  dware.** emulati
15ed0 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c  on that uses onl
15ee0 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73  y 32-bit mantiss
15ef0 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  as instead of a 
15f00 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73  full .** 48-bits
15f10 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
15f20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72  the IEEE standar
15f30 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  d.  (This is the
15f40 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46  .** CONFIG_FPE_F
15f50 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20  ASTFPE option.) 
15f60 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73   On such systems
15f70 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  , floating point
15f80 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e  .** byte swappin
15f90 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63  g becomes very c
15fa0 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20  omplicated.  To 
15fb0 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a  avoid problems,.
15fc0 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ** the necessary
15fd0 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69   byte swapping i
15fe0 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73  s carried out us
15ff0 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74  ing a 64-bit int
16000 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74  eger.** rather t
16010 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  han a 64-bit flo
16020 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72  at.  Frank assur
16030 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63  es us that the c
16040 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b  ode here.** work
16050 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20  s for him.  We, 
16060 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20  the developers, 
16070 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69  have no way to i
16080 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20  ndependently.** 
16090 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74  verify this, but
160a0 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20   Frank seems to 
160b0 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20  know what he is 
160c0 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a  talking about.**
160d0 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d   so we trust him
160e0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
160f0 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
16100 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74  64BIT_FLOAT.stat
16110 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70  ic u64 floatSwap
16120 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  (u64 in){.  unio
16130 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  n {.    u64 r;. 
16140 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
16150 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
16160 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
16170 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
16180 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
16190 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
161a0 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
161b0 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
161c0 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
161d0 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
161e0 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
161f0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
16200 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
16210 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
16220 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
16230 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
16240 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
16250 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
16260 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
16270 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
16280 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
16290 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
162a0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
162b0 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
162c0 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
162d0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
162e0 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
162f0 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20    The caller is 
16300 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66  responsible.** f
16310 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e  or allocating en
16320 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75  ough space to bu
16330 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  f[] to hold the 
16340 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78  entire field, ex
16350 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68  clusive.** of th
16360 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20  e pMem->u.nZero 
16370 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f  bytes for a MEM_
16380 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  Zero value..**.*
16390 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
163a0 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
163b0 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
163c0 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
163d0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
163e0 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
163f0 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
16400 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
16410 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
16420 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
16430 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
16440 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73  buf[]..*/ .u32 s
16450 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16460 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d  Put(u8 *buf, Mem
16470 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69   *pMem, u32 seri
16480 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20  al_type){.  u32 
16490 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
164a0 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
164b0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
164c0 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
164d0 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
164e0 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
164f0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
16500 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
16510 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
16520 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e  =sizeof(pMem->u.
16530 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
16540 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e  py(&v, &pMem->u.
16550 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
16560 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
16570 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
16580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
16590 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
165a0 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
165b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
165c0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
165d0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73  l_type);.    ass
165e0 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
165f0 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d  do{.      buf[--
16600 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46  i] = (u8)(v&0xFF
16610 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
16620 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20  ;.    }while( i 
16630 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
16640 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
16650 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
16660 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
16670 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
16680 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
16690 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
166a0 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
166b0 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20  nZero:0).       
166c0 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71        == (int)sq
166d0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
166e0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
166f0 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  pe) );.    len =
16700 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
16710 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
16720 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74  z, len);.    ret
16730 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
16740 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
16750 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
16760 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
16770 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20   Input "x" is a 
16780 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69  sequence of unsi
16790 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20  gned characters 
167a0 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61  that represent a
167b0 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  .** big-endian i
167c0 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20  nteger.  Return 
167d0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e  the equivalent n
167e0 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f  ative integer.*/
167f0 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54  .#define ONE_BYT
16800 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38  E_INT(x)    ((i8
16810 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65  )(x)[0]).#define
16820 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29   TWO_BYTE_INT(x)
16830 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78      (256*(i8)((x
16840 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64  )[0])|(x)[1]).#d
16850 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45  efine THREE_BYTE
16860 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a  _INT(x)  (65536*
16870 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78  (i8)((x)[0])|((x
16880 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29  )[1]<<8)|(x)[2])
16890 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59  .#define FOUR_BY
168a0 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75  TE_UINT(x)  (((u
168b0 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28  32)(x)[0]<<24)|(
168c0 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29  (x)[1]<<16)|((x)
168d0 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a  [2]<<8)|(x)[3]).
168e0 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54  #define FOUR_BYT
168f0 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 32  E_INT(x) (167772
16900 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  16*(i8)((x)[0])|
16910 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78  ((x)[1]<<16)|((x
16920 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29  )[2]<<8)|(x)[3])
16930 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
16940 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
16950 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
16960 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
16970 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
16980 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
16990 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
169a0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
169b0 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
169c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
169d0 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
169e0 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 61  nted as two sepa
169f0 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f  rate routines fo
16a00 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  r performance..*
16a10 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73 20  * The few cases 
16a20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63  that require loc
16a30 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  al variables are
16a40 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
16a50 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72   a separate.** r
16a60 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69  outine so that i
16a70 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65  n most cases the
16a80 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76   overhead of mov
16a90 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f  ing the stack po
16aa0 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69  inter.** is avoi
16ab0 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ded..*/ .static 
16ac0 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  u32 SQLITE_NOINL
16ad0 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20  INE serialGet(. 
16ae0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
16af0 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
16b00 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
16b10 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
16b20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
16b30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16b40 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
16b50 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
16b60 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b80 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
16b90 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
16ba0 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20  nto */.){.  u64 
16bb0 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
16bc0 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79  NT(buf);.  u32 y
16bd0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
16be0 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20  T(buf+4);.  x = 
16bf0 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69  (x<<32) + y;.  i
16c00 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
16c10 36 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  6 ){.    pMem->u
16c20 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
16c30 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
16c40 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74  = MEM_Int;.    t
16c50 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
16c60 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .i<0 );.  }else{
16c70 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
16c80 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
16c90 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
16ca0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
16cb0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
16cc0 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c   integers and fl
16cd0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
16ce0 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ues use the same
16cf0 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64  .    ** byte ord
16d00 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66  er.  Or, that if
16d10 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
16d20 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
16d30 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e   is.    ** defin
16d40 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66  ed that 64-bit f
16d50 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
16d60 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20  lues really are 
16d70 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64  mixed.    ** end
16d80 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ian..    */.    
16d90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
16da0 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
16db0 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
16dc0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
16dd0 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
16de0 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a     u64 t2 = t1;.
16df0 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
16e00 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20  ianFloat(t2);.  
16e10 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16e20 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29  (r1)==sizeof(t2)
16e30 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20   && memcmp(&r1, 
16e40 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29  &t2, sizeof(r1))
16e50 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
16e60 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16e70 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
16e80 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29  (pMem->u.r)==8 )
16e90 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45  ;.    swapMixedE
16ea0 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20  ndianFloat(x);. 
16eb0 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
16ec0 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  >u.r, &x, sizeof
16ed0 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  (x));.    pMem->
16ee0 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49  flags = sqlite3I
16ef0 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  sNaN(pMem->u.r) 
16f00 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d  ? MEM_Null : MEM
16f10 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  _Real;.  }.  ret
16f20 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c  urn 8;.}.u32 sql
16f30 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
16f40 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t(.  const unsig
16f50 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20  ned char *buf,  
16f60 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
16f70 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d  deserialize from
16f80 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
16f90 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  _type,          
16fa0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
16fb0 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  pe to deserializ
16fc0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
16ff0 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c  ell to write val
17000 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ue into */.){.  
17010 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
17020 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
17030 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  10:   /* Reserve
17040 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
17050 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a   */.    case 11:
17060 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
17070 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
17080 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20  .    case 0: {  
17090 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20  /* NULL */.     
170a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
170b0 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62  EM_Null;.      b
170c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
170d0 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
170e0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
170f0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
17100 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45  ->u.i = ONE_BYTE
17110 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
17120 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
17130 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
17140 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
17150 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
17160 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
17170 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
17180 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
17190 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
171a0 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54  m->u.i = TWO_BYT
171b0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
171c0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
171d0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
171e0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
171f0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
17200 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
17210 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
17220 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
17230 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
17240 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f  em->u.i = THREE_
17250 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
17260 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
17270 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
17280 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
17290 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
172a0 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
172b0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
172c0 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
172d0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
172e0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
172f0 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  R_BYTE_INT(buf);
17300 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
17310 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
17320 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
17330 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
17340 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
17350 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
17360 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
17370 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
17380 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46     pMem->u.i = F
17390 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
173a0 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  f+2) + (((i64)1)
173b0 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
173c0 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
173d0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
173e0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
173f0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
17400 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
17410 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
17420 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
17430 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
17440 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
17450 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
17460 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
17470 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20     /* These use 
17480 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c  local variables,
17490 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61   so do them in a
174a0 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e   separate routin
174b0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76  e.      ** to av
174c0 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f  oid having to mo
174d0 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69  ve the frame poi
174e0 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d  nter in the comm
174f0 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20  on case */.     
17500 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65   return serialGe
17510 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70  t(buf,serial_typ
17520 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  e,pMem);.    }. 
17530 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
17540 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
17550 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
17560 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
17570 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
17580 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
17590 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
175a0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
175b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
175c0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
175d0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
175e0 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d  st u16 aFlag[] =
175f0 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   { MEM_Blob|MEM_
17600 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d  Ephem, MEM_Str|M
17610 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20  EM_Ephem };.    
17620 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
17630 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
17640 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c  Mem->n = (serial
17650 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
17660 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
17670 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79   aFlag[serial_ty
17680 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74  pe&1];.      ret
17690 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  urn pMem->n;.   
176a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
176b0 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  0;.}./*.** This 
176c0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
176d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66  to allocate suff
176e0 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72  icient space for
176f0 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f   an UnpackedReco
17700 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
17710 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
17720 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  be used with sql
17730 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
17740 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65  pack() if.** the
17750 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
17760 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
17770 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
17780 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a  e pKeyInfo..**.*
17790 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65  * The space is e
177a0 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ither allocated 
177b0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d  using sqlite3DbM
177c0 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72  allocRaw() or fr
177d0 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  om within.** the
177e0 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65   unaligned buffe
177f0 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65  r passed via the
17800 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72   second and thir
17810 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65  d arguments (pre
17820 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b  sumably.** stack
17830 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20   space). If the 
17840 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70  former, then *pp
17850 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61  Free is set to a
17860 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68   pointer that sh
17870 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74  ould.** be event
17880 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74  ually freed by t
17890 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
178a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
178b0 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20   Or, if the .** 
178c0 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73  allocation comes
178d0 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65   from the pSpace
178e0 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c  /szSpace buffer,
178f0 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
17900 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72  to NULL.** befor
17910 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
17920 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
17930 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
17940 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
17950 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
17960 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
17970 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
17980 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
17990 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
179a0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
179b0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
179c0 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
179d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
179e0 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64      /* Unaligned
179f0 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
17a00 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63   */.  int szSpac
17a10 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
17a20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
17a30 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
17a40 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  es */.  char **p
17a50 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20  pFree           
17a60 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
17a70 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72  Caller should fr
17a80 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  ee this pointer 
17a90 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64  */.){.  Unpacked
17aa0 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20  Record *p;      
17ab0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63          /* Unpac
17ac0 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65  ked record to re
17ad0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  turn */.  int nO
17ae0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
17af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
17b00 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79  rement pSpace by
17b10 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69   nOff to align i
17b20 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  t */.  int nByte
17b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17b40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17b50 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
17b60 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20  ed for *p */..  
17b70 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68  /* We want to sh
17b80 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ift the pointer 
17b90 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74  pSpace up such t
17ba0 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65  hat it is 8-byte
17bb0 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54   aligned..  ** T
17bc0 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  hus, we need to 
17bd0 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75  calculate a valu
17be0 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e  e, nOff, between
17bf0 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69   0 and 7, to shi
17c00 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20  ft .  ** it by. 
17c10 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c   If pSpace is al
17c20 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69  ready 8-byte ali
17c30 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c  gned, nOff shoul
17c40 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a  d be zero..  */.
17c50 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53    nOff = (8 - (S
17c60 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
17c70 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26  (pSpace) & 7)) &
17c80 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f   7;.  nByte = RO
17c90 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
17ca0 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
17cb0 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
17cc0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
17cd0 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
17ce0 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20  pace+nOff ){.   
17cf0 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
17d00 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
17d10 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
17d20 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
17d30 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63      *ppFree = (c
17d40 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28  har *)p;.    if(
17d50 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
17d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
17d70 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
17d80 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b  *)&pSpace[nOff];
17d90 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30  .    *ppFree = 0
17da0 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d  ;.  }..  p->aMem
17db0 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72   = (Mem*)&((char
17dc0 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65  *)p)[ROUND8(size
17dd0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
17de0 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  d))];.  assert( 
17df0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
17e00 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e  rder!=0 );.  p->
17e10 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
17e20 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  nfo;.  p->nField
17e30 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
17e40 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  eld + 1;.  retur
17e50 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
17e60 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
17e70 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
17e80 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
17e90 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  , populate the .
17ea0 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
17eb0 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  d structure indi
17ec0 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75  cated by the fou
17ed0 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rth argument wit
17ee0 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  h the.** content
17ef0 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64  s of the decoded
17f00 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69   record..*/ .voi
17f10 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  d sqlite3VdbeRec
17f20 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
17f30 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
17f40 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
17f50 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
17f60 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
17f70 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
17f80 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
17f90 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
17fa0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
17fb0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
17fc0 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
17fd0 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  cord */.  Unpack
17fe0 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20  edRecord *p     
17ff0 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
18000 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  s structure befo
18010 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
18020 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
18030 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
18040 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
18050 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
18060 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69   int d; .  u32 i
18070 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
18080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
18090 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74  fset in aKey[] t
180a0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
180b0 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
180e0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
180f0 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
18100 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *pMem = p->aMem;
18110 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72  ..  p->default_r
18120 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
18130 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
18140 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20  NMENT(pMem) );. 
18150 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
18160 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
18170 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
18180 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  u = 0;.  while( 
18190 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d  idx<szHdr && d<=
181a0 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20  nKey ){.    u32 
181b0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
181c0 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
181d0 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c  nt32(&aKey[idx],
181e0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
181f0 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
18200 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
18210 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
18220 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f  yInfo->db;.    /
18230 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20  * pMem->flags = 
18240 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62  0; // sqlite3Vdb
18250 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c  eSerialGet() wil
18260 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75  l set this for u
18270 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73  s */.    pMem->s
18280 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
18290 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
182a0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
182b0 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
182c0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
182d0 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b  m++;.    if( (++
182e0 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20  u)>=p->nField ) 
182f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73  break;.  }.  ass
18300 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f  ert( u<=pKeyInfo
18310 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  ->nField + 1 );.
18320 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
18330 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
18340 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
18350 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
18360 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74  s two index or t
18370 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73  able record keys
18380 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
18390 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74  .** as the sqlit
183a0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
183b0 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55  are() routine. U
183c0 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64  nlike VdbeRecord
183d0 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68  Compare(),.** th
183e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
183f0 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d  rializes and com
18400 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69  pares values usi
18410 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
18420 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
18430 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43   and sqlite3MemC
18440 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f  ompare() functio
18450 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a  ns. It is used.*
18460 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  * in assert() st
18470 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
18480 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  re that the opti
18490 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a  mized code in.**
184a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
184b0 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75  rdCompare() retu
184c0 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68  rns results with
184d0 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69   these two primi
184e0 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  tives..**.** Ret
184f0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
18500 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
18510 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65  ison is equivale
18520 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73  nt to desiredRes
18530 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66  ult..** Return f
18540 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73  alse if there is
18550 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e   a disagreement.
18560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
18570 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
18580 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65  Debug(.  int nKe
18590 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
185a0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
185b0 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e  ey */.  const Un
185c0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
185d0 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b  Key2, /* Right k
185e0 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69  ey */.  int desi
185f0 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20  redResult       
18600 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74        /* Correct
18610 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20   answer */.){.  
18620 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
18630 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
18640 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
18650 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
18660 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
18670 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
18680 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
18690 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
186a0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
186b0 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  r1;        /* Nu
186c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
186d0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
186e0 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   i = 0;.  int rc
186f0 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
18700 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
18710 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
18720 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
18730 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  1;.  KeyInfo *pK
18740 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65  eyInfo;.  Mem me
18750 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20  m1;..  pKeyInfo 
18760 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
18770 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e  fo;.  if( pKeyIn
18780 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75  fo->db==0 ) retu
18790 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  rn 1;.  mem1.enc
187a0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
187b0 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
187c0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
187d0 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
187e0 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
187f0 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
18800 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
18810 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
18820 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20  ( mem1.szMalloc 
18830 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
18840 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
18850 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
18860 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
18870 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
18880 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
18890 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
188a0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
188b0 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
188c0 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
188d0 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
188e0 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
188f0 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
18900 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
18910 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
18920 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69   be used uniniti
18930 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
18940 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
18950 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
18960 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
18970 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
18980 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
18990 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
189a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
189b0 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
189c0 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
189d0 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
189e0 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
189f0 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
18a00 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
18a10 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
18a20 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
18a30 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
18a40 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
18a50 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
18a60 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
18a70 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
18a80 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
18a90 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
18aa0 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
18ab0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
18ac0 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
18ad0 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
18ae0 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
18af0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
18b00 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
18b10 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
18b20 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
18b30 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
18b40 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
18b50 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
18b60 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
18b70 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
18b80 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
18b90 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
18ba0 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
18bb0 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
18bc0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
18bd0 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
18be0 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
18bf0 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  e1 );..    /* Ve
18c00 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20  rify that there 
18c10 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70  is enough key sp
18c20 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  ace remaining to
18c30 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20   avoid.    ** a 
18c40 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e  buffer overread.
18c50 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c    The "d1+serial
18c60 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70  _type1+2" subexp
18c70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ression will.   
18c80 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72   ** always be gr
18c90 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
18ca0 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e  ual to the amoun
18cb0 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65  t of required ke
18cc0 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  y space..    ** 
18cd0 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69  Use that approxi
18ce0 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20  mation to avoid 
18cf0 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  the more expensi
18d00 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ve call to.    *
18d10 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
18d20 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20  ialTypeLen() in 
18d30 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
18d40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18d50 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
18d60 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20  2>(u32)nKey1.   
18d70 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56    && d1+sqlite3V
18d80 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
18d90 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
18da0 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u32)nKey1 .    )
18db0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
18dc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
18dd0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
18de0 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
18df0 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
18e00 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18e10 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
18e20 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
18e30 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
18e40 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
18e50 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
18e60 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
18e70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
18e80 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65  y2->aMem[i], pKe
18e90 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29  yInfo->aColl[i])
18ea0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
18eb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18ec0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
18ed0 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
18ee0 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
18ef0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
18f00 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
18f10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18f20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20  -rc;  /* Invert 
18f30 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44  the result for D
18f40 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20  ESC sort order. 
18f50 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
18f60 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61   goto debugCompa
18f70 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  reEnd;.    }.   
18f80 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20   i++;.  }while( 
18f90 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
18fa0 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
18fb0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
18fc0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
18fd0 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
18fe0 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
18ff0 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
19000 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
19010 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
19020 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
19030 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
19040 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
19050 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
19060 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
19070 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
19080 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
19090 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
190a0 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
190b0 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
190c0 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
190d0 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
190e0 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
190f0 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
19100 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
19110 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
19120 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
19130 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ue.  */.  rc = p
19140 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
19150 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65  c;..debugCompare
19160 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72  End:.  if( desir
19170 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72  edResult==0 && r
19180 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
19190 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
191a0 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29  sult<0 && rc<0 )
191b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
191c0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30   desiredResult>0
191d0 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72   && rc>0 ) retur
191e0 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55  n 1;.  if( CORRU
191f0 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31  PT_DB ) return 1
19200 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
19210 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
19220 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
19230 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
19240 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20  dif../*.** Both 
19250 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d  *pMem1 and *pMem
19260 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67  2 contain string
19270 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65   values. Compare
19280 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
19290 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ** using the col
192a0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
192b0 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c  pColl. As usual,
192c0 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   return a negati
192d0 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ve , zero.** or 
192e0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
192f0 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  f *pMem1 is less
19300 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
19310 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
19320 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70  .** *pMem2, resp
19330 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61  ectively. Simila
19340 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22  r in spirit to "
19350 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20  rc = (*pMem1) - 
19360 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73  (*pMem2);"..*/.s
19370 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
19380 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
19390 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
193a0 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  m1,.  const Mem 
193b0 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20  *pMem2,.  const 
193c0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a  CollSeq *pColl,.
193d0 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20    u8 *prcErr    
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f    /* If an OOM o
19400 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51  ccurs, set to SQ
19410 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b  LITE_NOMEM */.){
19420 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e  .  if( pMem1->en
19430 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
19440 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69  .    /* The stri
19450 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ngs are already 
19460 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65  in the correct e
19470 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74  ncoding.  Call t
19480 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61  he.     ** compa
19490 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64  rison function d
194a0 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72  irectly */.    r
194b0 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d  eturn pColl->xCm
194c0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70  p(pColl->pUser,p
194d0 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a  Mem1->n,pMem1->z
194e0 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d  ,pMem2->n,pMem2-
194f0 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >z);.  }else{.  
19500 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f    int rc;.    co
19510 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76  nst void *v1, *v
19520 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e  2;.    int n1, n
19530 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20  2;.    Mem c1;. 
19540 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73     Mem c2;.    s
19550 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
19560 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c1, pMem1->db
19570 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
19580 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
19590 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e  nit(&c2, pMem1->
195a0 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
195b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
195c0 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31  mShallowCopy(&c1
195d0 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68  , pMem1, MEM_Eph
195e0 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
195f0 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
19600 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d  py(&c2, pMem2, M
19610 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76  EM_Ephem);.    v
19620 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  1 = sqlite3Value
19630 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
19640 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d  lue*)&c1, pColl-
19650 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20  >enc);.    n1 = 
19660 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e  v1==0 ? 0 : c1.n
19670 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74  ;.    v2 = sqlit
19680 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
19690 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c  ite3_value*)&c2,
196a0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
196b0 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30    n2 = v2==0 ? 0
196c0 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20   : c2.n;.    rc 
196d0 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
196e0 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20  oll->pUser, n1, 
196f0 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20  v1, n2, v2);.   
19700 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
19710 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
19720 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
19730 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
19740 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76   if( (v1==0 || v
19750 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 20  2==0) && prcErr 
19760 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49  ) *prcErr = SQLI
19770 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65  TE_NOMEM;.    re
19780 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
19790 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
197a0 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e  o blobs.  Return
197b0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
197c0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
197d0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20  the first.** is 
197e0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
197f0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
19800 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c  than the second,
19810 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
19820 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73  * If one blob is
19830 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
19840 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65   other, then the
19850 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20   shorter is the 
19860 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  lessor..*/.stati
19870 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
19880 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f  E int sqlite3Blo
19890 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  bCompare(const M
198a0 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d  em *pB1, const M
198b0 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20  em *pB2){.  int 
198c0 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e  c = memcmp(pB1->
198d0 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e  z, pB2->z, pB1->
198e0 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e  n>pB2->n ? pB2->
198f0 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69  n : pB1->n);.  i
19900 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b  f( c ) return c;
19910 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e  .  return pB1->n
19920 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f   - pB2->n;.}.../
19930 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
19940 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65   values containe
19950 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d  d by the two mem
19960 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72  ory cells, retur
19970 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65  ning.** negative
19980 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69  , zero or positi
19990 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c  ve if pMem1 is l
199a0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
199b0 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a  to, or greater.*
199c0 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f  * than pMem2. So
199d0 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e  rting order is N
199e0 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c  ULL's first, fol
199f0 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73  lowed by numbers
19a00 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e   (integers.** an
19a10 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20  d reals) sorted 
19a20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c  numerically, fol
19a30 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72  lowed by text or
19a40 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c  dered by the col
19a50 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
19a60 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e  ce pColl and fin
19a70 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65  ally blob's orde
19a80 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e  red by memcmp().
19a90 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
19aa0 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
19ab0 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74  dered equal by t
19ac0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
19ad0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43  .int sqlite3MemC
19ae0 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
19af0 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d   *pMem1, const M
19b00 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74  em *pMem2, const
19b10 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
19b20 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a  {.  int f1, f2;.
19b30 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66    int combined_f
19b40 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d  lags;..  f1 = pM
19b50 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32  em1->flags;.  f2
19b60 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b   = pMem2->flags;
19b70 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  .  combined_flag
19b80 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73  s = f1|f2;.  ass
19b90 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66  ert( (combined_f
19ba0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
19bb0 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20  t)==0 );. .  /* 
19bc0 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
19bd0 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73  NULL, it is less
19be0 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e   than the other.
19bf0 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a   If both values.
19c00 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72    ** are NULL, r
19c10 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
19c20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
19c30 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
19c40 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45     return (f2&ME
19c50 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45  M_Null) - (f1&ME
19c60 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20  M_Null);.  }..  
19c70 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
19c80 69 73 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20  is a number and 
19c90 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
19ca0 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20  , the number is 
19cb0 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
19cc0 74 68 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20  th are numbers, 
19cd0 63 6f 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73  compare as reals
19ce0 20 69 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61   if one is a rea
19cf0 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72  l, or as integer
19d00 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76  s.  ** if both v
19d10 61 6c 75 65 73 20 61 72 65 20 69 6e 74 65 67 65  alues are intege
19d20 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  rs..  */.  if( c
19d30 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d  ombined_flags&(M
19d40 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
19d50 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72   ){.    double r
19d60 31 2c 20 72 32 3b 0a 20 20 20 20 69 66 28 20 28  1, r2;.    if( (
19d70 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e  f1 & f2 & MEM_In
19d80 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
19d90 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20  f( pMem1->u.i < 
19da0 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
19db0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
19dc0 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70  ( pMem1->u.i > p
19dd0 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
19de0 72 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75  rn 1;.      retu
19df0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
19e00 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c  if( (f1&MEM_Real
19e10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31  )!=0 ){.      r1
19e20 20 3d 20 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a 20   = pMem1->u.r;. 
19e30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 31     }else if( (f1
19e40 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
19e50 20 20 20 20 20 20 72 31 20 3d 20 28 64 6f 75 62        r1 = (doub
19e60 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20  le)pMem1->u.i;. 
19e70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19e80 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
19e90 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
19ea0 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
19eb0 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 75 2e    r2 = pMem2->u.
19ec0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
19ed0 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f2&MEM_Int)!=0
19ee0 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 28   ){.      r2 = (
19ef0 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e  double)pMem2->u.
19f00 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
19f10 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
19f20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 31 3c     }.    if( r1<
19f30 72 32 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  r2 ) return -1;.
19f40 20 20 20 20 69 66 28 20 72 31 3e 72 32 20 29 20      if( r1>r2 ) 
19f50 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65  return 1;.    re
19f60 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
19f70 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
19f80 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74  s a string and t
19f90 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c  he other is a bl
19fa0 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69  ob, the string i
19fb0 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20  s less..  ** If 
19fc0 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73  both are strings
19fd0 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20  , compare using 
19fe0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  the collating fu
19ff0 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
1a000 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1a010 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
1a020 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f    if( (f1 & MEM_
1a030 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1a040 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1a050 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d  .    if( (f2 & M
1a060 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1a070 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1a080 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1a090 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d  ( pMem1->enc==pM
1a0a0 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20  em2->enc );.    
1a0b0 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1a0c0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1a0d0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1a0e0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1a0f0 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
1a100 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1a110 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
1a120 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
1a130 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
1a140 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
1a150 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
1a160 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
1a170 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
1a180 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1a190 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
1a1a0 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
1a1b0 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
1a1c0 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
1a1d0 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
1a1e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
1a1f0 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
1a200 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
1a210 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1a220 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
1a230 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
1a240 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20  , pMem2, pColl, 
1a250 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
1a260 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   If a NULL point
1a270 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73  er was passed as
1a280 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e   the collate fun
1a290 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f  ction, fall thro
1a2a0 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ugh.    ** to th
1a2b0 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20  e blob case and 
1a2c0 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  use memcmp().  *
1a2d0 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74  /.  }. .  /* Bot
1a2e0 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  h values must be
1a2f0 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65   blobs.  Compare
1a300 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
1a310 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71    */.  return sq
1a320 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1a330 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a  (pMem1, pMem2);.
1a340 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
1a350 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
1a360 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1a370 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
1a380 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
1a390 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
1a3a0 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
1a3b0 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
1a3c0 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
1a3d0 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
1a3e0 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
1a3f0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1a400 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
1a410 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
1a420 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
1a430 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
1a440 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1a450 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
1a460 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1a470 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
1a480 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
1a490 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
1a4a0 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
1a4b0 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
1a4c0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1a4d0 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
1a4e0 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
1a4f0 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
1a500 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
1a510 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1a520 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1a530 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
1a540 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1a550 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1a560 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  ;.      return O
1a570 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
1a580 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
1a590 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1a5a0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1a5b0 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
1a5c0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1a5d0 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
1a5e0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1a5f0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1a600 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_B
1a610 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1a620 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
1a630 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1a640 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1a650 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1a660 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1a670 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1a680 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
1a690 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
1a6a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1a6b0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1a6c0 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
1a6d0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1a6e0 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1a6f0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1a700 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
1a710 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
1a720 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1a730 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1a740 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1a750 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1a760 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1a770 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1a780 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1a790 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1a7a0 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
1a7b0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
1a7c0 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
1a7d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1a7e0 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1a7f0 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
1a800 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
1a810 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
1a820 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
1a830 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
1a840 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
1a850 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
1a860 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1a870 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
1a880 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1a890 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
1a8a0 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
1a8b0 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
1a8c0 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
1a8d0 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
1a8e0 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1a8f0 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
1a900 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
1a910 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
1a920 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
1a930 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
1a940 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
1a950 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
1a960 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1a970 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
1a980 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
1a990 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
1a9a0 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
1a9b0 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1a9c0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1a9d0 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
1a9e0 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
1a9f0 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
1aa00 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
1aa10 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
1aa20 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
1aa30 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
1aa40 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
1aa50 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
1aa60 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
1aa70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
1aa80 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
1aa90 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
1aaa0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
1aab0 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
1aac0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f  Key2->errCode to
1aad0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
1aae0 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30  UPT and return 0
1aaf0 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
1ab00 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1ab10 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72  , .** pPKey2->er
1ab20 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  rCode is set to 
1ab30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1ab40 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  , if it is not N
1ab50 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c  ULL, the.** mall
1ab60 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73  oc-failed flag s
1ab70 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  et on database h
1ab80 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70  andle (pPKey2->p
1ab90 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f  KeyInfo->db)..*/
1aba0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1abb0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1abc0 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65  hSkip(.  int nKe
1abd0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1abe0 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1abf0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1ac00 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1ac10 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  ,         /* Rig
1ac20 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1ac30 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20  bSkip           
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1ac50 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65  f true, skip the
1ac60 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a   first field */.
1ac70 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac90 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1aca0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1acb0 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1acc0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ace0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1acf0 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63   next field to c
1ad00 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20  ompare */.  u32 
1ad10 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20  szHdr1;         
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1ad30 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65  ize of record he
1ad40 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ader in bytes */
1ad50 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad70 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
1ad80 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65  first type in he
1ad90 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ader */.  int rc
1ada0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1adb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1adc0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  urn value */.  M
1add0 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79  em *pRhs = pPKey
1ade0 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  2->aMem;       /
1adf0 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  * Next field of 
1ae00 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72  pPKey2 to compar
1ae10 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
1ae20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
1ae30 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  2->pKeyInfo;.  c
1ae40 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1ae50 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1ae60 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1ae70 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
1ae80 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
1ae90 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
1aea0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
1aeb0 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
1aec0 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1aed0 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
1aee0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
1aef0 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
1af00 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
1af10 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
1af20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
1af30 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
1af40 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
1af50 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
1af60 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
1af70 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
1af80 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
1af90 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
1afa0 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
1afb0 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
1afc0 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
1afd0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1afe0 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
1aff0 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
1b000 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1b010 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1b020 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1b030 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
1b040 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
1b050 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1b060 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
1b070 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1b080 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1b090 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1b0a0 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
1b0b0 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
1b0c0 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56   i = 0;.  }..  V
1b0d0 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1b0e0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1b0f0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1b100 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1b110 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
1b120 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1b130 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32  o->nField+pPKey2
1b140 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  ->pKeyInfo->nXFi
1b150 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1b160 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43  eld .       || C
1b170 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1b180 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1b190 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1b1a0 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1b1b0 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1b1c0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
1b1d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1b1e0 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1b1f0 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1b200 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1b210 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53  ype;..    /* RHS
1b220 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a   is an integer *
1b230 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e  /.    if( pRhs->
1b240 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
1b250 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1b260 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1b270 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1];.      testca
1b280 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1b290 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1b2a0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1b2b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b2c0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1b2d0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1b2e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1b2f0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1b300 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1b310 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1b320 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 28    double rhs = (
1b330 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e 69  double)pRhs->u.i
1b340 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1b350 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1b360 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1b370 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
1b380 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31          if( mem1
1b390 2e 75 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20  .u.r<rhs ){.    
1b3a0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1b3b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1b3c0 20 6d 65 6d 31 2e 75 2e 72 3e 72 68 73 20 29 7b   mem1.u.r>rhs ){
1b3d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b3e0 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
1b3f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b400 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62     i64 lhs = vdb
1b410 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1b420 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61  (serial_type, &a
1b430 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20  Key1[d1]);.     
1b440 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68     i64 rhs = pRh
1b450 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20  s->u.i;.        
1b460 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20  if( lhs<rhs ){. 
1b470 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1b480 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b490 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20  if( lhs>rhs ){. 
1b4a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1b4b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b4c0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1b4d0 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f  * RHS is real */
1b4e0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1b4f0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1b500 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65  Real ){.      se
1b510 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1b520 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69  1[idx1];.      i
1b530 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1b540 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
1b550 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1b560 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1b570 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1b580 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1b590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
1b5a0 6f 75 62 6c 65 20 72 68 73 20 3d 20 70 52 68 73  ouble rhs = pRhs
1b5b0 2d 3e 75 2e 72 3b 0a 20 20 20 20 20 20 20 20 64  ->u.r;.        d
1b5c0 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20 20 20 20  ouble lhs;.     
1b5d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1b5e0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1b5f0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
1b600 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
1b610 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1b620 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==7 ){.         
1b630 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 75 2e 72 3b   lhs = mem1.u.r;
1b640 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1b650 20 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20            lhs = 
1b660 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69  (double)mem1.u.i
1b670 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b680 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
1b690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1b6a0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1b6b0 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
1b6c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1b6d0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1b6e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1b6f0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73     /* RHS is a s
1b700 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73  tring */.    els
1b710 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1b720 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
1b730 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
1b740 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
1b750 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1b760 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
1b770 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
1b780 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1b790 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
1b7a0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1b7b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73     }else if( !(s
1b7c0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1b7d0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
1b7e0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1b7f0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31  se{.        mem1
1b800 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  .n = (serial_typ
1b810 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
1b820 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1b830 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73  d1+mem1.n)==(uns
1b840 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1b850 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1b860 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d   (d1+mem1.n+1)==
1b870 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1b880 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1b890 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e  d1+mem1.n) > (un
1b8a0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
1b8b0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
1b8c0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1b8d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1b8e0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
1b8f0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1b900 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
1b910 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1b920 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
1b930 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  nfo->aColl[i] ){
1b940 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1b950 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1b960 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  enc;.          m
1b970 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
1b980 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  o->db;.         
1b990 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45   mem1.flags = ME
1b9a0 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20  M_Str;.         
1b9b0 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a   mem1.z = (char*
1b9c0 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20  )&aKey1[d1];.   
1b9d0 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
1b9e0 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1b9f0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
1ba00 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65  &mem1, pRhs, pKe
1ba10 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c  yInfo->aColl[i],
1ba20 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64   &pPKey2->errCod
1ba30 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
1ba40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ba50 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
1ba60 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70   = MIN(mem1.n, p
1ba70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Rhs->n);.       
1ba80 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26     rc = memcmp(&
1ba90 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d  aKey1[d1], pRhs-
1baa0 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20  >z, nCmp);.     
1bab0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29       if( rc==0 )
1bac0 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70   rc = mem1.n - p
1bad0 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20  Rhs->n; .       
1bae0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1baf0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1bb00 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c  a blob */.    el
1bb10 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1bb20 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b  gs & MEM_Blob ){
1bb30 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74  .      getVarint
1bb40 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c  32(&aKey1[idx1],
1bb50 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1bb60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1bb70 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
1bb80 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1bb90 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73  al_type<12 || (s
1bba0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1bbb0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
1bbc0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1bbd0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1bbe0 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74  nStr = (serial_t
1bbf0 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20  ype - 12) / 2;. 
1bc00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1bc10 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73   (d1+nStr)==(uns
1bc20 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1bc30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1bc40 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75   (d1+nStr+1)==(u
1bc50 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1bc60 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31  .        if( (d1
1bc70 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e  +nStr) > (unsign
1bc80 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
1bc90 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
1bca0 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
1bcb0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1bcc0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1bcd0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1bce0 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
1bcf0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
1bd00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1bd10 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74  t nCmp = MIN(nSt
1bd20 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  r, pRhs->n);.   
1bd30 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
1bd40 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
1bd50 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
1bd60 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1bd70 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d  =0 ) rc = nStr -
1bd80 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20   pRhs->n;.      
1bd90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bda0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1bdb0 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   null */.    els
1bdc0 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  e{.      serial_
1bdd0 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1bde0 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  1];.      rc = (
1bdf0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b  serial_type!=0);
1be00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1be10 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  rc!=0 ){.      i
1be20 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1be30 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1be40 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
1be50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1be60 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
1be70 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1be80 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1be90 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20  2, rc) );.      
1bea0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1beb0 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
1bec0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
1bed0 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
1bee0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
1bef0 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b   i++;.    pRhs++
1bf00 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  ;.    d1 += sqli
1bf10 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1bf20 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1bf30 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73  );.    idx1 += s
1bf40 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
1bf50 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1bf60 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e  }while( idx1<(un
1bf70 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26  signed)szHdr1 &&
1bf80 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
1bf90 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e  d && d1<=(unsign
1bfa0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f  ed)nKey1 );..  /
1bfb0 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
1bfc0 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
1bfd0 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
1bfe0 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
1bff0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
1c000 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
1c010 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
1c020 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
1c030 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
1c040 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
1c050 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
1c060 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
1c070 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  m1).  */.  asser
1c080 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1c090 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
1c0a0 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
1c0b0 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  at one or both o
1c0c0 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
1c0d0 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
1c0e0 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
1c0f0 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
1c100 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
1c110 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
1c120 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
1c130 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ue.  */.  assert
1c140 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20  ( CORRUPT_DB .  
1c150 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f       || vdbeReco
1c160 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1c170 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1c180 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66  ey2, pPKey2->def
1c190 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20  ault_rc) .      
1c1a0 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62   || pKeyInfo->db
1c1b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
1c1c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b   );.  return pPK
1c1d0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1c1e0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1c1f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1c200 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1c210 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1c220 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a     /* Left key *
1c230 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1c240 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1c250 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
1c260 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
1c270 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1c280 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
1c290 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1c2a0 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  0);.}.../*.** Th
1c2b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1c2c0 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
1c2d0 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
1c2e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1c2f0 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
1c300 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
1c310 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69  f pPKey2 is an i
1c320 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20  nteger, and (b) 
1c330 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d  the .** size-of-
1c340 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74  header varint at
1c350 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
1c360 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
1c370 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   in a single.** 
1c380 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65  byte (i.e. is le
1c390 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a  ss than 128)..**
1c3a0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e  .** To avoid con
1c3b0 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66  cerns about buff
1c3c0 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68  er overreads, th
1c3d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
1c3e0 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63  ly used.** on sc
1c3f0 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20  hemas where the 
1c400 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65  maximum valid he
1c410 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20  ader size is 63 
1c420 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a  bytes or less..*
1c430 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1c440 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1c450 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  t(.  int nKey1, 
1c460 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1c470 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1c480 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1c490 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1c4a0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1c4b0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
1c4c0 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74  *aKey = &((const
1c4d0 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f   u8*)pKey1)[*(co
1c4e0 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20  nst u8*)pKey1 & 
1c4f0 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72  0x3F];.  int ser
1c500 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e  ial_type = ((con
1c510 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d  st u8*)pKey1)[1]
1c520 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75  ;.  int res;.  u
1c530 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20  32 y;.  u64 x;. 
1c540 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d   i64 v = pPKey2-
1c550 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20  >aMem[0].u.i;.  
1c560 69 36 34 20 6c 68 73 3b 0a 0a 20 20 61 73 73 65  i64 lhs;..  asse
1c570 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31  rt( (*(u8*)pKey1
1c580 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55  )<=0x3F || CORRU
1c590 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63  PT_DB );.  switc
1c5a0 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1c5b0 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  {.    case 1: { 
1c5c0 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
1c5d0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1c5e0 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45    lhs = ONE_BYTE
1c5f0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1c600 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1c610 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1c620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c630 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
1c640 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c650 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57  /.      lhs = TW
1c660 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1c670 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c680 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1c690 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c6a0 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
1c6b0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1c6c0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1c6d0 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  s = THREE_BYTE_I
1c6e0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1c6f0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1c700 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c710 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
1c720 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
1c730 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1c740 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
1c750 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1c760 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34        lhs = (i64
1c770 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
1c780 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1c790 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1c7a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c7b0 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
1c7c0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c7d0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f  /.      lhs = FO
1c7e0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1c7f0 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
1c800 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1c810 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1c820 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1c830 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c840 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
1c850 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  : { /* 8-byte si
1c860 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1c870 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42        x = FOUR_B
1c880 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1c890 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
1c8a0 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
1c8b0 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
1c8c0 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26    lhs = *(i64*)&
1c8d0 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  x;.      testcas
1c8e0 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
1c8f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1c900 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20     case 8: .    
1c910 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20    lhs = 0;.     
1c920 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c930 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   9:.      lhs = 
1c940 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
1c950 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
1c960 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76  e could be remov
1c970 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ed without chang
1c980 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
1c990 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a  of running.    *
1c9a0 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63  * this code. Inc
1c9b0 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73  luding it causes
1c9c0 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65   gcc to generate
1c9d0 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68   a faster switch
1c9e0 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65   .    ** stateme
1c9f0 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61  nt (since the ra
1ca00 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61  nge of switch ta
1ca10 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73  rgets now starts
1ca20 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20   at zero and.   
1ca30 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75   ** is contiguou
1ca40 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  s) but does not 
1ca50 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63  cause any duplic
1ca60 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67  ate code to be g
1ca70 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20  enerated.    ** 
1ca80 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65  (as gcc is cleve
1ca90 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62  r enough to comb
1caa0 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65  ine the two like
1cab0 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a   cases). Other .
1cac0 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73      ** compilers
1cad0 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61   might be simila
1cae0 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65  r.  */ .    case
1caf0 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20   0: case 7:.    
1cb00 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1cb10 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1cb20 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
1cb30 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65  pPKey2);..    de
1cb40 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1cb50 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
1cb60 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
1cb70 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1cb80 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76  2);.  }..  if( v
1cb90 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  >lhs ){.    res 
1cba0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1cbb0 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20  }else if( v<lhs 
1cbc0 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1cbd0 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65  ey2->r2;.  }else
1cbe0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
1cbf0 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  eld>1 ){.    /* 
1cc00 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
1cc10 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
1cc20 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70   are equal. Comp
1cc30 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  are the trailing
1cc40 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e   .    ** fields.
1cc50 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 76    */.    res = v
1cc60 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1cc70 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
1cc80 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
1cc90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1cca0 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65  /* The first fie
1ccb0 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b  lds of the two k
1ccc0 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e  eys are equal an
1ccd0 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74  d there are no t
1cce0 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66  railing.    ** f
1ccf0 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50  ields. Return pP
1cd00 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1cd10 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a   in this case. *
1cd20 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  /.    res = pPKe
1cd30 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1cd40 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
1cd50 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1cd60 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1cd70 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
1cd80 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
1cd90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1cda0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
1cdb0 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
1cdc0 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
1cdd0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
1cde0 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
1cdf0 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
1ce00 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e  PKey2 is a strin
1ce10 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20  g, that (b) the 
1ce20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75  first field.** u
1ce30 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ses the collatio
1ce40 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
1ce50 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74  Y and (c) that t
1ce60 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  he size-of-heade
1ce70 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20  r varint .** at 
1ce80 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
1ce90 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
1cea0 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
1ceb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cec0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1ced0 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e  eString(.  int n
1cee0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1cef0 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1cf00 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1cf10 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1cf20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1cf30 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
1cf40 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28  st u8 *aKey1 = (
1cf50 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b  const u8*)pKey1;
1cf60 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
1cf70 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a  pe;.  int res;..
1cf80 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1cf90 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f  Key1[1], serial_
1cfa0 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72  type);.  if( ser
1cfb0 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
1cfc0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1cfd0 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r1;      /* (pK
1cfe0 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
1cff0 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c  number or a null
1d000 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
1d010 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
1d020 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65  0x01) ){ .    re
1d030 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20  s = pPKey2->r2; 
1d040 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
1d050 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20  Key1) is a blob 
1d060 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
1d070 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e  int nCmp;.    in
1d080 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20  t nStr;.    int 
1d090 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d  szHdr = aKey1[0]
1d0a0 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73  ;..    nStr = (s
1d0b0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f  erial_type-12) /
1d0c0 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48   2;.    if( (szH
1d0d0 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65  dr + nStr) > nKe
1d0e0 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65  y1 ){.      pPKe
1d0f0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1d100 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1d110 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
1d120 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72  urn 0;    /* Cor
1d130 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
1d140 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28  .    nCmp = MIN(
1d150 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1d160 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20  .n, nStr );.    
1d170 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b  res = memcmp(&aK
1d180 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65  ey1[szHdr], pPKe
1d190 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e  y2->aMem[0].z, n
1d1a0 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  Cmp);..    if( r
1d1b0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  es==0 ){.      r
1d1c0 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65  es = nStr - pPKe
1d1d0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20  y2->aMem[0].n;. 
1d1e0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
1d1f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1d200 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
1d210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
1d220 20 3d 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d   = vdbeRecordCom
1d230 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
1d240 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1d250 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  2, 1);.        }
1d260 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d270 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
1d280 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20  fault_rc;.      
1d290 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
1d2a0 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
1d2b0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1d2c0 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c  2->r2;.      }el
1d2d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
1d2e0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1d2f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1d300 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
1d310 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1d320 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >r2;.    }else{.
1d330 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1d340 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20  y2->r1;.    }.  
1d350 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
1d360 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1d370 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1d380 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20  , pPKey2, res). 
1d390 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
1d3a0 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  _DB.       || pP
1d3b0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1d3c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d3d0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
1d3e0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  es;.}../*.** Ret
1d3f0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1d400 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52   an sqlite3VdbeR
1d410 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
1d420 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69  ompatible functi
1d430 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  on.** suitable f
1d440 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72  or comparing ser
1d450 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20  ialized records 
1d460 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20  to the unpacked 
1d470 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a  record passed.**
1d480 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
1d490 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64  ument..*/.Record
1d4a0 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56  Compare sqlite3V
1d4b0 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55  dbeFindCompare(U
1d4c0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1d4d0 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65  ){.  /* varintRe
1d4e0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
1d4f0 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72   and varintRecor
1d500 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
1d510 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a   both assume.  *
1d520 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  * that the size-
1d530 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
1d540 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
1d550 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
1d560 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69  h record.  ** fi
1d570 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
1d580 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37  yte (i.e. is 127
1d590 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e   or less). varin
1d5a0 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
1d5b0 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73  t().  ** also as
1d5c0 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
1d5d0 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61   safe to overrea
1d5e0 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74  d a buffer by at
1d5f0 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a   least the .  **
1d600 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c   maximum possibl
1d610 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73  e legal header s
1d620 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73  ize plus 8 bytes
1d630 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20  . Because there 
1d640 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65  is.  ** guarante
1d650 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73  ed to be at leas
1d660 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33  t 74 (but not 13
1d670 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  6) bytes of padd
1d680 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ing following ea
1d690 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70  ch.  ** buffer p
1d6a0 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52  assed to varintR
1d6b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1d6c0 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20  ) this makes it 
1d6d0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20  convenient to.  
1d6e0 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a  ** limit the siz
1d6f0 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
1d700 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63  to 64 bytes in c
1d710 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66  ases where the f
1d720 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20  irst field.  ** 
1d730 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20  is an integer.. 
1d740 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73   **.  ** The eas
1d750 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f  iest way to enfo
1d760 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69  rce this limit i
1d770 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e  s to consider on
1d780 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a  ly records with.
1d790 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f    ** 13 fields o
1d7a0 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66  r less. If the f
1d7b0 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e  irst field is an
1d7c0 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61   integer, the ma
1d7d0 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a  ximum legal.  **
1d7e0 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
1d7f0 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62  (12*5 + 1 + 1) b
1d800 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ytes.  */.  if( 
1d810 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  (p->pKeyInfo->nF
1d820 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e  ield + p->pKeyIn
1d830 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33  fo->nXField)<=13
1d840 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   ){.    int flag
1d850 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  s = p->aMem[0].f
1d860 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d  lags;.    if( p-
1d870 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
1d880 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  Order[0] ){.    
1d890 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20    p->r1 = 1;.   
1d8a0 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20     p->r2 = -1;. 
1d8b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d8c0 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r1 = -1;.    
1d8d0 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20    p->r2 = 1;.   
1d8e0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
1d8f0 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a  s & MEM_Int) ){.
1d900 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
1d910 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1d920 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  t;.    }.    tes
1d930 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
1d940 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74  EM_Real );.    t
1d950 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
1d960 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20   MEM_Null );.   
1d970 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
1d980 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
1d990 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
1d9a0 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75  (MEM_Real|MEM_Nu
1d9b0 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  ll|MEM_Blob))==0
1d9c0 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d   && p->pKeyInfo-
1d9d0 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a  >aColl[0]==0 ){.
1d9e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
1d9f0 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
1da00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1da10 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
1da20 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  tring;.    }.  }
1da30 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
1da40 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1da50 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43  are;.}../*.** pC
1da60 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
1da70 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
1da80 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
1da90 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
1daa0 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
1dab0 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
1dac0 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
1dad0 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
1dae0 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
1daf0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1db00 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
1db10 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
1db20 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
1db30 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67  ..**.** pCur mig
1db40 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  ht be pointing t
1db50 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
1db60 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64  from a corrupt d
1db70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1db80 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   So the content 
1db90 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
1dba0 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61  d.  Do appropria
1dbb0 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65  te checks on the
1dbc0 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   content..*/.int
1dbd0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
1dbe0 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
1dbf0 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  , BtCursor *pCur
1dc00 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20  , i64 *rowid){. 
1dc10 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
1dc20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
1dc30 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
1dc40 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1dc50 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
1dc60 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
1dc70 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
1dc80 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
1dc90 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
1dca0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1dcb0 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
1dcc0 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  , v;..  /* Get t
1dcd0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
1dce0 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
1dcf0 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
1dd00 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
1dd10 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
1dd20 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
1dd30 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
1dd40 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1dd50 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
1dd60 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
1dd70 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
1dd80 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
1dd90 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
1dda0 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
1ddb0 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
1ddc0 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
1ddd0 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
1dde0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1ddf0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1de00 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
1de10 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
1de20 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
1de30 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
1de40 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
1de50 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
1de60 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
1de70 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
1de80 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
1de90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
1dea0 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
1deb0 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
1dec0 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
1ded0 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
1dee0 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
1def0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
1df00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1df10 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c  eMemInit(&m, db,
1df20 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
1df30 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
1df40 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33  ree(pCur, 0, (u3
1df50 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  2)nCellKey, 1, &
1df60 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
1df70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1df80 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
1df90 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
1dfa0 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
1dfb0 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
1dfc0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
1dfd0 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
1dfe0 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
1dff0 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
1e000 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
1e010 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
1e020 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
1e030 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
1e040 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
1e050 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
1e060 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
1e070 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
1e080 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
1e090 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
1e0a0 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
1e0b0 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
1e0c0 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
1e0d0 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
1e0e0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
1e0f0 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
1e100 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
1e110 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1e120 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
1e130 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1e140 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
1e150 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1e160 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
1e170 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
1e180 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1e190 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
1e1a0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1e1b0 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
1e1c0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1e1d0 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
1e1e0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
1e1f0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
1e200 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
1e210 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
1e220 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
1e230 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
1e240 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
1e250 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
1e260 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1e270 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
1e280 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
1e290 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
1e2a0 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
1e2b0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
1e2c0 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
1e2d0 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
1e2e0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
1e2f0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
1e300 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
1e310 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
1e320 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
1e330 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
1e340 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
1e350 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
1e360 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
1e370 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
1e380 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
1e390 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1e3a0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
1e3b0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1e3c0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
1e3d0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1e3e0 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
1e3f0 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
1e400 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
1e410 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
1e420 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1e430 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
1e440 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1e450 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
1e460 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29   m.szMalloc!=0 )
1e470 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
1e480 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
1e490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e4a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
1e4b0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
1e4c0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
1e4d0 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
1e4e0 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
1e4f0 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
1e500 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
1e510 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
1e520 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
1e530 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
1e540 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
1e550 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1e560 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
1e570 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
1e580 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
1e590 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
1e5a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1e5b0 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
1e5c0 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
1e5d0 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
1e5e0 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
1e5f0 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
1e600 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
1e610 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
1e620 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
1e630 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
1e640 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
1e650 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
1e660 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
1e670 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
1e680 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
1e690 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
1e6a0 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
1e6b0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
1e6c0 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
1e6d0 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
1e6e0 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
1e6f0 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
1e700 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
1e710 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1e720 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1e730 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
1e740 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
1e750 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1e760 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
1e770 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
1e780 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
1e790 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20  acked,       /* 
1e7a0 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
1e7b0 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74   of key */.  int
1e7c0 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e7e0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
1e7f0 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
1e800 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
1e810 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
1e820 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
1e830 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75   *pCur = pC->pCu
1e840 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  rsor;.  Mem m;..
1e850 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e860 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
1e870 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
1e880 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
1e890 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1e8a0 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
1e8b0 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
1e8c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
1e8d0 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
1e8e0 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
1e8f0 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
1e900 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65   */.  /* nCellKe
1e910 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  y will always be
1e920 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30   between 0 and 0
1e930 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73  xffffffff becaus
1e940 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a  e of the way.  *
1e950 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73  * that btreePars
1e960 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73  eCellPtr() and s
1e970 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
1e980 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  2() are implemen
1e990 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65  ted */.  if( nCe
1e9a0 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
1e9b0 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
1e9c0 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
1e9d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e9e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1e9f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1ea00 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
1ea10 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
1ea20 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
1ea30 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72  tree(pC->pCursor
1ea40 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b  , 0, (u32)nCellK
1ea50 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
1ea60 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1ea70 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65  rn rc;.  }.  *re
1ea80 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
1ea90 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e  ecordCompare(m.n
1eaa0 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64  , m.z, pUnpacked
1eab0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1eac0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
1ead0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1eae0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
1eaf0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1eb00 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
1eb10 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
1eb20 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
1eb30 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
1eb40 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
1eb50 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
1eb60 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
1eb70 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
1eb80 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1eb90 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73   nChange){.  ass
1eba0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ebb0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
1ebc0 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  x) );.  db->nCha
1ebd0 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
1ebe0 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
1ebf0 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
1ec00 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
1ec10 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
1ec20 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
1ec30 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
1ec40 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
1ec50 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
1ec60 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1ec70 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
1ec80 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
1ec90 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
1eca0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
1ecb0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1ecc0 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
1ecd0 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
1ece0 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
1ecf0 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
1ed00 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
1ed10 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
1ed20 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
1ed30 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
1ed40 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
1ed50 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
1ed60 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
1ed70 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
1ed80 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
1ed90 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
1eda0 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
1edb0 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
1edc0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
1edd0 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
1ede0 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
1edf0 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
1ee00 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
1ee10 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
1ee20 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1ee30 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
1ee40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1ee50 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
1ee60 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
1ee70 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
1ee80 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
1ee90 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
1eea0 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
1eeb0 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
1eec0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1eed0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
1eee0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
1eef0 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
1ef00 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
1ef10 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
1ef20 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
1ef30 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1ef40 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
1ef50 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
1ef60 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1ef70 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70  value bound.** p
1ef80 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66  arameter iVar of
1ef90 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69   VM v. Except, i
1efa0 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1efb0 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75  n SQL NULL, retu
1efc0 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64  rn .** 0 instead
1efd0 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e  . Unless it is N
1efe0 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e  ULL, apply affin
1eff0 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20  ity aff (one of 
1f000 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a  the SQLITE_AFF_*
1f010 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74  .** constants) t
1f020 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f  o the value befo
1f030 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e  re returning it.
1f040 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
1f050 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62  ned value must b
1f060 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
1f070 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
1f080 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
1f090 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
1f0a0 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
1f0b0 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20  BoundValue(Vdbe 
1f0c0 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38  *v, int iVar, u8
1f0d0 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28   aff){.  assert(
1f0e0 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
1f0f0 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   v ){.    Mem *p
1f100 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69  Mem = &v->aVar[i
1f110 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20  Var-1];.    if( 
1f120 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  0==(pMem->flags 
1f130 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20  & MEM_Null) ){. 
1f140 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
1f150 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  ue *pRet = sqlit
1f160 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62  e3ValueNew(v->db
1f170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
1f180 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1f190 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
1f1a0 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65  (Mem *)pRet, pMe
1f1b0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
1f1c0 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
1f1d0 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c  inity(pRet, aff,
1f1e0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1f1f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1f200 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a  urn pRet;.    }.
1f210 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1f220 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
1f230 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  re SQL variable 
1f240 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e  iVar so that bin
1f250 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65  ding a new value
1f260 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a   to it signals.*
1f270 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f  * to sqlite3_reo
1f280 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72  ptimize() that r
1f290 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e-preparing the 
1f2a0 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65  statement may re
1f2b0 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74  sult.** in a bet
1f2c0 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  ter query plan..
1f2d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1f2e0 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64  dbeSetVarmask(Vd
1f2f0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29  be *v, int iVar)
1f300 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
1f310 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  >0 );.  if( iVar
1f320 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78  >32 ){.    v->ex
1f330 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66  pmask = 0xffffff
1f340 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ff;.  }else{.   
1f350 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
1f360 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
1f370 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  1));.  }.}..#ifn
1f380 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f390 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
1f3a0 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f  ** Transfer erro
1f3b0 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66  r message text f
1f3c0 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  rom an sqlite3_v
1f3d0 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  tab.zErrMsg (tex
1f3e0 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
1f3f0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1f400 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1f410 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e  oc) into a Vdbe.
1f420 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
1f430 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
1f440 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1f450 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29  sqlite3DbMalloc)
1f460 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1f470 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73  3VtabImportErrms
1f480 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74  g(Vdbe *p, sqlit
1f490 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
1f4a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1f4b0 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65   p->db;.  sqlite
1f4c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
1f4d0 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
1f4e0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44  rrMsg = sqlite3D
1f4f0 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61  bStrDup(db, pVta
1f500 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b->zErrMsg);.  s
1f510 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
1f520 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
1f530 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
1f540 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
1f550 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1f560 41 4c 54 41 42 4c 45 20 2a 2f 0a                 ALTABLE */.