/ Hex Artifact Content
Login

Artifact 2e927a7641eae94ca4583d1a809cb4441ca21a5a:


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: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
c410: 20 20 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66    .  /* Memory f
c420: 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
c430: 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
c440: 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
c450: 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20  ted in two.  ** 
c460: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
c470: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
c480: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
c490: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ed space at the 
c4a0: 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
c4b0: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
c4c0: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
c4d0: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
c4e0: 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75  memory.  ** requ
c4f0: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
c500: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
c510: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
c520: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
c530: 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69  pass will fill i
c540: 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67  n the rest using
c550: 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74   a fresh allocat
c560: 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ion.  .  **.  **
c570: 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61   This two-pass a
c580: 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75  pproach that reu
c590: 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ses as much memo
c5a0: 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
c5b0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66  rom.  ** the lef
c5c0: 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74  tover space at t
c5d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  he end of the op
c5e0: 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73  code array can s
c5f0: 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
c600: 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
c610: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
c620: 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
c630: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
c640: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74  .  do {.    nByt
c650: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  e = 0;.    p->aM
c660: 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
c670: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69  p->aMem, nMem*si
c680: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
c690: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
c6a0: 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61  .    p->aVar = a
c6b0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61  llocSpace(p->aVa
c6c0: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d  r, nVar*sizeof(M
c6d0: 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  em), &zCsr, zEnd
c6e0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
c6f0: 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
c700: 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e  pace(p->apArg, n
c710: 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29  Arg*sizeof(Mem*)
c720: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
c730: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
c740: 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  zVar = allocSpac
c750: 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72  e(p->azVar, nVar
c760: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20  *sizeof(char*), 
c770: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
c780: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  yte);.    p->apC
c790: 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
c7a0: 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f  p->apCsr, nCurso
c7b0: 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
c7c0: 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20  sor*),.         
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
c7f0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  Byte);.    p->aO
c800: 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53  nceFlag = allocS
c810: 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61  pace(p->aOnceFla
c820: 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c  g, nOnce, &zCsr,
c830: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
c840: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
c850: 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20  .      p->pFree 
c860: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c870: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
c880: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72  ;.    }.    zCsr
c890: 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20   = p->pFree;.   
c8a0: 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42   zEnd = &zCsr[nB
c8b0: 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20  yte];.  }while( 
c8c0: 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61  nByte && !db->ma
c8d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
c8e0: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43   p->nCursor = nC
c8f0: 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63  ursor;.  p->nOnc
c900: 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20  eFlag = nOnce;. 
c910: 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a   if( p->aVar ){.
c920: 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79      p->nVar = (y
c930: 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66  nVar)nVar;.    f
c940: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20  or(n=0; n<nVar; 
c950: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
c960: 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Var[n].flags = M
c970: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70  EM_Null;.      p
c980: 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64  ->aVar[n].db = d
c990: 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  b;.    }.  }.  i
c9a0: 66 28 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20  f( p->azVar ){. 
c9b0: 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50     p->nzVar = pP
c9c0: 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20  arse->nzVar;.   
c9d0: 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72   memcpy(p->azVar
c9e0: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
c9f0: 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66   p->nzVar*sizeof
ca00: 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  (p->azVar[0]));.
ca10: 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73      memset(pPars
ca20: 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61  e->azVar, 0, pPa
ca30: 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f  rse->nzVar*sizeo
ca40: 66 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  f(pParse->azVar[
ca50: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
ca60: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70  p->aMem ){.    p
ca70: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca90: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
caa0: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
cab0: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
cac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cad0: 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66    /*       not f
cae0: 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f  rom 0..nMem-1 */
caf0: 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c  .    for(n=1; n<
cb00: 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  =nMem; n++){.   
cb10: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c     p->aMem[n].fl
cb20: 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69  ags = MEM_Undefi
cb30: 6e 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  ned;.      p->aM
cb40: 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  em[n].db = db;. 
cb50: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78     }.  }.  p->ex
cb60: 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e  plain = pParse->
cb70: 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74  explain;.  sqlit
cb80: 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b  e3VdbeRewind(p);
cb90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
cba0: 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
cbb0: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
cbc0: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
cbd0: 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70   cursor .** happ
cbe0: 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  ens to hold..*/.
cbf0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
cc00: 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
cc10: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
cc20: 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
cc30: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
cc40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
cc50: 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70  dbeSorterClose(p
cc60: 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66  ->db, pCx);.  if
cc70: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
cc80: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
cc90: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
cca0: 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70     /* The pCx->p
ccb0: 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63  Cursor will be c
ccc0: 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  lose automatical
ccd0: 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ly, if it exists
cce0: 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  , by.    ** the 
ccf0: 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
cd00: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e   }else if( pCx->
cd10: 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
cd20: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
cd30: 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72  Cursor(pCx->pCur
cd40: 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
cd50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
cd60: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
cd70: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
cd80: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
cd90: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
cda0: 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d  tabCursor = pCx-
cdb0: 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  >pVtabCursor;.  
cdc0: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
cdd0: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
cde0: 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70  = pVtabCursor->p
cdf0: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
ce00: 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68     p->inVtabMeth
ce10: 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64  od = 1;.    pMod
ce20: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61  ule->xClose(pVta
ce30: 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d  bCursor);.    p-
ce40: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
ce50: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
ce60: 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
ce70: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
ce80: 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73   the VdbeFrame s
ce90: 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
cea0: 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73  Vdbe. This.** is
ceb0: 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70   used, for examp
cec0: 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67  le, when a trigg
ced0: 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69  er sub-program i
cee0: 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74  s halted to rest
cef0: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74  ore.** control t
cf00: 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  o the main progr
cf10: 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  am..*/.int sqlit
cf20: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
cf30: 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46  re(VdbeFrame *pF
cf40: 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  rame){.  Vdbe *v
cf50: 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20   = pFrame->v;.  
cf60: 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70  v->aOnceFlag = p
cf70: 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67  Frame->aOnceFlag
cf80: 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67  ;.  v->nOnceFlag
cf90: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65   = pFrame->nOnce
cfa0: 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d  Flag;.  v->aOp =
cfb0: 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20   pFrame->aOp;.  
cfc0: 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->nOp = pFrame-
cfd0: 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20  >nOp;.  v->aMem 
cfe0: 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a  = pFrame->aMem;.
cff0: 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    v->nMem = pFra
d000: 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61  me->nMem;.  v->a
d010: 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61  pCsr = pFrame->a
d020: 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73  pCsr;.  v->nCurs
d030: 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75  or = pFrame->nCu
d040: 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c  rsor;.  v->db->l
d050: 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d  astRowid = pFram
d060: 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  e->lastRowid;.  
d070: 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  v->nChange = pFr
d080: 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  ame->nChange;.  
d090: 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70  return pFrame->p
d0a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
d0b0: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
d0c0: 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73  *.** Also releas
d0d0: 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65  e any dynamic me
d0e0: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65  mory held by the
d0f0: 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e   VM in the Vdbe.
d100: 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  aMem memory .** 
d110: 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73  cell array. This
d120: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73   is necessary as
d130: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
d140: 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61   array may conta
d150: 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74  in.** pointers t
d160: 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  o VdbeFrame obje
d170: 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69  cts, which may i
d180: 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70  n turn contain p
d190: 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70  ointers to.** op
d1a0: 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73  en cursors..*/.s
d1b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
d1c0: 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20  AllCursors(Vdbe 
d1d0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46  *p){.  if( p->pF
d1e0: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
d1f0: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20  Frame *pFrame;. 
d200: 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
d210: 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
d220: 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
d230: 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
d240: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d250: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
d260: 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d  Frame);.  }.  p-
d270: 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70  >pFrame = 0;.  p
d280: 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20  ->nFrame = 0;.. 
d290: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
d2a0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
d2b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
d2c0: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
d2d0: 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
d2e0: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
d2f0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
d300: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d310: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
d320: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
d330: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
d340: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d350: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  }.  if( p->aMem 
d360: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
d370: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
d380: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  1], p->nMem);.  
d390: 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44  }.  while( p->pD
d3a0: 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  elFrame ){.    V
d3b0: 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d  dbeFrame *pDel =
d3c0: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20   p->pDelFrame;. 
d3d0: 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20     p->pDelFrame 
d3e0: 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b  = pDel->pParent;
d3f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d400: 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c  FrameDelete(pDel
d410: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
d420: 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20  ete any auxdata 
d430: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65  allocations made
d440: 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20   by the VM */.  
d450: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
d460: 65 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20  eAuxData(p, -1, 
d470: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0);.  assert( p-
d480: 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a  >pAuxData==0 );.
d490: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
d4a0: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 61  p the VM after a
d4b0: 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a   single run..*/.
d4c0: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
d4d0: 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nup(Vdbe *p){.  
d4e0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
d4f0: 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  >db;..#ifdef SQL
d500: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45  ITE_DEBUG.  /* E
d510: 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20  xecute assert() 
d520: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
d530: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64  sure that the Vd
d540: 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a  be.apCsr[] and .
d550: 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d    ** Vdbe.aMem[]
d560: 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72   arrays have alr
d570: 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65  eady been cleane
d580: 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  d up.  */.  int 
d590: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  i;.  if( p->apCs
d5a0: 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  r ) for(i=0; i<p
d5b0: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20  ->nCursor; i++) 
d5c0: 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
d5d0: 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  [i]==0 );.  if( 
d5e0: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66  p->aMem ){.    f
d5f0: 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d  or(i=1; i<=p->nM
d600: 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  em; i++) assert(
d610: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67   p->aMem[i].flag
d620: 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64  s==MEM_Undefined
d630: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
d640: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d650: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
d660: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
d670: 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  0;.  p->pResultS
d680: 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  et = 0;.}../*.**
d690: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
d6a0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
d6b0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
d6c0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
d6d0: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
d6e0: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
d6f0: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
d700: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
d710: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
d720: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
d730: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
d740: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
d750: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
d760: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
d770: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
d780: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
d790: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d7a0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
d7b0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
d7c0: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
d7d0: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
d7e0: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   n;.  sqlite3 *d
d7f0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65  b = p->db;..  re
d800: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
d810: 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
d820: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
d830: 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  _N);.  sqlite3Db
d840: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
d850: 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65  Name);.  n = nRe
d860: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
d870: 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  N;.  p->nResColu
d880: 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f  mn = (u16)nResCo
d890: 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e  lumn;.  p->aColN
d8a0: 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d  ame = pColName =
d8b0: 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62   (Mem*)sqlite3Db
d8c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
d8d0: 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a  izeof(Mem)*n );.
d8e0: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d    if( p->aColNam
d8f0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
d900: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
d910: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  ){.    pColName-
d920: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
d930: 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  l;.    pColName-
d940: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  >db = p->db;.   
d950: 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d   pColName++;.  }
d960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
d970: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64  e name of the id
d980: 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  x'th column to b
d990: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
d9a0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
d9b0: 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62  .** zName must b
d9c0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
d9d0: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
d9e0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
d9f0: 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20  is call must be 
da00: 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c  made after a cal
da10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
da20: 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a  SetNumCols()..**
da30: 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61  .** The final pa
da40: 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d  rameter, xDel, m
da50: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51  ust be one of SQ
da60: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51  LITE_DYNAMIC, SQ
da70: 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f  LITE_STATIC.** o
da80: 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  r SQLITE_TRANSIE
da90: 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c  NT. If it is SQL
daa0: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ITE_DYNAMIC, the
dab0: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
dac0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e  nted.** to by zN
dad0: 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ame will be free
dae0: 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72  d by sqlite3DbFr
daf0: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
db00: 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e  be is destroyed.
db10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
db20: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20  dbeSetColName(. 
db30: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20    /* Vdbe being 
db60: 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20  configured */.  
db70: 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20  int idx,        
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
dba0: 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65  umn zName applie
dbb0: 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61  s to */.  int va
dbc0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
dbd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
dbe0: 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45  e of the COLNAME
dbf0: 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  _* constants */.
dc00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
dc10: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
dc20: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
dc30: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
dc40: 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69  ng name */.  voi
dc50: 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  d (*xDel)(void*)
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc70: 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   Memory manageme
dc80: 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20  nt strategy for 
dc90: 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  zName */.){.  in
dca0: 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f  t rc;.  Mem *pCo
dcb0: 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  lName;.  assert(
dcc0: 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75   idx<p->nResColu
dcd0: 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
dce0: 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b  var<COLNAME_N );
dcf0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
dd00: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
dd10: 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65    assert( !zName
dd20: 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45   || xDel!=SQLITE
dd30: 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20  _DYNAMIC );.    
dd40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
dd50: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  MEM;.  }.  asser
dd60: 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
dd70: 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
dd80: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
dd90: 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
dda0: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20  olumn]);.  rc = 
ddb0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
ddc0: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
ddd0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
dde0: 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20  _UTF8, xDel);.  
ddf0: 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c  assert( rc!=0 ||
de00: 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c   !zName || (pCol
de10: 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Name->flags&MEM_
de20: 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65  Term)!=0 );.  re
de30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
de40: 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74  * A read or writ
de50: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  e transaction ma
de60: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
de70: 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61  active on databa
de80: 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
de90: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
dea0: 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d  n is active, com
deb0: 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65  mit it. If there
dec0: 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74   is a.** write-t
ded0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e  ransaction spann
dee0: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ing more than on
def0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
df00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
df10: 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74   takes care of t
df20: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
df30: 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73  l trickery..*/.s
df40: 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
df50: 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
df60: 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  , Vdbe *p){.  in
df70: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
df80: 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
df90: 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
dfa0: 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
dfb0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
dfc0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
dfd0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
dfe0: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a  eedXcommit = 0;.
dff0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
e000: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
e010: 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20  .  /* With this 
e020: 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56  option, sqlite3V
e030: 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66  tabSync() is def
e040: 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c  ined to be simpl
e050: 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  y .  ** SQLITE_O
e060: 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73  K so p is not us
e070: 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53  ed. .  */.  UNUS
e080: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
e090: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
e0a0: 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
e0b0: 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74  ing else, call t
e0c0: 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  he xSync() callb
e0d0: 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a  ack for any.  **
e0e0: 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20   virtual module 
e0f0: 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69  tables written i
e100: 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
e110: 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a  on. This has to.
e120: 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66    ** be done bef
e130: 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  ore determining 
e140: 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72  whether a master
e150: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
e160: 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c   .  ** required,
e170: 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63   as an xSync() c
e180: 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20  allback may add 
e190: 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61  an attached data
e1a0: 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  base.  ** to the
e1b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
e1c0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
e1d0: 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29  3VtabSync(db, p)
e1e0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
e1f0: 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29  p determines (a)
e200: 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68   if the commit h
e210: 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ook should be in
e220: 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28  voked and.  ** (
e230: 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61  b) how many data
e240: 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20  base files have 
e250: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
e260: 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20  actions, not .  
e270: 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
e280: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20   temp database. 
e290: 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  (b) is important
e2a0: 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65   because if more
e2b0: 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20   than .  ** one 
e2c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
e2d0: 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  s an open write 
e2e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d  transaction, a m
e2f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20  aster journal.  
e300: 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  ** file is requi
e310: 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69  red for an atomi
e320: 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a  c commit..  */ .
e330: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
e340: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
e350: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
e360: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
e370: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
e380: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
e390: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
e3a0: 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58  ) ){.      needX
e3b0: 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  commit = 1;.    
e3c0: 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72    if( i!=1 ) nTr
e3d0: 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  ans++;.      sql
e3e0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
e3f0: 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
e400: 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
e410: 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65  usiveLock(sqlite
e420: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
e430: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e440: 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b  BtreeLeave(pBt);
e450: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
e460: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e470: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
e480: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e490: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
e4a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
e4b0: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
e4c0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
e4d0: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
e4e0: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
e4f0: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
e500: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
e510: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
e520: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69  ommitArg);.    i
e530: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
e540: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
e550: 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
e560: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
e570: 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
e580: 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
e590: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
e5a0: 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
e5b0: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
e5c0: 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
e5d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
e5e0: 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
e5f0: 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
e600: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
e610: 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
e620: 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
e630: 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
e640: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
e650: 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
e660: 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
e670: 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
e680: 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
e690: 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66  ory: or a temp f
e6a0: 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74  ile.  In .  ** t
e6b0: 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e  hat case we do n
e6c0: 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
e6d0: 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
e6e0: 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
e6f0: 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61   .  ** simple ca
e700: 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a  se then too..  *
e710: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
e720: 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  e3Strlen30(sqlit
e730: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
e740: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
e750: 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73  t)).   || nTrans
e760: 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  <=1.  ){.    for
e770: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
e780: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
e790: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
e7a0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
e7b0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
e7c0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
e7d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e7e0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
e7f0: 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  One(pBt, 0);.   
e800: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
e810: 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
e820: 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
e830: 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
e840: 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61  lly complete pha
e850: 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66  se 1. .    ** If
e860: 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65   one of the Btre
e870: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
e880: 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74  ) calls fails, t
e890: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e  his indicates an
e8a0: 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72  .    ** IO error
e8b0: 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20   while deleting 
e8c0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20  or truncating a 
e8d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
e8e0: 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20   is unlikely,.  
e8f0: 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68    ** but could h
e900: 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63  appen. In this c
e910: 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  ase abandon proc
e920: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
e930: 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20  n the error..   
e940: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
e950: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e960: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
e970: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
e980: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
e990: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
e9a0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
e9b0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
e9c0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
e9d0: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
e9e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
e9f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
ea00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
ea10: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
ea20: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
ea30: 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
ea40: 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
ea50: 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
ea60: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
ea70: 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
ea80: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
ea90: 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
eaa0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
eab0: 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
eac0: 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ted atomically..
ead0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
eae0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
eaf0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
eb00: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
eb10: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
eb20: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
eb30: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
eb40: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
eb50: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
eb60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
eb70: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
eb80: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
eb90: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
eba0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
ebb0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
ebc0: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
ebd0: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
ebe0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
ebf0: 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  res;.    int ret
ec00: 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ryCount = 0;.   
ec10: 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a   int nMainFile;.
ec20: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
ec30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ec40: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
ec50: 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   nMainFile = sql
ec60: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
ec70: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61  inFile);.    zMa
ec80: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
ec90: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
eca0: 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61  XXXXXX9XXz", zMa
ecb0: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  inFile);.    if(
ecc0: 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65   zMaster==0 ) re
ecd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
ece0: 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  M;.    do {.    
ecf0: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
ed00: 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
ed10: 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unt ){.        i
ed20: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30  f( retryCount>10
ed30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
ed40: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
ed50: 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65  E_FULL, "MJ dele
ed60: 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  te: %s", zMaster
ed70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ed80: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
ed90: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
eda0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
edb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
edc0: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31  f( retryCount==1
edd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
ede0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
edf0: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69  _FULL, "MJ colli
ee00: 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  de: %s", zMaster
ee10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ee20: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79     }.      retry
ee30: 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  Count++;.      s
ee40: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
ee50: 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d  s(sizeof(iRandom
ee60: 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20  ), &iRandom);.  
ee70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ee80: 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65  intf(13, &zMaste
ee90: 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d  r[nMainFile], "-
eea0: 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20  mj%06X9%02X",.  
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52               (iR
eed0: 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66  andom>>8)&0xffff
eee0: 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66  ff, iRandom&0xff
eef0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
ef00: 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20  antipenultimate 
ef10: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
ef20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ef30: 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20  name must.      
ef40: 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f  ** be "9" to avo
ef50: 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f  id name collisio
ef60: 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b  ns when using 8+
ef70: 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a  3 filenames. */.
ef80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d        assert( zM
ef90: 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72  aster[sqlite3Str
efa0: 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33  len30(zMaster)-3
efb0: 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20  ]=='9' );.      
efc0: 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
efd0: 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d  x3(zMainFile, zM
efe0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63  aster);.      rc
eff0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
f000: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
f010: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
f020: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
f030: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
f040: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
f050: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
f060: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f070: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
f080: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
f090: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f0a0: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
f0b0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
f0c0: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
f0d0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
f0e0: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
f0f0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
f100: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
f110: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
f120: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
f130: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
f140: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
f150: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f160: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f170: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
f180: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
f190: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
f1a0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
f1b0: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
f1c0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
f1d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
f1e0: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
f1f0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
f200: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
f210: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
f220: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
f230: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
f240: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f250: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
f260: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
f270: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
f280: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
f290: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
f2a0: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
f2b0: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
f2c0: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
f2d0: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
f2e0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
f2f0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
f300: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
f310: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
f320: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
f330: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
f340: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
f350: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
f360: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
f370: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
f380: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
f390: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
f3a0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
f3b0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
f3c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
f3d0: 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20  Ignore TEMP and 
f3e0: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
f3f0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  es */.        }.
f400: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f410: 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20  zFile[0]!=0 );. 
f420: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
f430: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
f440: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
f450: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
f460: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
f470: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f480: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f490: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
f4a0: 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
f4b0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
f4c0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
f4d0: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
f4e0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
f4f0: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
f500: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f510: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f520: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
f530: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
f540: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
f550: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f560: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
f570: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f580: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
f590: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
f5a0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
f5b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
f5c0: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
f5d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f5e0: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
f5f0: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
f600: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
f610: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
f620: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
f630: 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
f640: 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71   .     && 0==(sq
f650: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
f660: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
f670: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
f680: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
f690: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
f6a0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
f6b0: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
f6c0: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
f6d0: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
f6e0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
f6f0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
f700: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
f710: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f720: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
f730: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
f740: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
f750: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f760: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
f770: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
f780: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
f790: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
f7a0: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
f7b0: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
f7c0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
f7d0: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
f7e0: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
f7f0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
f800: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
f810: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
f820: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f830: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
f840: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
f850: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
f860: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
f870: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
f880: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
f890: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
f8a0: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
f8b0: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
f8c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
f8d0: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
f8e0: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
f8f0: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
f900: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
f910: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
f920: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
f930: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
f940: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
f950: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
f960: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
f970: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
f980: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f990: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f9a0: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
f9b0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
f9c0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
f9d0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
f9e0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
f9f0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
fa00: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
fa10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
fa20: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
fa30: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
fa40: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
fa50: 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
fa60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
fa70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fa80: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
fa90: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
faa0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
fab0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
fac0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fad0: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
fae0: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
faf0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
fb00: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
fb10: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
fb20: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
fb30: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
fb40: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
fb50: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
fb60: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
fb70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
fb80: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
fb90: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
fba0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
fbb0: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
fbc0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
fbd0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
fbe0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
fbf0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
fc00: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
fc10: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
fc20: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
fc30: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
fc40: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
fc50: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
fc60: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
fc70: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
fc80: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
fc90: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
fca0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
fcb0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
fcc0: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
fcd0: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
fce0: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
fcf0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
fd00: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
fd10: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
fd20: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
fd30: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
fd40: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
fd50: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
fd60: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
fd70: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
fd80: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
fd90: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
fda0: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
fdb0: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
fdc0: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
fdd0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
fde0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
fdf0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
fe00: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
fe10: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
fe20: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
fe30: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
fe40: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
fe50: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
fe60: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
fe70: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
fe80: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
fe90: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
fea0: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
feb0: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
fec0: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
fed0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
fee0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
fef0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ff00: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
ff10: 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
ff20: 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
ff30: 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
ff40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
ff50: 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
ff60: 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
ff70: 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
ff80: 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
ff90: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
ffa0: 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
ffb0: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
ffc0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
ffd0: 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
ffe0: 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
fff0: 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
10000 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
10010 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
10020 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
10030 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
10040 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
10050 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
10060 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
10070 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
10080 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
10090 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
100a0 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
100b0 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
100c0 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
100d0 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
100e0 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62  ( sqlite3_stmt_b
100f0 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d  usy((sqlite3_stm
10100 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63  t*)p) ){.      c
10110 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
10120 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
10130 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20   nWrite++;.     
10140 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
10150 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20  r ) nRead++;.   
10160 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
10170 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
10180 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62  t( cnt==db->nVdb
10190 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73  eActive );.  ass
101a0 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
101b0 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
101c0 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d   assert( nRead==
101d0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
101e0 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
101f0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
10200 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
10210 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
10220 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
10230 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
10240 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
10250 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
10260 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
10270 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
10280 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
10290 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
102a0 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
102b0 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
102c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
102d0 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
102e0 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
102f0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
10300 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
10310 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
10320 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
10330 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10340 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
10350 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
10360 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
10370 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
10380 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
10390 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
103a0 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
103b0 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
103c0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
103d0 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
103e0 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
103f0 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
10400 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
10410 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
10420 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d  /* If p->iStatem
10430 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ent is greater t
10440 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
10450 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20  his Vdbe opened 
10460 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  a .  ** statemen
10470 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  t transaction th
10480 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  at should be clo
10490 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e  sed here. The on
104a0 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a  ly exception.  *
104b0 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20  * is that an IO 
104c0 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f  error may have o
104d0 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67  ccurred, causing
104e0 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
104f0 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20  llback..  ** In 
10500 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e  this case (db->n
10510 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61  Statement==0), a
10520 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  nd there is noth
10530 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a  ing to do..  */.
10540 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65    if( db->nState
10550 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74  ment && p->iStat
10560 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  ement ){.    int
10570 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   i;.    const in
10580 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
10590 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
105a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70  .    assert( eOp
105b0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
105c0 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56  BACK || eOp==SAV
105d0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b  EPOINT_RELEASE);
105e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
105f0 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
10600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10610 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d  iStatement==(db-
10620 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e  >nStatement+db->
10630 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a  nSavepoint) );..
10640 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
10650 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
10660 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53       int rc2 = S
10670 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
10680 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10690 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
106a0 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
106b0 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
106c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
106d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
106e0 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
106f0 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
10700 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10710 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
10720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10730 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49     if( rc2==SQLI
10740 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10750 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
10760 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
10770 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
10780 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
10790 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
107a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
107b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
107c0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
107d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
107e0 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e  .    }.    db->n
107f0 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20  Statement--;.   
10800 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
10810 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   0;..    if( rc=
10820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10830 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
10840 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10850 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10860 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
10870 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
10880 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
10890 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
108a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
108b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
108c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
108d0 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
108e0 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  b, SAVEPOINT_REL
108f0 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
10900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10910 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
10920 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10930 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72  ction is being r
10940 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f  olled back, also
10950 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20   restore the .  
10960 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61    ** database ha
10970 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63  ndles deferred c
10980 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
10990 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  r to the value i
109a0 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20  t had when .    
109b0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
109c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
109d0 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20   opened.  */.   
109e0 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
109f0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
10a00 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
10a10 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  redCons = p->nSt
10a20 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20  mtDefCons;.     
10a30 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
10a40 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  mCons = p->nStmt
10a50 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20  DefImmCons;.    
10a60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
10a70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
10a80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
10a90 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
10aa0 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79  action opened by
10ab0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
10ac0 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61  * handle associa
10ad0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20  ted with the VM 
10ae0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
10af0 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
10b00 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74  o be .** committ
10b10 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ed. If there are
10b20 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66   outstanding def
10b30 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
10b40 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  y constraint.** 
10b50 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75  violations, retu
10b60 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
10b70 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
10b80 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
10b90 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
10ba0 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69  nding FK violati
10bb0 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ons and this fun
10bc0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
10bd0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  * SQLITE_ERROR, 
10be0 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
10bf0 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49  f the VM to SQLI
10c00 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
10c10 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20  REIGNKEY.** and 
10c20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  write an error m
10c30 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68  essage to it. Th
10c40 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
10c50 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64  _ERROR..*/.#ifnd
10c60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
10c70 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73  OREIGN_KEY.int s
10c80 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
10c90 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64  k(Vdbe *p, int d
10ca0 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69  eferred){.  sqli
10cb0 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
10cc0 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64  .  if( (deferred
10cd0 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72   && (db->nDeferr
10ce0 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65  edCons+db->nDefe
10cf0 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20  rredImmCons)>0) 
10d00 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65  .   || (!deferre
10d10 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  d && p->nFkConst
10d20 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20  raint>0) .  ){. 
10d30 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
10d40 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
10d50 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e  EIGNKEY;.    p->
10d60 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
10d70 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69  _Abort;.    sqli
10d80 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
10d90 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 46  >zErrMsg, db, "F
10da0 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
10db0 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
10dc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10dd0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
10de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10df0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10e00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10e10 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
10e20 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
10e30 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
10e40 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
10e50 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
10e60 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
10e70 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
10e80 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
10e90 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
10ea0 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
10eb0 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
10ec0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10ed0 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
10ee0 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
10ef0 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
10f00 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
10f10 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
10f20 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
10f30 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
10f40 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
10f50 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
10f60 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
10f70 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
10f80 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
10f90 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
10fa0 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
10fb0 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
10fc0 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
10fd0 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
10fe0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
10ff0 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
11000 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
11010 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
11020 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
11030 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
11040 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
11050 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
11060 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
11070 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11090 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
110a0 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
110b0 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
110c0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
110d0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
110e0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
110f0 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
11100 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
11110 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
11120 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
11130 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
11140 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
11150 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
11160 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
11170 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
11180 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
11190 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
111a0 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
111b0 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
111c0 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
111d0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
111e0 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
111f0 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
11200 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
11210 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
11220 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
11230 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
11240 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
11250 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
11260 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
11270 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
11280 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
11290 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
112a0 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
112b0 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
112c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
112d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
112e0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
112f0 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
11300 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
11310 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
11320 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11330 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
11340 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74  nceFlag ) memset
11350 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30  (p->aOnceFlag, 0
11360 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b  , p->nOnceFlag);
11370 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
11380 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  rs(p);.  if( p->
11390 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
113a0 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
113b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
113c0 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65   }.  checkActive
113d0 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
113e0 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
113f0 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
11400 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
11410 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20  ever started or 
11420 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20  if the.  ** SQL 
11430 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e  statement does n
11440 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ot read or write
11450 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
11460 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
11470 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65  c>=0 && p->bIsRe
11480 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  ader ){.    int 
11490 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
114a0 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
114b0 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69  m p->rc */.    i
114c0 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  nt eStatementOp 
114d0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  = 0;.    int isS
114e0 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
114f0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
11500 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65  o true if a 'spe
11510 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a  cial' error */..
11520 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
11530 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
11540 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
11550 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
11560 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  nter(p);..    /*
11570 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
11580 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
11590 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
115a0 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
115b0 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
115c0 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
115d0 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
115e0 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
11610 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
11620 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
11630 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
11640 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
11650 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
11660 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  as read-only and
11670 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
11680 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  is SQLITE_INTERR
11690 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e  UPT, .      ** n
116a0 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  o rollback is ne
116b0 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69  cessary. Otherwi
116c0 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73  se, at least a s
116d0 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
116e0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ** transaction m
116f0 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
11700 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ck to restore th
11710 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
11720 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  .      ** consis
11730 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
11740 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76    **.      ** Ev
11750 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
11760 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ent is read-only
11770 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
11780 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20  t to perform.   
11790 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e     ** a statemen
117a0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
117b0 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
117c0 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
117d0 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  r .      ** occu
117e0 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  rred while writi
117f0 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
11800 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  l, sub-journal o
11810 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  r database.     
11820 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74   ** file as part
11830 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   of an effort to
11840 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73   free up cache s
11850 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69  pace (see functi
11860 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  on.      ** page
11870 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67  rStress() in pag
11880 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62  er.c), the rollb
11890 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20  ack is required 
118a0 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20  to restore .    
118b0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74    ** the pager t
118c0 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  o a consistent s
118d0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
118e0 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
118f0 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
11900 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
11910 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
11920 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11930 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
11940 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73  FULL) && p->uses
11950 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
11960 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d           eStatem
11970 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
11980 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
11990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
119a0 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
119b0 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
119c0 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
119d0 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
119e0 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
119f0 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
11a00 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
11a10 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
11a20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
11a30 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
11a40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
11a50 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
11a60 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
11a70 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
11a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
11a90 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
11aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
11ab0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
11ac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11ad0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
11ae0 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
11af0 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
11b00 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
11b10 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
11b20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11b30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
11b40 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
11b50 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
11b60 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
11b70 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
11b80 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
11b90 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
11ba0 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
11bb0 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
11bc0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
11bd0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
11be0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
11bf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
11c00 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
11c10 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
11c20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
11c30 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
11c40 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
11c50 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
11c60 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
11c70 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
11c80 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
11c90 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
11ca0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
11cb0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
11cc0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
11cd0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11ce0 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
11cf0 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
11d00 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
11d10 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
11d20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
11d30 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
11d40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11d50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11d60 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
11d70 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
11d80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11d90 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
11da0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
11db0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
11dc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11dd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11de0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
11df0 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
11e00 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
11e10 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
11e20 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
11e30 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
11e40 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
11e50 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
11e60 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
11e70 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
11e80 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
11e90 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
11ea0 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
11eb0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
11ec0 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
11ed0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
11ee0 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
11ef0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
11f00 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
11f10 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
11f20 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
11f30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11f40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11f50 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
11f60 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
11f70 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
11f80 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
11f90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
11fa0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
11fb0 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
11fc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11fd0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
11fe0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
11ff0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
12000 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
12010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12020 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
12030 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
12040 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
12050 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
12060 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
12070 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
12080 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20  ferFKs;.        
12090 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
120a0 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
120b0 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
120c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
120d0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
120e0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
120f0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _OK);.      }.  
12100 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
12110 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nt = 0;.    }els
12120 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74  e if( eStatement
12130 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Op==0 ){.      i
12140 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12150 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
12160 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
12170 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
12180 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
12190 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20  NT_RELEASE;.    
121a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
121b0 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41  rrorAction==OE_A
121c0 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
121d0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
121e0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
121f0 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
12200 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
12210 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
12220 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
12230 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
12240 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
12250 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
12260 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
12270 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
12280 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
12290 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
122a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
122b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
122c0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
122d0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
122e0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
122f0 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
12300 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
12310 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
12320 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
12330 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
12340 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
12350 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
12360 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
12370 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
12380 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
12390 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
123a0 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
123b0 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
123c0 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
123d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
123e0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
123f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12400 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
12410 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
12420 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
12430 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
12440 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12450 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
12460 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
12470 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
12480 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
12490 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
124a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
124b0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
124c0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
124d0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
124e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
124f0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
12500 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
12510 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
12520 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
12530 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
12540 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
12550 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
12560 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
12570 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52  his was an INSER
12580 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
12590 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65  ETE and no state
125a0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
125b0 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
125c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70   rolled back, up
125d0 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
125e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61  e connection cha
125f0 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20  nge-counter. .  
12600 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
12610 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20  changeCntOn ){. 
12620 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d       if( eStatem
12630 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54  entOp!=SAVEPOINT
12640 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
12650 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12660 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
12670 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
12680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12690 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
126a0 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
126b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
126c0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
126d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
126e0 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
126f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
12700 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  eave(p);.  }..  
12710 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
12720 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
12730 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
12740 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
12750 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
12760 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
12770 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b  ->nVdbeActive--;
12780 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61  .    if( !p->rea
12790 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62  dOnly ) db->nVdb
127a0 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66  eWrite--;.    if
127b0 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
127c0 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d   db->nVdbeRead--
127d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
127e0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64  ->nVdbeActive>=d
127f0 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
12800 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12810 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e  nVdbeRead>=db->n
12820 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20  VdbeWrite );.   
12830 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
12840 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20  beWrite>=0 );.  
12850 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
12860 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
12870 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
12880 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
12890 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
128a0 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
128b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
128c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
128d0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
128e0 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ag is set to tru
128f0 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b  e, then any lock
12900 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64  s that were held
12910 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74  .  ** by connect
12920 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20  ion db have now 
12930 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43  been released. C
12940 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  all sqlite3Conne
12950 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20  ctionUnlocked() 
12960 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20  .  ** to invoke 
12970 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c  any required unl
12980 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
12990 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  acks..  */.  if(
129a0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
129b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
129c0 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
129d0 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  (db);.  }..  ass
129e0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
129f0 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75  tive>0 || db->au
12a00 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
12a10 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
12a20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
12a30 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
12a40 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
12a50 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a   SQLITE_OK);.}..
12a60 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
12a70 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
12a80 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
12a90 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
12aa0 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
12ab0 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
12ac0 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
12ad0 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
12ae0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
12af0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
12b00 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
12b10 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
12b20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12b30 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f  ** Copy the erro
12b40 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
12b50 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69   message belongi
12b60 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70  ng to the VDBE p
12b70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
12b80 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
12b90 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68  o its database h
12ba0 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74  andle (so that t
12bb0 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20  hey will be .** 
12bc0 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c  returned by call
12bd0 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72  s to sqlite3_err
12be0 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74  code() and sqlit
12bf0 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a  e3_errmsg())..**
12c00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12c10 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72  n does not clear
12c20 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20   the VDBE error 
12c30 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c  code or message,
12c40 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20   just.** copies 
12c50 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61  them to the data
12c60 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
12c70 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54  int sqlite3VdbeT
12c80 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62  ransferError(Vdb
12c90 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
12ca0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
12cb0 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
12cc0 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
12cd0 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f   ){.    u8 mallo
12ce0 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61  cFailed = db->ma
12cf0 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
12d00 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
12d10 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
12d20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
12d30 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
12d40 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
12d50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
12d60 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
12d70 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
12d80 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
12d90 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
12da0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
12db0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
12dc0 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
12dd0 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61  ailed = mallocFa
12de0 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72  iled;.    db->er
12df0 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65  rCode = rc;.  }e
12e00 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
12e10 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
12e20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12e30 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
12e40 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f  _ENABLE_SQLLOG./
12e50 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54  *.** If an SQLIT
12e60 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20  E_CONFIG_SQLLOG 
12e70 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72  hook is register
12e80 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61  ed and the VM ha
12e90 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20  s been run, .** 
12ea0 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74  invoke it..*/.st
12eb0 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e  atic void vdbeIn
12ec0 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20  vokeSqllog(Vdbe 
12ed0 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *v){.  if( sqlit
12ee0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
12ef0 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d  Sqllog && v->rc=
12f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d  =SQLITE_OK && v-
12f10 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d  >zSql && v->pc>=
12f20 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
12f30 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74  Expanded = sqlit
12f40 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28  e3VdbeExpandSql(
12f50 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20  v, v->zSql);.   
12f60 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e   assert( v->db->
12f70 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
12f80 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65      if( zExpande
12f90 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
12fa0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
12fb0 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20  Sqllog(.        
12fc0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
12fd0 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
12fe0 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  , v->db, zExpand
12ff0 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20  ed, 1.      );. 
13000 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
13010 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e  ee(v->db, zExpan
13020 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ded);.    }.  }.
13030 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
13040 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
13050 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  g(x).#endif../*.
13060 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
13070 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
13080 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
13090 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
130a0 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
130b0 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
130c0 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
130d0 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
130e0 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
130f0 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
13100 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
13110 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
13120 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
13130 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
13140 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74  **.** To look at
13150 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c   it another way,
13160 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
13170 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
13180 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  f the.** virtual
13190 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44   machine from VD
131a0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20  BE_MAGIC_RUN or 
131b0 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
131c0 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  back to.** VDBE_
131d0 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69  MAGIC_INIT..*/.i
131e0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
131f0 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  set(Vdbe *p){.  
13200 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
13210 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
13220 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
13230 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
13240 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
13250 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
13260 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
13270 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
13280 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
13290 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
132a0 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
132b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
132c0 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lt(p);..  /* If 
132d0 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
132e0 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
132f0 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
13300 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
13310 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
13320 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
13330 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
13340 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
13350 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
13360 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
13370 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
13380 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
13390 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
133a0 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
133b0 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
133c0 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
133d0 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
133e0 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
133f0 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
13400 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
13410 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
13420 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
13430 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
13440 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(p);.    sqlite
13450 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
13460 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
13470 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
13480 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f   if( p->runOnlyO
13490 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64  nce ) p->expired
134a0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
134b0 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
134c0 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
134d0 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
134e0 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
134f0 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
13500 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
13510 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
13520 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
13530 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
13540 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
13550 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
13560 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
13570 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
13580 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
13590 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
135a0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70  rorWithMsg(db, p
135b0 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  ->rc, p->zErrMsg
135c0 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e   ? "%s" : 0, p->
135d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
135e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
135f0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
13600 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
13610 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
13620 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
13630 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
13640 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
13650 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
13660 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
13670 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
13680 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  E run..  */.#ifd
13690 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
136a0 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75    {.    FILE *ou
136b0 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f  t = fopen("vdbe_
136c0 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61  profile.out", "a
136d0 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20  ");.    if( out 
136e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
136f0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
13700 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20  t, "---- ");.   
13710 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
13720 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
13730 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
13740 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b   "%02x", p->aOp[
13750 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20  i].opcode);.    
13760 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
13770 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
13780 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20      if( p->zSql 
13790 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
137a0 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20  c, pc = 0;.     
137b0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
137c0 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
137d0 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d  for(i=0; (c = p-
137e0 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b  >zSql[i])!=0; i+
137f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
13800 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc=='\n' ) fpr
13810 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
13820 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63  ;.          putc
13830 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  (c, out);.      
13840 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20      pc = c;.    
13850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
13860 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc!='\n' ) fpr
13870 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
13880 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
13890 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
138a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
138b0 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a  char zHdr[100];.
138c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
138d0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
138e0 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36  zHdr), zHdr, "%6
138f0 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22  u %12llu %8llu "
13900 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
13910 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
13920 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
13930 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
13940 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
13950 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
13960 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
13970 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
13980 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   );.        fpri
13990 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
139a0 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Hdr);.        sq
139b0 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
139c0 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
139d0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
139e0 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
139f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13a00 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54  f.  p->iCurrentT
13a10 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61  ime = 0;.  p->ma
13a20 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
13a30 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20  _INIT;.  return 
13a40 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d  p->rc & db->errM
13a50 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  ask;.}. ./*.** C
13a60 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
13a70 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
13a80 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
13a90 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
13aa0 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
13ab0 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
13ac0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
13ad0 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
13ae0 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
13af0 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
13b00 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
13b10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13b20 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  OK;.  if( p->mag
13b30 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
13b40 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
13b50 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
13b60 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
13b70 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
13b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
13b90 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73   & p->db->errMas
13ba0 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20  k)==rc );.  }.  
13bb0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
13bc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
13bd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  c;.}../*.** If p
13be0 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20  arameter iOp is 
13bf0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
13c00 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
13c10 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a  destructor for.*
13c20 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20  * all auxiliary 
13c30 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75  data pointers cu
13c40 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62  rrently cached b
13c50 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
13c60 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  as.** the first 
13c70 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
13c80 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72  Or, if iOp is gr
13c90 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
13ca0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
13cb0 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  n the destructor
13cc0 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f   is.** only invo
13cd0 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75  ked for those au
13ce0 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
13cf0 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79  nters created by
13d00 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75   the user .** fu
13d10 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62  nction invoked b
13d20 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f  y the OP_Functio
13d30 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74  n opcode at inst
13d40 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a  ruction iOp of .
13d50 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64  ** VM pVdbe, and
13d60 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a   only then if:.*
13d70 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73  *.**    * the as
13d80 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f  sociated functio
13d90 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  n parameter is t
13da0 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72  he 32nd or later
13db0 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20   (counting.**   
13dc0 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20     from left to 
13dd0 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a  right), or.**.**
13de0 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73      * the corres
13df0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61  ponding bit in a
13e00 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20  rgument mask is 
13e10 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65  clear (where the
13e20 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66   first.**      f
13e30 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
13e40 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
13e50 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f   bit 0 etc.)..*/
13e60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
13e70 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56  eDeleteAuxData(V
13e80 64 62 65 20 2a 70 56 64 62 65 2c 20 69 6e 74 20  dbe *pVdbe, int 
13e90 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  iOp, int mask){.
13ea0 20 20 41 75 78 44 61 74 61 20 2a 2a 70 70 20 3d    AuxData **pp =
13eb0 20 26 70 56 64 62 65 2d 3e 70 41 75 78 44 61 74   &pVdbe->pAuxDat
13ec0 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20  a;.  while( *pp 
13ed0 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a  ){.    AuxData *
13ee0 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20  pAux = *pp;.    
13ef0 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20  if( (iOp<0).    
13f00 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d   || (pAux->iOp==
13f10 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41  iOp && (pAux->iA
13f20 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20  rg>31 || !(mask 
13f30 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78  & MASKBIT32(pAux
13f40 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20 29  ->iArg)))).    )
13f50 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
13f60 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31  ( pAux->iArg==31
13f70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   );.      if( pA
13f80 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20  ux->xDelete ){. 
13f90 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
13fa0 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29  lete(pAux->pAux)
13fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13fc0 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78  *pp = pAux->pNex
13fd0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
13fe0 44 62 46 72 65 65 28 70 56 64 62 65 2d 3e 64 62  DbFree(pVdbe->db
13ff0 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c  , pAux);.    }el
14000 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70  se{.      pp= &p
14010 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Aux->pNext;.    
14020 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
14030 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
14040 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
14050 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
14060 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
14070 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74  ument,.** except
14080 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65   for object itse
14090 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70 72 65  lf, which is pre
140a0 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  served..**.** Th
140b0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
140c0 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
140d0 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64  on and sqlite3Vd
140e0 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68  beDelete() is th
140f0 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65  at.** VdbeDelete
14100 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20  () also unlinks 
14110 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
14120 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73  e list of VMs as
14130 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
14140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
14150 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nnection and fre
14160 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74  es the object it
14170 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  self..*/.void sq
14180 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
14190 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ject(sqlite3 *db
141a0 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75  , Vdbe *p){.  Su
141b0 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20  bProgram *pSub, 
141c0 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b  *pNext;.  int i;
141d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
141e0 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62  ==0 || p->db==db
141f0 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   );.  releaseMem
14200 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
14210 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61  ->nVar);.  relea
14220 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
14230 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
14240 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
14250 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e  ;.  for(pSub=p->
14260 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20  pProgram; pSub; 
14270 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20  pSub=pNext){.   
14280 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70   pNext = pSub->p
14290 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72  Next;.    vdbeFr
142a0 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53  eeOpArray(db, pS
142b0 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e  ub->aOp, pSub->n
142c0 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
142d0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29  DbFree(db, pSub)
142e0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d  ;.  }.  for(i=p-
142f0 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nzVar-1; i>=0; 
14300 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72  i--) sqlite3DbFr
14310 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b  ee(db, p->azVar[
14320 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f  i]);.  vdbeFreeO
14330 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f  pArray(db, p->aO
14340 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71  p, p->nOp);.  sq
14350 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14360 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
14370 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14380 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71  , p->zSql);.  sq
14390 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
143a0 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 20 64  p->pFree);.#if d
143b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
143c0 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
143d0 4e 29 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  N).  sqlite3DbFr
143e0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 78 70 6c 61  ee(db, p->zExpla
143f0 69 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  in);.  sqlite3Db
14400 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 45 78 70  Free(db, p->pExp
14410 6c 61 69 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lain);.#endif.}.
14420 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
14430 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
14440 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
14450 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
14460 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
14470 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ..  if( NEVER(p=
14480 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
14490 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
144a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
144b0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
144c0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
144d0 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
144e0 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d  db, p);.  if( p-
144f0 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
14500 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
14510 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
14520 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
14530 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
14540 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
14550 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
14560 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
14570 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
14580 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
14590 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
145a0 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
145b0 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20  .  p->db = 0;.  
145c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
145d0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , p);.}../*.** T
145e0 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68 61  he cursor "p" ha
145f0 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b  s a pending seek
14600 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20   operation that 
14610 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
14620 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e  .** carried out.
14630 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f    Seek the curso
14640 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72  r now.  If an er
14650 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
14660 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  rn.** the approp
14670 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
14680 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14690 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
146a0 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
146b0 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
146c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20  *p){.  int res, 
146d0 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
146e0 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20  E_TEST.  extern 
146f0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
14700 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
14710 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65  .  assert( p->de
14720 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a  ferredMoveto );.
14730 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
14740 61 62 6c 65 20 29 3b 0a 20 20 72 63 20 3d 20 73  able );.  rc = s
14750 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
14760 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75  oUnpacked(p->pCu
14770 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
14780 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
14790 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
147a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 2d 3e 6c  eturn rc;.  p->l
147b0 61 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f  astRowid = p->mo
147c0 76 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 69 66  vetoTarget;.  if
147d0 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
147e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
147f0 5f 42 4b 50 54 3b 0a 20 20 70 2d 3e 72 6f 77 69  _BKPT;.  p->rowi
14800 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69  dIsValid = 1;.#i
14810 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
14820 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
14830 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
14840 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  f.  p->deferredM
14850 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e  oveto = 0;.  p->
14860 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
14870 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74  CHE_STALE;.  ret
14880 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14890 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e  ../*.** Somethin
148a0 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73  g has moved curs
148b0 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c  or "p" out of pl
148c0 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20  ace.  Maybe the 
148d0 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f  row it was.** po
148e0 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c  inted to was del
148f0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
14900 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62  der it.  Or mayb
14910 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a  e the btree was.
14920 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20  ** rebalanced.  
14930 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75  Whatever the cau
14940 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f  se, try to resto
14950 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c  re "p" to the pl
14960 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70  ace it.** is sup
14970 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  posed to be poin
14980 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f  ting.  If the ro
14990 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  w was deleted ou
149a0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
149b0 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20  .** cursor, set 
149c0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
149d0 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f  int to a NULL ro
149e0 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
149f0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
14a00 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
14a10 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  or(VdbeCursor *p
14a20 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65  ){.  int isDiffe
14a30 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61  rentRow, rc;.  a
14a40 73 73 65 72 74 28 20 70 2d 3e 70 43 75 72 73 6f  ssert( p->pCurso
14a50 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
14a60 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
14a70 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
14a80 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63  pCursor) );.  rc
14a90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
14aa0 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e  ursorRestore(p->
14ab0 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66  pCursor, &isDiff
14ac0 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e  erentRow);.  p->
14ad0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
14ae0 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28  CHE_STALE;.  if(
14af0 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20   isDifferentRow 
14b00 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  ) p->nullRow = 1
14b10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14b20 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
14b30 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
14b40 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
14b50 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
14b60 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
14b70 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
14b80 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
14b90 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
14ba0 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
14bb0 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
14bc0 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
14bd0 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
14be0 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
14bf0 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
14c00 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
14c10 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
14c20 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
14c30 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
14c40 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
14c50 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
14c60 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
14c70 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
14c80 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
14c90 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
14ca0 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
14cb0 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
14cc0 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
14cd0 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
14ce0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
14cf0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
14d00 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
14d10 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
14d20 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
14d30 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
14d40 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
14d50 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
14d60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14d70 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
14d80 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
14d90 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
14da0 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
14db0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
14dc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
14dd0 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
14de0 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  to(p);.  }.  if(
14df0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14e00 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
14e10 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72  Cursor) ){.    r
14e20 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65  eturn handleMove
14e30 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a  dCursor(p);.  }.
14e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14e50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
14e60 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
14e70 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
14e80 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
14e90 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
14ea0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
14eb0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
14ec0 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
14ed0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14ee0 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
14ef0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
14f00 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
14f10 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
14f20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
14f30 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
14f40 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
14f50 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
14f60 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
14f70 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
14f80 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
14f90 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
14fa0 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
14fb0 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
14fc0 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
14fd0 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
14fe0 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
14ff0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
15000 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
15010 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
15020 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
15030 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
15040 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
15050 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
15060 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
15070 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
15080 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
15090 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
150a0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
150b0 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
150c0 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
150d0 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
150e0 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
150f0 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
15100 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
15110 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
15120 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
15130 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  parately..**.** 
15140 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
15150 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
15160 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
15170 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
15180 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
15190 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
151a0 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
151b0 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
151c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
151d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
151e0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
151f0 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15210 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
15220 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
15230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15240 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
15250 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
15260 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
15270 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
15280 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
15290 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
152c0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
152d0 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
152f0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
15300 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
15310 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
15320 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
15330 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
15340 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15360 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
15370 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
15380 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
15390 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
153a0 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
153b0 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153d0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
153e0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
153f0 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
15400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15410 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
15420 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
15430 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15450 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
15460 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
15470 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
15480 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
15490 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
154a0 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
154b0 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
154c0 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
154d0 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
154e0 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
154f0 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
15500 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
15510 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
15520 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
15530 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
15540 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
15550 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
15560 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
15570 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
15580 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
15590 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
155a0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
155b0 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
155c0 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
155d0 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
155e0 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a  flags;.  u32 n;.
155f0 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
15600 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
15610 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
15620 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
15630 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
15640 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
15650 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
15660 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
15670 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
15680 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
15690 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
156a0 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
156b0 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
156c0 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
156d0 20 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58       if( i<(-MAX
156e0 5f 36 42 59 54 45 29 20 29 20 72 65 74 75 72 6e  _6BYTE) ) return
156f0 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65   6;.      /* Pre
15700 76 69 6f 75 73 20 74 65 73 74 20 70 72 65 76 65  vious test preve
15710 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32  nts:  u = -(-922
15720 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
15730 29 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d  ) */.      u = -
15740 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
15750 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d      u = i;.    }
15760 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
15770 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15780 28 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c  ((i&1)==i && fil
15790 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38  e_format>=4) ? 8
157a0 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20  +(u32)u : 1;.   
157b0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32   }.    if( u<=32
157c0 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
157d0 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
157e0 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
157f0 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
15800 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
15810 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
15820 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
15830 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
15840 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
15850 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
15860 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
15870 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
15880 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
15890 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
158a0 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
158b0 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e  assert( pMem->n>
158c0 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32  =0 );.  n = (u32
158d0 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20  )pMem->n;.  if( 
158e0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
158f0 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
15900 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
15910 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
15920 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
15930 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
15940 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
15950 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
15960 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
15970 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
15980 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
15990 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
159a0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
159b0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
159c0 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
159d0 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
159e0 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
159f0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
15a00 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
15a10 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
15a20 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
15a30 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
15a40 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
15a50 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
15a60 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
15a70 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
15a80 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
15a90 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
15aa0 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
15ab0 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
15ac0 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
15ad0 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
15ae0 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
15af0 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
15b00 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
15b10 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
15b20 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
15b30 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
15b40 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
15b50 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
15b60 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
15b70 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
15b80 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
15b90 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
15ba0 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
15bb0 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
15bc0 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
15bd0 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
15be0 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
15bf0 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
15c00 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
15c10 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
15c20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
15c30 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
15c40 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
15c50 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
15c60 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
15c70 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
15c80 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
15c90 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
15ca0 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
15cb0 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
15cc0 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
15cd0 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
15ce0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
15cf0 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
15d00 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
15d10 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
15d20 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
15d30 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
15d40 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
15d50 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
15d60 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
15d70 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
15d80 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
15d90 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
15da0 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
15db0 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
15dc0 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
15dd0 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
15de0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
15df0 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
15e00 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
15e10 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
15e20 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
15e30 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
15e40 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
15e50 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
15e60 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
15e70 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
15e80 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
15e90 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
15ea0 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
15eb0 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
15ec0 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
15ed0 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
15ee0 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
15ef0 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
15f00 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
15f10 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
15f20 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
15f30 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
15f40 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
15f50 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
15f60 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
15f70 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
15f80 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
15f90 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
15fa0 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
15fb0 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
15fc0 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
15fd0 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
15fe0 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
15ff0 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
16000 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
16010 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
16020 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
16030 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
16040 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
16050 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
16060 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
16070 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
16080 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
16090 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
160a0 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
160b0 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
160c0 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
160d0 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
160e0 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
160f0 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
16100 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
16110 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
16120 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
16130 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
16140 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
16150 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
16160 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
16170 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
16180 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
16190 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
161a0 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
161b0 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
161c0 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
161d0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
161e0 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
161f0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
16200 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
16210 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
16220 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
16230 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
16240 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
16250 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
16260 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
16270 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
16280 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
16290 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
162a0 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
162b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
162c0 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
162d0 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
162e0 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
162f0 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
16300 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65  uf[].  The calle
16310 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
16320 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  .** for allocati
16330 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ng enough space 
16340 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64  to buf[] to hold
16350 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
16360 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  d, exclusive.** 
16370 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e  of the pMem->u.n
16380 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61  Zero bytes for a
16390 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e   MEM_Zero value.
163a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
163b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
163c0 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
163d0 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
163e0 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
163f0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
16400 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
16410 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
16420 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
16430 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
16440 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
16450 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
16460 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
16470 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
16480 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32  , Mem *pMem, u32
16490 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
164a0 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
164b0 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
164c0 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
164d0 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
164e0 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
164f0 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
16500 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
16510 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
16520 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
16530 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
16540 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20  m->u.r) );.     
16550 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
16560 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76  m->u.r, sizeof(v
16570 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
16580 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
16590 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
165a0 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
165b0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
165c0 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
165d0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
165e0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
165f0 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
16600 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62  .    do{.      b
16610 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76  uf[--i] = (u8)(v
16620 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
16630 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c  >>= 8;.    }whil
16640 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75  e( i );.    retu
16650 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
16660 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
16670 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
16680 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
16690 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
166a0 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   + ((pMem->flags
166b0 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65   & MEM_Zero)?pMe
166c0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20  m->u.nZero:0).  
166d0 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69             == (i
166e0 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt)sqlite3VdbeSe
166f0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
16700 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
16710 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
16720 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
16730 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
16740 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
16750 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
16760 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
16770 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
16780 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20  }../* Input "x" 
16790 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  is a sequence of
167a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63   unsigned charac
167b0 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65 73  ters that repres
167c0 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64  ent a.** big-end
167d0 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65  ian integer.  Re
167e0 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c  turn the equival
167f0 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67  ent native integ
16800 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e  er.*/.#define ON
16810 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  E_BYTE_INT(x)   
16820 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64   ((i8)(x)[0]).#d
16830 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49  efine TWO_BYTE_I
16840 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28 69  NT(x)    (256*(i
16850 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31  8)((x)[0])|(x)[1
16860 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45  ]).#define THREE
16870 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36  _BYTE_INT(x)  (6
16880 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  5536*(i8)((x)[0]
16890 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78  )|((x)[1]<<8)|(x
168a0 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[2]).#define FO
168b0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20  UR_BYTE_UINT(x) 
168c0 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c   (((u32)(x)[0]<<
168d0 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29  24)|((x)[1]<<16)
168e0 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29  |((x)[2]<<8)|(x)
168f0 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55  [3]).#define FOU
16900 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31  R_BYTE_INT(x) (1
16910 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78 29  6777216*(i8)((x)
16920 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  [0])|((x)[1]<<16
16930 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
16940 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  )[3])../*.** Des
16950 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
16960 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
16970 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
16980 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
16990 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
169a0 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
169b0 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
169c0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
169d0 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
169e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  s function is im
169f0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f  plemented as two
16a00 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e   separate routin
16a10 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e  es for performan
16a20 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63  ce..** The few c
16a30 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69 72  ases that requir
16a40 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  e local variable
16a50 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74  s are broken out
16a60 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65   into a separate
16a70 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  .** routine so t
16a80 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65  hat in most case
16a90 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  s the overhead o
16aa0 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61  f moving the sta
16ab0 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73  ck pointer.** is
16ac0 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74   avoided..*/ .st
16ad0 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f  atic u32 SQLITE_
16ae0 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47  NOINLINE serialG
16af0 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
16b00 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
16b10 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
16b20 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
16b30 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
16b40 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
16b50 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
16b60 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
16b70 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
16b80 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
16b90 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
16ba0 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
16bb0 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
16bc0 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
16bd0 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20  TE_UINT(buf);.  
16be0 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54  u32 y = FOUR_BYT
16bf0 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20  E_UINT(buf+4);. 
16c00 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79   x = (x<<32) + y
16c10 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
16c20 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 70 4d  ype==6 ){.    pM
16c30 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
16c40 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  )&x;.    pMem->f
16c50 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
16c60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
16c70 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d  em->u.i<0 );.  }
16c80 65 6c 73 65 7b 0a 23 69 66 20 21 64 65 66 69 6e  else{.#if !defin
16c90 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
16ca0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16cb0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
16cc0 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  T).    /* Verify
16cd0 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
16ce0 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
16cf0 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
16d00 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74   same.    ** byt
16d10 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
16d20 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
16d30 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
16d40 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20  FLOAT is.    ** 
16d50 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d  defined that 64-
16d60 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
16d70 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79  nt values really
16d80 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a   are mixed.    *
16d90 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f  * endian..    */
16da0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
16db0 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
16dc0 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
16dd0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
16de0 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
16df0 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d  .0;.    u64 t2 =
16e00 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78   t1;.    swapMix
16e10 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
16e20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
16e30 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
16e40 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
16e50 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
16e60 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
16e70 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  if.    assert( s
16e80 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
16e90 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29  izeof(pMem->u.r)
16ea0 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d  ==8 );.    swapM
16eb0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
16ec0 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
16ed0 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73  pMem->u.r, &x, s
16ee0 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70  izeof(x));.    p
16ef0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c  Mem->flags = sql
16f00 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e  ite3IsNaN(pMem->
16f10 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20  u.r) ? MEM_Null 
16f20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a  : MEM_Real;.  }.
16f30 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33    return 8;.}.u3
16f40 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
16f50 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
16f60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
16f70 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
16f80 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
16f90 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
16fa0 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
16fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
16fc0 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
16fd0 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
16fe0 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
16ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
17000 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
17010 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
17020 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  ){.  switch( ser
17030 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
17040 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
17050 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
17060 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
17070 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
17080 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
17090 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
170a0 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a  : {  /* NULL */.
170b0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
170c0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
170d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
170e0 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
170f0 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
17100 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
17110 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45   pMem->u.i = ONE
17120 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
17130 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
17140 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
17150 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
17160 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
17170 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
17180 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
17190 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
171a0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
171b0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57    pMem->u.i = TW
171c0 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
171d0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
171e0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
171f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
17200 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
17210 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
17220 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
17230 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
17240 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
17250 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
17260 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75  HREE_BYTE_INT(bu
17270 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
17280 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
17290 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
172a0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
172b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
172c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
172d0 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
172e0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
172f0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
17300 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  = FOUR_BYTE_INT(
17310 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
17320 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
17330 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
17340 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
17350 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
17360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17370 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
17380 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
17390 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
173a0 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  i = FOUR_BYTE_UI
173b0 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69  NT(buf+2) + (((i
173c0 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
173d0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
173e0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
173f0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
17400 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
17410 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
17420 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
17430 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
17440 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
17450 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
17460 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
17470 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
17480 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65  /.      /* These
17490 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61   use local varia
174a0 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d  bles, so do them
174b0 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72   in a separate r
174c0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
174d0 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
174e0 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d  to move the fram
174f0 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  e pointer in the
17500 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
17510 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72        return ser
17520 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61  ialGet(buf,seria
17530 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20  l_type,pMem);.  
17540 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
17550 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
17560 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
17570 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
17580 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
17590 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
175a0 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
175b0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
175c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
175d0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
175e0 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  t: {.      stati
175f0 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61  c const u16 aFla
17600 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62  g[] = { MEM_Blob
17610 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f  |MEM_Ephem, MEM_
17620 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b  Str|MEM_Ephem };
17630 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
17640 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
17650 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73      pMem->n = (s
17660 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
17670 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
17680 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69  ags = aFlag[seri
17690 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20  al_type&1];.    
176a0 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e    return pMem->n
176b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
176c0 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  turn 0;.}./*.** 
176d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
176e0 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
176f0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
17700 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65  e for an Unpacke
17710 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
17720 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67  ture large enoug
17730 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  h to be used wit
17740 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  h sqlite3VdbeRec
17750 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a  ordUnpack() if.*
17760 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
17770 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
17780 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72  r to KeyInfo str
17790 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e  ucture pKeyInfo.
177a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65  .**.** The space
177b0 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63   is either alloc
177c0 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ated using sqlit
177d0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20  e3DbMallocRaw() 
177e0 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a  or from within.*
177f0 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20  * the unaligned 
17800 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69  buffer passed vi
17810 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64  a the second and
17820 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73   third arguments
17830 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20   (presumably.** 
17840 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66  stack space). If
17850 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65   the former, the
17860 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  n *ppFree is set
17870 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68   to a pointer th
17880 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
17890 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
178a0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
178b0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
178c0 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  ee(). Or, if the
178d0 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   .** allocation 
178e0 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70  comes from the p
178f0 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75  Space/szSpace bu
17900 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73  ffer, *ppFree is
17910 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
17920 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
17930 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
17940 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
17950 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
17960 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63  ..*/.UnpackedRec
17970 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65  ord *sqlite3Vdbe
17980 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
17990 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ord(.  KeyInfo *
179a0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
179b0 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69         /* Descri
179c0 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63  ption of the rec
179d0 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ord */.  char *p
179e0 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
179f0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c           /* Unal
17a00 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69  igned space avai
17a10 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  lable */.  int s
17a20 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  zSpace,         
17a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
17a40 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69  ze of pSpace[] i
17a50 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
17a60 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20  r **ppFree      
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17a80 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75  OUT: Caller shou
17a90 6c 64 20 66 72 65 65 20 74 68 69 73 20 70 6f 69  ld free this poi
17aa0 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70  nter */.){.  Unp
17ab0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20  ackedRecord *p; 
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17ad0 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  Unpacked record 
17ae0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
17af0 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20  nt nOff;        
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17b10 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61  * Increment pSpa
17b20 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c  ce by nOff to al
17b30 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20  ign it */.  int 
17b40 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
17b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17b60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
17b70 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a  equired for *p *
17b80 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20  /..  /* We want 
17b90 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69  to shift the poi
17ba0 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73  nter pSpace up s
17bb0 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38  uch that it is 8
17bc0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20  -byte aligned.. 
17bd0 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65   ** Thus, we nee
17be0 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61  d to calculate a
17bf0 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65   value, nOff, be
17c00 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74  tween 0 and 7, t
17c10 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74  o shift .  ** it
17c20 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20   by.  If pSpace 
17c30 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74  is already 8-byt
17c40 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20  e aligned, nOff 
17c50 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a  should be zero..
17c60 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38    */.  nOff = (8
17c70 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54   - (SQLITE_PTR_T
17c80 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20  O_INT(pSpace) & 
17c90 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65  7)) & 7;.  nByte
17ca0 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
17cb0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
17cc0 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
17cd0 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  (pKeyInfo->nFiel
17ce0 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  d+1);.  if( nByt
17cf0 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29  e>szSpace+nOff )
17d00 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63  {.    p = (Unpac
17d10 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69  kedRecord *)sqli
17d20 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
17d30 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79  KeyInfo->db, nBy
17d40 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65  te);.    *ppFree
17d50 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20   = (char *)p;.  
17d60 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
17d70 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
17d80 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
17d90 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e  ecord*)&pSpace[n
17da0 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65  Off];.    *ppFre
17db0 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d  e = 0;.  }..  p-
17dc0 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28  >aMem = (Mem*)&(
17dd0 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38  (char*)p)[ROUND8
17de0 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
17df0 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73  Record))];.  ass
17e00 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
17e10 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
17e20 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20    p->pKeyInfo = 
17e30 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e  pKeyInfo;.  p->n
17e40 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
17e50 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20  ->nField + 1;.  
17e60 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
17e70 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65  ** Given the nKe
17e80 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20  y-byte encoding 
17e90 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70  of a record in p
17ea0 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20  Key[], populate 
17eb0 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64  the .** Unpacked
17ec0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
17ed0 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
17ee0 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e  e fourth argumen
17ef0 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f  t with the.** co
17f00 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65  ntents of the de
17f10 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f  coded record..*/
17f20 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64   .void sqlite3Vd
17f30 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a  beRecordUnpack(.
17f40 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
17f50 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f  nfo,     /* Info
17f60 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
17f70 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20  e record format 
17f80 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20  */.  int nKey,  
17f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17fa0 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72  ize of the binar
17fb0 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  y record */.  co
17fc0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
17fd0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61       /* The bina
17fe0 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55  ry record */.  U
17ff0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
18000 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
18010 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
18020 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
18030 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  g. */.){.  const
18040 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18050 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
18060 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
18070 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20  ey;.  int d; .  
18080 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20  u32 idx;        
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65  /* Offset in aKe
180b0 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  y[] to read from
180c0 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20   */.  u16 u;    
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
180f0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
18100 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
18110 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e   Mem *pMem = p->
18120 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61  aMem;..  p->defa
18130 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73  ult_rc = 0;.  as
18140 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
18150 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
18160 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
18170 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
18180 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
18190 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
181a0 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
181b0 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  & d<=nKey ){.   
181c0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
181d0 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
181e0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
181f0 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
18200 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
18210 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
18220 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
18230 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
18240 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61      /* pMem->fla
18250 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74  gs = 0; // sqlit
18260 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
18270 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20  ) will set this 
18280 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d  for us */.    pM
18290 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em->szMalloc = 0
182a0 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74  ;.    d += sqlit
182b0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
182c0 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c  &aKey[d], serial
182d0 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20  _type, pMem);.  
182e0 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66    pMem++;.    if
182f0 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65  ( (++u)>=p->nFie
18300 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ld ) break;.  }.
18310 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65    assert( u<=pKe
18320 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
18330 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  1 );.  p->nField
18340 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c   = u;.}..#if SQL
18350 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
18360 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
18370 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78  mpares two index
18380 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64   or table record
18390 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d   keys in the sam
183a0 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20  e way.** as the 
183b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
183c0 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69  dCompare() routi
183d0 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52  ne. Unlike VdbeR
183e0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a  ecordCompare(),.
183f0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
18400 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e   deserializes an
18410 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65  d compares value
18420 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73  s using the.** s
18430 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18440 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65  Get() and sqlite
18450 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75  3MemCompare() fu
18460 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75  nctions. It is u
18470 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  sed.** in assert
18480 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
18490 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
184a0 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20   optimized code 
184b0 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  in.** sqlite3Vdb
184c0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
184d0 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73   returns results
184e0 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20   with these two 
184f0 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a  primitives..**.*
18500 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
18510 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63   the result of c
18520 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75  omparison is equ
18530 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72  ivalent to desir
18540 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74  edResult..** Ret
18550 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65  urn false if the
18560 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65  re is a disagree
18570 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
18580 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
18590 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e  mpareDebug(.  in
185a0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
185b0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
185c0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  eft key */.  con
185d0 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  st UnpackedRecor
185e0 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69  d *pPKey2, /* Ri
185f0 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
18600 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20   desiredResult  
18610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
18620 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a  rrect answer */.
18630 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
18640 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
18650 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
18660 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
18670 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
18680 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
18690 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
186a0 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
186b0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
186c0 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
186d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
186e0 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
186f0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
18700 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
18710 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
18720 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
18730 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18740 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66  )pKey1;.  KeyInf
18750 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d  o *pKeyInfo;.  M
18760 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79  em mem1;..  pKey
18770 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70  Info = pPKey2->p
18780 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  KeyInfo;.  if( p
18790 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29  KeyInfo->db==0 )
187a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
187b0 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
187c0 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
187d0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
187e0 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73  .  /* mem1.flags
187f0 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62   = 0;  // Will b
18800 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
18810 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18820 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41  alGet() */.  VVA
18830 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
18840 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
18850 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
18860 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18870 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69  s */..  /* Compi
18880 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69  lers may complai
18890 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20  n that mem1.u.i 
188a0 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75  is potentially u
188b0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
188c0 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74  ** We could init
188d0 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68  ialize it, as sh
188e0 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c  own here, to sil
188f0 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c  ence those compl
18900 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20  aints..  ** But 
18910 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e  in fact, mem1.u.
18920 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74  i will never act
18930 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e  ually be used un
18940 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64  initialized, and
18950 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65   doing .  ** the
18960 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69   unnecessary ini
18970 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20  tialization has 
18980 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67  a measurable neg
18990 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  ative performanc
189a0 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73  e.  ** impact, s
189b0 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
189c0 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68  e is a very high
189d0 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f   runner.  And so
189e0 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a  , we choose.  **
189f0 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   to ignore the c
18a00 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
18a10 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20   and leave this 
18a20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69  variable uniniti
18a30 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f  alized..  */.  /
18a40 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  *  mem1.u.i = 0;
18a50 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c    // not needed,
18a60 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
18a70 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
18a80 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d  g */.  .  idx1 =
18a90 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
18aa0 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64  y1, szHdr1);.  d
18ab0 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73  1 = szHdr1;.  as
18ac0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
18ad0 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d  nField+pKeyInfo-
18ae0 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  >nXField>=pPKey2
18af0 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52  ->nField || CORR
18b00 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
18b10 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
18b20 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
18b30 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
18b40 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20  o->nField>0 );. 
18b50 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
18b60 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
18b70 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
18b80 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
18b90 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  1;..    /* Read 
18ba0 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
18bb0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
18bc0 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
18bd0 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
18be0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61  = getVarint32( a
18bf0 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61  Key1+idx1, seria
18c00 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20  l_type1 );..    
18c10 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
18c20 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b  here is enough k
18c30 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69  ey space remaini
18c40 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20  ng to avoid.    
18c50 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72  ** a buffer over
18c60 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73  read.  The "d1+s
18c70 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73  erial_type1+2" s
18c80 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c  ubexpression wil
18c90 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  l.    ** always 
18ca0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
18cb0 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
18cc0 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72  amount of requir
18cd0 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20  ed key space..  
18ce0 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70    ** Use that ap
18cf0 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61  proximation to a
18d00 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78  void the more ex
18d10 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a  pensive call to.
18d20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
18d30 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
18d40 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  ) in the common 
18d50 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
18d60 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74   if( d1+serial_t
18d70 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79  ype1+2>(u32)nKey
18d80 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c  1.     && d1+sql
18d90 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
18da0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
18db0 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a  e1)>(u32)nKey1 .
18dc0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
18dd0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
18de0 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
18df0 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61  lues to be compa
18e00 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
18e10 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
18e20 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
18e30 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
18e40 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20  pe1, &mem1);..  
18e50 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70    /* Do the comp
18e60 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  arison.    */.  
18e70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
18e80 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
18e90 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d  &pPKey2->aMem[i]
18ea0 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
18eb0 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  l[i]);.    if( r
18ec0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  c!=0 ){.      as
18ed0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
18ee0 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65  loc==0 );  /* Se
18ef0 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20  e comment below 
18f00 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  */.      if( pKe
18f10 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
18f20 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
18f30 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e  rc = -rc;  /* In
18f40 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20  vert the result 
18f50 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72  for DESC sort or
18f60 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  der. */.      }.
18f70 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67        goto debug
18f80 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20  CompareEnd;.    
18f90 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68  }.    i++;.  }wh
18fa0 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
18fb0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
18fc0 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  ield );..  /* No
18fd0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
18fe0 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
18ff0 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
19000 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
19010 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
19020 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
19030 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
19040 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
19050 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
19060 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
19070 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
19080 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
19090 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
190a0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
190b0 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
190c0 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
190d0 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
190e0 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
190f0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
19100 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
19110 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
19120 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
19130 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
19140 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72  * value.  */.  r
19150 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  c = pPKey2->defa
19160 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f  ult_rc;..debugCo
19170 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20  mpareEnd:.  if( 
19180 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30  desiredResult==0
19190 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75   && rc==0 ) retu
191a0 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
191b0 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72  redResult<0 && r
191c0 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c<0 ) return 1;.
191d0 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
191e0 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20  ult>0 && rc>0 ) 
191f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
19200 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
19210 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65  urn 1;.  if( pKe
19220 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
19230 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
19240 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
19250 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
19260 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20  Both *pMem1 and 
19270 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73  *pMem2 contain s
19280 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f  tring values. Co
19290 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61  mpare the two va
192a0 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68  lues.** using th
192b0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
192c0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75  ence pColl. As u
192d0 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e  sual, return a n
192e0 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a  egative , zero.*
192f0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61  * or positive va
19300 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73  lue if *pMem1 is
19310 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
19320 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20  l to or greater 
19330 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c  than .** *pMem2,
19340 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53   respectively. S
19350 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74  imilar in spirit
19360 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d   to "rc = (*pMem
19370 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e  1) - (*pMem2);".
19380 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
19390 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
193a0 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  ing(.  const Mem
193b0 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74   *pMem1,.  const
193c0 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63   Mem *pMem2,.  c
193d0 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
193e0 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72  oll,.  u8 *prcEr
193f0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
19400 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
19410 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20  OOM occurs, set 
19420 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
19430 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d  */.){.  if( pMem
19440 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  1->enc==pColl->e
19450 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  nc ){.    /* The
19460 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72   strings are alr
19470 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72  eady in the corr
19480 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43  ect encoding.  C
19490 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20  all the.     ** 
194a0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
194b0 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ion directly */.
194c0 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c      return pColl
194d0 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
194e0 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65  ser,pMem1->n,pMe
194f0 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70  m1->z,pMem2->n,p
19500 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  Mem2->z);.  }els
19510 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  e{.    int rc;. 
19520 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76     const void *v
19530 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20  1, *v2;.    int 
19540 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20  n1, n2;.    Mem 
19550 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a  c1;.    Mem c2;.
19560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
19570 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d  emInit(&c1, pMem
19580 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
19590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
195a0 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d  eMemInit(&c2, pM
195b0 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
195c0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
195d0 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
195e0 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45  y(&c1, pMem1, ME
195f0 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71  M_Ephem);.    sq
19600 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
19610 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65  lowCopy(&c2, pMe
19620 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m2, MEM_Ephem);.
19630 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33      v1 = sqlite3
19640 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
19650 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70  e3_value*)&c1, p
19660 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
19670 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a  n1 = v1==0 ? 0 :
19680 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20   c1.n;.    v2 = 
19690 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
196a0 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
196b0 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c2, pColl->enc
196c0 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d  );.    n2 = v2==
196d0 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20  0 ? 0 : c2.n;.  
196e0 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43    rc = pColl->xC
196f0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
19700 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29   n1, v1, n2, v2)
19710 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19720 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29  eMemRelease(&c1)
19730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19740 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29  eMemRelease(&c2)
19750 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30  ;.    if( (v1==0
19760 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72   || v2==0) && pr
19770 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d  cErr ) *prcErr =
19780 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
19790 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
197a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  }.}../*.** Compa
197b0 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52  re two blobs.  R
197c0 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20  eturn negative, 
197d0 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
197e0 65 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a  e if the first.*
197f0 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  * is less than, 
19800 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
19810 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65  ater than the se
19820 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65  cond, respective
19830 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c  ly..** If one bl
19840 6f 62 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  ob is a prefix o
19850 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65  f the other, the
19860 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73  n the shorter is
19870 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a   the lessor..*/.
19880 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
19890 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74  INLINE int sqlit
198a0 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f  e3BlobCompare(co
198b0 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f  nst Mem *pB1, co
198c0 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20  nst Mem *pB2){. 
198d0 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28   int c = memcmp(
198e0 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20  pB1->z, pB2->z, 
198f0 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20  pB1->n>pB2->n ? 
19900 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29  pB2->n : pB1->n)
19910 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65 74 75  ;.  if( c ) retu
19920 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn c;.  return p
19930 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a  B1->n - pB2->n;.
19940 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  }.../*.** Compar
19950 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e  e the values con
19960 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77  tained by the tw
19970 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20  o memory cells, 
19980 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67  returning.** neg
19990 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70  ative, zero or p
199a0 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31  ositive if pMem1
199b0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
199c0 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
199d0 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d  ter.** than pMem
199e0 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72  2. Sorting order
199f0 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74   is NULL's first
19a00 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75  , followed by nu
19a10 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a  mbers (integers.
19a20 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f  ** and reals) so
19a30 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79  rted numerically
19a40 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65  , followed by te
19a50 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68  xt ordered by th
19a60 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  e collating.** s
19a70 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e  equence pColl an
19a80 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73  d finally blob's
19a90 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63   ordered by memc
19aa0 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  mp()..**.** Two 
19ab0 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
19ac0 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c  considered equal
19ad0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
19ae0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
19af0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73  3MemCompare(cons
19b00 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f  t Mem *pMem1, co
19b10 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20  nst Mem *pMem2, 
19b20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70  const CollSeq *p
19b30 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c  Coll){.  int f1,
19b40 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69   f2;.  int combi
19b50 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31  ned_flags;..  f1
19b60 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b   = pMem1->flags;
19b70 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66  .  f2 = pMem2->f
19b80 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64  lags;.  combined
19b90 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a  _flags = f1|f2;.
19ba0 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69    assert( (combi
19bb0 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f  ned_flags & MEM_
19bc0 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a  RowSet)==0 );. .
19bd0 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
19be0 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73  e is NULL, it is
19bf0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f   less than the o
19c00 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61  ther. If both va
19c10 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55  lues.  ** are NU
19c20 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  LL, return 0..  
19c30 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
19c40 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  d_flags&MEM_Null
19c50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
19c60 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28  f2&MEM_Null) - (
19c70 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  f1&MEM_Null);.  
19c80 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  }..  /* If one v
19c90 61 6c 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72  alue is a number
19ca0 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69   and the other i
19cb0 73 20 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65  s not, the numbe
19cc0 72 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  r is less..  ** 
19cd0 49 66 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62  If both are numb
19ce0 65 72 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20  ers, compare as 
19cf0 72 65 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20  reals if one is 
19d00 61 20 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e  a real, or as in
19d10 74 65 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62  tegers.  ** if b
19d20 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 69  oth values are i
19d30 6e 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ntegers..  */.  
19d40 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
19d50 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  gs&(MEM_Int|MEM_
19d60 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 64 6f 75  Real) ){.    dou
19d70 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20  ble r1, r2;.    
19d80 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
19d90 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
19da0 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
19db0 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i < pMem2->u.i 
19dc0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
19dd0 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
19de0 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i > pMem2->u.i )
19df0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
19e00 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
19e10 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d  .    if( (f1&MEM
19e20 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
19e30 20 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e 75     r1 = pMem1->u
19e40 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  .r;.    }else if
19e50 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f1&MEM_Int)!=
19e60 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 ){.      r1 = 
19e70 28 64 6f 75 62 6c 65 29 70 4d 65 6d 31 2d 3e 75  (double)pMem1->u
19e80 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  .i;.    }else{. 
19e90 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
19ea0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32     }.    if( (f2
19eb0 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
19ec0 0a 20 20 20 20 20 20 72 32 20 3d 20 70 4d 65 6d  .      r2 = pMem
19ed0 32 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73  2->u.r;.    }els
19ee0 65 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e  e if( (f2&MEM_In
19ef0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  t)!=0 ){.      r
19f00 32 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d  2 = (double)pMem
19f10 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73  2->u.i;.    }els
19f20 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
19f30 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  -1;.    }.    if
19f40 28 20 72 31 3c 72 32 20 29 20 72 65 74 75 72 6e  ( r1<r2 ) return
19f50 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 72 31 3e   -1;.    if( r1>
19f60 72 32 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  r2 ) return 1;. 
19f70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19f80 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
19f90 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
19fa0 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
19fb0 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72   a blob, the str
19fc0 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a  ing is less..  *
19fd0 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74  * If both are st
19fe0 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75  rings, compare u
19ff0 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1a000 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  ng functions..  
1a010 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1a020 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20  d_flags&MEM_Str 
1a030 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  ){.    if( (f1 &
1a040 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
1a050 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a060 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1a070 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  2 & MEM_Str)==0 
1a080 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a090 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  -1;.    }..    a
1a0a0 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
1a0b0 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b  c==pMem2->enc );
1a0c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1a0d0 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1a0e0 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20  UTF8 || .       
1a0f0 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d       pMem1->enc=
1a100 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
1a110 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53  || pMem1->enc==S
1a120 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b  QLITE_UTF16BE );
1a130 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ..    /* The col
1a140 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1a150 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20  must be defined 
1a160 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65  at this point, e
1a170 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  ven if.    ** th
1a180 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74  e user deletes t
1a190 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1a1a0 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20  uence after the 
1a1b0 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a  vdbe program is.
1a1c0 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
1a1d0 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c  (this was not al
1a1e0 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a  ways the case)..
1a1f0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1a200 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f  t( !pColl || pCo
1a210 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20  ll->xCmp );..   
1a220 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
1a230 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43      return vdbeC
1a240 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1a250 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43  pMem1, pMem2, pC
1a260 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  oll, 0);.    }. 
1a270 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20     /* If a NULL 
1a280 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73  pointer was pass
1a290 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74  ed as the collat
1a2a0 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c  e function, fall
1a2b0 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20   through.    ** 
1a2c0 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65  to the blob case
1a2d0 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28   and use memcmp(
1a2e0 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f  ).  */.  }. .  /
1a2f0 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75  * Both values mu
1a300 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f  st be blobs.  Co
1a310 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63  mpare using memc
1a320 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75  mp().  */.  retu
1a330 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  rn sqlite3BlobCo
1a340 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65  mpare(pMem1, pMe
1a350 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  m2);.}.../*.** T
1a360 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1a370 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
1a380 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73   function is a s
1a390 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a  erial-type that.
1a3a0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ** corresponds t
1a3b0 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61  o an integer - a
1a3c0 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  ll values betwee
1a3d0 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73  n 1 and 9 inclus
1a3e0 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37  ive .** except 7
1a3f0 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69  . The second poi
1a400 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
1a410 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e  containing an in
1a420 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73  teger value.** s
1a430 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64  erialized accord
1a440 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79  ing to serial_ty
1a450 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  pe. This functio
1a460 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a  n deserializes.*
1a470 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  * and returns th
1a480 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  e value..*/.stat
1a490 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72  ic i64 vdbeRecor
1a4a0 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73  dDecodeInt(u32 s
1a4b0 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73  erial_type, cons
1a4c0 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75  t u8 *aKey){.  u
1a4d0 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20  32 y;.  assert( 
1a4e0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73  CORRUPT_DB || (s
1a4f0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26  erial_type>=1 &&
1a500 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20   serial_type<=9 
1a510 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  && serial_type!=
1a520 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  7) );.  switch( 
1a530 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1a540 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63     case 0:.    c
1a550 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73  ase 1:.      tes
1a560 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1a570 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1a580 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  urn ONE_BYTE_INT
1a590 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1a5a0 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   2:.      testca
1a5b0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1a5c0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a5d0 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
1a5e0 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a  ey);.    case 3:
1a5f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a600 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1a610 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48  .      return TH
1a620 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
1a630 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20  y);.    case 4: 
1a640 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1a650 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1a660 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  ;.      y = FOUR
1a670 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1a680 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
1a690 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
1a6a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1a6b0 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1a6c0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1a6d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a6e0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1a6f0 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
1a700 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1a710 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1a720 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a  }.    case 6: {.
1a730 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f        u64 x = FO
1a740 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1a750 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1a760 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1a770 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78   );.      x = (x
1a780 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
1a790 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
1a7a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1a7b0 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  4)*(i64*)&x;.   
1a7c0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1a7d0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1a7e0 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  8);.}../*.** Thi
1a7f0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
1a800 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
1a810 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
1a820 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
1a830 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
1a840 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
1a850 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
1a860 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
1a870 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
1a880 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
1a890 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1a8a0 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
1a8b0 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
1a8c0 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
1a8d0 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
1a8e0 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
1a8f0 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
1a900 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
1a910 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
1a920 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
1a930 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
1a940 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
1a950 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
1a960 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
1a970 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  rd..**.** If arg
1a980 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e  ument bSkip is n
1a990 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61  on-zero, it is a
1a9a0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1a9b0 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1a9c0 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  dy.** determined
1a9d0 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
1a9e0 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65  fields of the ke
1a9f0 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a  ys are equal..**
1aa00 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
1aa10 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
1aa20 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
1aa30 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
1aa40 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66  ds. If all .** f
1aa50 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61  ields that appea
1aa60 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61  r in both keys a
1aa70 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70  re equal, then p
1aa80 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1aa90 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  c is .** returne
1aaa0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  d..**.** If data
1aab0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1aac0 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73  is discovered, s
1aad0 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  et pPKey2->errCo
1aae0 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45  de to .** SQLITE
1aaf0 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74  _CORRUPT and ret
1ab00 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d  urn 0. If an OOM
1ab10 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1ab20 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79  tered, .** pPKey
1ab30 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65  2->errCode is se
1ab40 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
1ab50 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20  M and, if it is 
1ab60 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a  not NULL, the.**
1ab70 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66   malloc-failed f
1ab80 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62  lag set on datab
1ab90 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65  ase handle (pPKe
1aba0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
1abb0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1abc0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1abd0 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e  reWithSkip(.  in
1abe0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1abf0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
1ac00 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1ac10 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1ac20 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f  PKey2,         /
1ac30 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20  * Right key */. 
1ac40 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20   int bSkip      
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac60 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69   /* If true, ski
1ac70 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  p the first fiel
1ac80 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  d */.){.  u32 d1
1ac90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1acb0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1acc0 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
1acd0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ment */.  int i;
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1ad00 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64  ex of next field
1ad10 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
1ad20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad40 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f   /* Size of reco
1ad50 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74  rd header in byt
1ad60 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  es */.  u32 idx1
1ad70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ad80 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1ad90 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20  t of first type 
1ada0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
1adb0 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1add0 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
1ade0 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20  /.  Mem *pRhs = 
1adf0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20  pPKey2->aMem;   
1ae00 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c      /* Next fiel
1ae10 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63  d of pPKey2 to c
1ae20 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49  ompare */.  KeyI
1ae30 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
1ae40 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1ae50 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1ae60 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
1ae70 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1ae80 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
1ae90 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a   Mem mem1;..  /*
1aea0 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75   If bSkip is tru
1aeb0 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  e, then the call
1aec0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64  er has already d
1aed0 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1aee0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77  he first.  ** tw
1aef0 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
1af00 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
1af10 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75  . Fix the variou
1af20 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  s stack variable
1af30 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  s so.  ** that t
1af40 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69  his routine begi
1af50 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20  ns comparing at 
1af60 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64  the second field
1af70 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70  . */.  if( bSkip
1af80 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a   ){.    u32 s1;.
1af90 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67      idx1 = 1 + g
1afa0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1afb0 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73  1[1], s1);.    s
1afc0 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d  zHdr1 = aKey1[0]
1afd0 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
1afe0 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53  1 + sqlite3VdbeS
1aff0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29  erialTypeLen(s1)
1b000 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20  ;.    i = 1;.   
1b010 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65   pRhs++;.  }else
1b020 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74  {.    idx1 = get
1b030 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
1b040 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20  szHdr1);.    d1 
1b050 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66  = szHdr1;.    if
1b060 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e  ( d1>(unsigned)n
1b070 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70  Key1 ){ .      p
1b080 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1b090 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1b0a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1b0b0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f  return 0;  /* Co
1b0c0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1b0d0 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d  }.    i = 0;.  }
1b0e0 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  ..  VVA_ONLY( me
1b0f0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
1b100 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
1b110 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
1b120 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73  atements */.  as
1b130 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1b140 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
1b150 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1b160 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  >nXField>=pPKey2
1b170 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20  ->nField .      
1b180 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1b190 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
1b1a0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  y2->pKeyInfo->aS
1b1b0 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
1b1c0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1b1d0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1b1e0 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
1b1f0 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c   idx1<=szHdr1 ||
1b200 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1b210 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72   do{.    u32 ser
1b220 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f  ial_type;..    /
1b230 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65  * RHS is an inte
1b240 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ger */.    if( p
1b250 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1b260 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65  _Int ){.      se
1b270 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1b280 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74  1[idx1];.      t
1b290 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1b2a0 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1b2b0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1b2c0 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 20  e>=12 ){.       
1b2d0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1b2e0 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1b2f0 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
1b300 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1b310 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1b320 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
1b330 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68         double rh
1b340 73 20 3d 20 28 64 6f 75 62 6c 65 29 70 52 68 73  s = (double)pRhs
1b350 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 73  ->u.i;.        s
1b360 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b370 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1b380 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
1b390 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m1);.        if(
1b3a0 20 6d 65 6d 31 2e 75 2e 72 3c 72 68 73 20 29 7b   mem1.u.r<rhs ){
1b3b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b3c0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1b3d0 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 72  e if( mem1.u.r>r
1b3e0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1b3f0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1b400 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1b410 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20          i64 lhs 
1b420 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  = vdbeRecordDeco
1b430 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70  deInt(serial_typ
1b440 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a  e, &aKey1[d1]);.
1b450 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20          i64 rhs 
1b460 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20  = pRhs->u.i;.   
1b470 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1b480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1b490 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1b4a0 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1b4b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1b4c0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1b4d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1b4e0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65      /* RHS is re
1b4f0 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  al */.    else i
1b500 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1b510 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
1b520 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1b530 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1b540 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1b550 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20  ype>=12 ){.     
1b560 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1b570 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1b580 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
1b590 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1b5a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b5b0 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d      double rhs =
1b5c0 20 70 52 68 73 2d 3e 75 2e 72 3b 0a 20 20 20 20   pRhs->u.r;.    
1b5d0 20 20 20 20 64 6f 75 62 6c 65 20 6c 68 73 3b 0a      double lhs;.
1b5e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1b5f0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1b600 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1b610 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1b620 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1b630 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20  _type==7 ){.    
1b640 20 20 20 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31        lhs = mem1
1b650 2e 75 2e 72 3b 0a 20 20 20 20 20 20 20 20 7d 65  .u.r;.        }e
1b660 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  lse{.          l
1b670 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 6d 65 6d  hs = (double)mem
1b680 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 7d  1.u.i;.        }
1b690 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73  .        if( lhs
1b6a0 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  <rhs ){.        
1b6b0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1b6c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73     }else if( lhs
1b6d0 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  >rhs ){.        
1b6e0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1b6f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b700 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1b710 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  s a string */.  
1b720 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1b730 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
1b740 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72   ){.      getVar
1b750 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
1b760 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
1b770 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b780 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1b790 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1b7a0 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b  erial_type<12 ){
1b7b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1b7c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1b7d0 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ( !(serial_type 
1b7e0 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
1b7f0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1b800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b810 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61   mem1.n = (seria
1b820 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
1b830 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1b840 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d  se( (d1+mem1.n)=
1b850 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1b860 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1b870 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e  case( (d1+mem1.n
1b880 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
1b890 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1b8a0 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20  if( (d1+mem1.n) 
1b8b0 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  > (unsigned)nKey
1b8c0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
1b8d0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1b8e0 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1b8f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1b900 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b920 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1b930 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b940 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1b950 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i] ){.          
1b960 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
1b970 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20  nfo->enc;.      
1b980 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b      mem1.db = pK
1b990 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
1b9a0 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73        mem1.flags
1b9b0 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20   = MEM_Str;.    
1b9c0 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28        mem1.z = (
1b9d0 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d  char*)&aKey1[d1]
1b9e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1b9f0 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1ba00 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20  tring(.         
1ba10 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73       &mem1, pRhs
1ba20 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
1ba30 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65  l[i], &pPKey2->e
1ba40 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20  rrCode.         
1ba50 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
1ba60 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
1ba70 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31   nCmp = MIN(mem1
1ba80 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  .n, pRhs->n);.  
1ba90 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1baa0 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1bab0 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1bac0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1bad0 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e  ==0 ) rc = mem1.
1bae0 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20  n - pRhs->n; .  
1baf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1bb00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1bb10 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  S is a blob */. 
1bb20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1bb30 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
1bb40 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  ob ){.      getV
1bb50 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
1bb60 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
1bb70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1bb80 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1bb90 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1bba0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1bbb0 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  || (serial_type 
1bbc0 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
1bbd0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1bbe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bbf0 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72   int nStr = (ser
1bc00 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
1bc10 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
1bc20 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d  case( (d1+nStr)=
1bc30 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1bc40 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1bc50 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31  case( (d1+nStr+1
1bc60 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1bc70 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
1bc80 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75  ( (d1+nStr) > (u
1bc90 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1bca0 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1bcb0 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1bcc0 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1bcd0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1bce0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1bcf0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1bd00 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1bd10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bd20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
1bd30 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29  N(nStr, pRhs->n)
1bd40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1bd50 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
1bd60 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
1bd70 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1bd80 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e  ( rc==0 ) rc = n
1bd90 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20  Str - pRhs->n;. 
1bda0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1bdb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1bdc0 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  HS is null */.  
1bdd0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65    else{.      se
1bde0 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1bdf0 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72  1[idx1];.      r
1be00 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  c = (serial_type
1be10 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  !=0);.    }..   
1be20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1be30 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
1be40 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1be50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1be60 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
1be70 20 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52     assert( vdbeR
1be80 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1be90 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1bea0 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20  pPKey2, rc) );. 
1beb0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
1bec0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1bed0 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
1bee0 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
1bef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1bf00 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70  ..    i++;.    p
1bf10 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d  Rhs++;.    d1 +=
1bf20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1bf30 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
1bf40 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31  _type);.    idx1
1bf50 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
1bf60 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
1bf70 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  );.  }while( idx
1bf80 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64  1<(unsigned)szHd
1bf90 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1bfa0 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75  nField && d1<=(u
1bfb0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1bfc0 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
1bfd0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
1bfe0 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
1bff0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
1c000 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
1c010 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
1c020 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
1c030 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
1c040 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
1c050 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
1c060 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
1c070 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1c080 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20  e(&mem1).  */.  
1c090 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1c0a0 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
1c0b0 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
1c0c0 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62  ns that one or b
1c0d0 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20  oth of the keys 
1c0e0 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
1c0f0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
1c100 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
1c110 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
1c120 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
1c130 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
1c140 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61  * value.  */.  a
1c150 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1c160 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62  B .       || vdb
1c170 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1c180 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1c190 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32  , pPKey2, pPKey2
1c1a0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20  ->default_rc) . 
1c1b0 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66        || pKeyInf
1c1c0 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
1c1d0 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
1c1e0 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1c1f0 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  t_rc;.}.int sqli
1c200 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c210 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
1c220 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1c230 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
1c240 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1c250 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
1c260 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
1c270 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65  t key */.){.  re
1c280 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43  turn vdbeRecordC
1c290 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
1c2a0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1c2b0 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ey2, 0);.}.../*.
1c2c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c2d0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
1c2e0 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
1c2f0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c300 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20  pare() .** that 
1c310 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (a) the first fi
1c320 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73  eld of pPKey2 is
1c330 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64   an integer, and
1c340 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a   (b) the .** siz
1c350 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
1c360 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
1c370 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  of (pKey1/nKey1)
1c380 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
1c390 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20  e.** byte (i.e. 
1c3a0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38  is less than 128
1c3b0 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  )..**.** To avoi
1c3c0 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74  d concerns about
1c3d0 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
1c3e0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
1c3f0 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20  is only used.** 
1c400 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65  on schemas where
1c410 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c   the maximum val
1c420 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69  id header size i
1c430 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65  s 63 bytes or le
1c440 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ss..*/.static in
1c450 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
1c460 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b  areInt(.  int nK
1c470 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1c480 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
1c490 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1c4a0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
1c4b0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1c4c0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  key */.){.  cons
1c4d0 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28  t u8 *aKey = &((
1c4e0 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29  const u8*)pKey1)
1c4f0 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  [*(const u8*)pKe
1c500 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e  y1 & 0x3F];.  in
1c510 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  t serial_type = 
1c520 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
1c530 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73  1)[1];.  int res
1c540 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34  ;.  u32 y;.  u64
1c550 20 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70 50   x;.  i64 v = pP
1c560 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e  Key2->aMem[0].u.
1c570 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20  i;.  i64 lhs;.. 
1c580 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29   assert( (*(u8*)
1c590 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20  pKey1)<=0x3F || 
1c5a0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1c5b0 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
1c5c0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
1c5d0 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
1c5e0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1c5f0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45  .      lhs = ONE
1c600 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1c610 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c620 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1c630 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c640 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
1c650 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1c660 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
1c670 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
1c680 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1c690 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1c6a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c6b0 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
1c6c0 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
1c6d0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1c6e0 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42     lhs = THREE_B
1c6f0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1c700 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1c710 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1c720 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c730 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
1c740 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c750 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46  r */.      y = F
1c760 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1c770 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d  ey);.      lhs =
1c780 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
1c790 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c7a0 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1c7b0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c7c0 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
1c7d0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1c7e0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
1c7f0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1c800 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
1c810 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1c820 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1c830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1c840 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1c850 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c860 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79  ase 6: { /* 8-by
1c870 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c880 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46  r */.      x = F
1c890 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1c8a0 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  ey);.      x = (
1c8b0 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
1c8c0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
1c8d0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69  .      lhs = *(i
1c8e0 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65  64*)&x;.      te
1c8f0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1c900 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c910 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
1c920 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a  .      lhs = 0;.
1c930 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c940 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c   case 9:.      l
1c950 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  hs = 1;.      br
1c960 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  eak;..    /* Thi
1c970 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20  s case could be 
1c980 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20  removed without 
1c990 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73  changing the res
1c9a0 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a  ults of running.
1c9b0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
1c9c0 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63  . Including it c
1c9d0 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e  auses gcc to gen
1c9e0 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73  erate a faster s
1c9f0 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74  witch .    ** st
1ca00 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74  atement (since t
1ca10 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74  he range of swit
1ca20 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73  ch targets now s
1ca30 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e  tarts at zero an
1ca40 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74  d.    ** is cont
1ca50 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73  iguous) but does
1ca60 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64   not cause any d
1ca70 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f  uplicate code to
1ca80 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20   be generated.  
1ca90 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20    ** (as gcc is 
1caa0 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f  clever enough to
1cab0 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f   combine the two
1cac0 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74   like cases). Ot
1cad0 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  her .    ** comp
1cae0 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73  ilers might be s
1caf0 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20  imilar.  */ .   
1cb00 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a   case 0: case 7:
1cb10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
1cb20 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1cb30 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
1cb40 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20  ey1, pPKey2);.. 
1cb50 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1cb60 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1cb70 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1cb80 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
1cb90 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20  pPKey2);.  }..  
1cba0 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20  if( v>lhs ){.   
1cbb0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1cbc0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76  1;.  }else if( v
1cbd0 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  <lhs ){.    res 
1cbe0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
1cbf0 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32  }else if( pPKey2
1cc00 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
1cc10 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
1cc20 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
1cc30 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1cc40 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61   Compare the tra
1cc50 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69  iling .    ** fi
1cc60 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65  elds.  */.    re
1cc70 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 43 6f  s = vdbeRecordCo
1cc80 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1cc90 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1cca0 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  y2, 1);.  }else{
1ccb0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
1ccc0 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1ccd0 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
1cce0 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  al and there are
1ccf0 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20   no trailing.   
1cd00 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75   ** fields. Retu
1cd10 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
1cd20 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61  lt_rc in this ca
1cd30 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  se. */.    res =
1cd40 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1cd50 5f 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _rc;.  }..  asse
1cd60 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
1cd70 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1cd80 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1cd90 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72   res) );.  retur
1cda0 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
1cdb0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1cdc0 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
1cdd0 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
1cde0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1cdf0 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
1ce00 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1ce10 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20   of pPKey2 is a 
1ce20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29  string, that (b)
1ce30 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1ce40 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c  .** uses the col
1ce50 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1ce60 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74  BINARY and (c) t
1ce70 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
1ce80 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a  header varint .*
1ce90 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  * at the start o
1cea0 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
1ceb0 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
1cec0 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   byte..*/.static
1ced0 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
1cee0 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20  ompareString(.  
1cef0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1cf00 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
1cf10 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1cf20 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1cf30 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
1cf40 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
1cf50 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79    const u8 *aKey
1cf60 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70  1 = (const u8*)p
1cf70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69  Key1;.  int seri
1cf80 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72  al_type;.  int r
1cf90 65 73 3b 0a 0a 20 20 67 65 74 56 61 72 69 6e 74  es;..  getVarint
1cfa0 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65  32(&aKey1[1], se
1cfb0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66  rial_type);.  if
1cfc0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1cfd0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
1cfe0 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f  Key2->r1;      /
1cff0 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
1d000 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61  is a number or a
1d010 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65   null */.  }else
1d020 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
1d030 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20  pe & 0x01) ){ . 
1d040 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1d050 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r2;      /* (pK
1d060 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
1d070 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  blob */.  }else{
1d080 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20  .    int nCmp;. 
1d090 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20     int nStr;.   
1d0a0 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65   int szHdr = aKe
1d0b0 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72  y1[0];..    nStr
1d0c0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
1d0d0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28  12) / 2;.    if(
1d0e0 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20   (szHdr + nStr) 
1d0f0 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  > nKey1 ){.     
1d100 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1d110 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
1d120 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1d130 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f    return 0;    /
1d140 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1d150 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d      }.    nCmp =
1d160 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d   MIN( pPKey2->aM
1d170 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b  em[0].n, nStr );
1d180 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d  .    res = memcm
1d190 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c  p(&aKey1[szHdr],
1d1a0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1d1b0 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20  .z, nCmp);..    
1d1c0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
1d1d0 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d      res = nStr -
1d1e0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1d1f0 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  .n;.      if( re
1d200 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
1d210 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
1d220 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ld>1 ){.        
1d230 20 20 72 65 73 20 3d 20 76 64 62 65 52 65 63 6f    res = vdbeReco
1d240 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1d250 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
1d260 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20  pPKey2, 1);.    
1d270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d280 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1d290 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
1d2a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d2b0 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
1d2c0 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
1d2d0 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
1d2e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d2f0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1d300 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1d310 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
1d320 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
1d330 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65  Key2->r2;.    }e
1d340 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  lse{.      res =
1d350 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
1d360 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1d370 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
1d380 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1d390 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
1d3a0 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  es).       || CO
1d3b0 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20  RRUPT_DB.       
1d3c0 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  || pPKey2->pKeyI
1d3d0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1d3e0 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74  ailed.  );.  ret
1d3f0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
1d400 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1d410 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
1d420 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1d430 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  e() compatible f
1d440 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61  unction.** suita
1d450 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  ble for comparin
1d460 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63  g serialized rec
1d470 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61  ords to the unpa
1d480 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73  cked record pass
1d490 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c  ed.** as the onl
1d4a0 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52  y argument..*/.R
1d4b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c  ecordCompare sql
1d4c0 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
1d4d0 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  are(UnpackedReco
1d4e0 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72  rd *p){.  /* var
1d4f0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
1d500 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74  Int() and varint
1d510 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1d520 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d  ing() both assum
1d530 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
1d540 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1d550 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72  arint that occur
1d560 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
1d570 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20  f each record.  
1d580 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  ** fits in a sin
1d590 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69  gle byte (i.e. i
1d5a0 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20  s 127 or less). 
1d5b0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
1d5c0 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c  areInt().  ** al
1d5d0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  so assumes that 
1d5e0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76  it is safe to ov
1d5f0 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20  erread a buffer 
1d600 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20  by at least the 
1d610 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f  .  ** maximum po
1d620 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61  ssible legal hea
1d630 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20  der size plus 8 
1d640 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74  bytes. Because t
1d650 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61  here is.  ** gua
1d660 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74  ranteed to be at
1d670 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e   least 74 (but n
1d680 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66  ot 136) bytes of
1d690 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69   padding followi
1d6a0 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66  ng each.  ** buf
1d6b0 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61  fer passed to va
1d6c0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
1d6d0 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65  eInt() this make
1d6e0 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20  s it convenient 
1d6f0 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68  to.  ** limit th
1d700 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
1d710 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73  ader to 64 bytes
1d720 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20   in cases where 
1d730 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
1d740 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67    ** is an integ
1d750 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
1d760 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
1d770 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69   enforce this li
1d780 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64  mit is to consid
1d790 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20  er only records 
1d7a0 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65  with.  ** 13 fie
1d7b0 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20  lds or less. If 
1d7c0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1d7d0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  is an integer, t
1d7e0 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
1d7f0 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a  .  ** header siz
1d800 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b  e is (12*5 + 1 +
1d810 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20   1) bytes.  */. 
1d820 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66   if( (p->pKeyInf
1d830 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70  o->nField + p->p
1d840 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1d850 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  )<=13 ){.    int
1d860 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
1d870 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
1d880 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
1d890 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b  aSortOrder[0] ){
1d8a0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31  .      p->r1 = 1
1d8b0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
1d8c0 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
1d8d0 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b       p->r1 = -1;
1d8e0 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31  .      p->r2 = 1
1d8f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d900 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  (flags & MEM_Int
1d910 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1d920 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
1d930 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  areInt;.    }.  
1d940 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
1d950 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a  s & MEM_Real );.
1d960 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
1d970 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
1d980 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d990 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
1d9a0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61   );.    if( (fla
1d9b0 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
1d9c0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
1d9d0 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79  ))==0 && p->pKey
1d9e0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
1d9f0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1da00 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  t( flags & MEM_S
1da10 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
1da20 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
1da30 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20  pareString;.    
1da40 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1da50 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1da60 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a  dCompare;.}../*.
1da70 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
1da80 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
1da90 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
1daa0 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1dab0 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
1dac0 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
1dad0 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
1dae0 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
1daf0 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
1db00 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
1db10 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
1db20 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
1db30 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
1db40 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
1db50 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
1db60 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
1db70 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
1db80 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
1db90 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
1dba0 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
1dbb0 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
1dbc0 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
1dbd0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
1dbe0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1dbf0 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
1dc00 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
1dc10 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
1dc20 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
1dc30 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
1dc40 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
1dc50 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1dc60 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
1dc70 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
1dc80 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1dc90 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
1dca0 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
1dcb0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
1dcc0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
1dcd0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20  Mem m, v;..  /* 
1dce0 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
1dcf0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
1dd00 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
1dd10 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
1dd20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
1dd30 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
1dd40 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
1dd50 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
1dd60 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
1dd70 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1dd80 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
1dd90 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
1dda0 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
1ddb0 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
1ddc0 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
1ddd0 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
1dde0 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
1ddf0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1de00 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1de10 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
1de20 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
1de30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1de40 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
1de50 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
1de60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1de70 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  ;     /* pCur is
1de80 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
1de90 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
1dea0 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  fail */.  assert
1deb0 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51  ( (nCellKey & SQ
1dec0 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28  LITE_MAX_U32)==(
1ded0 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  u64)nCellKey );.
1dee0 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
1def0 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
1df00 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nt of the index 
1df10 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  entry */.  sqlit
1df20 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
1df30 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
1df40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
1df50 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
1df60 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
1df70 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
1df80 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1df90 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
1dfa0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
1dfb0 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
1dfc0 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
1dfd0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
1dfe0 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
1dff0 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
1e000 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
1e010 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
1e020 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
1e030 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
1e040 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
1e050 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
1e060 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
1e070 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
1e080 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
1e090 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
1e0a0 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
1e0b0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
1e0c0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1e0d0 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
1e0e0 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
1e0f0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
1e100 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
1e110 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
1e120 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
1e130 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
1e140 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1e150 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
1e160 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1e170 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
1e180 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1e190 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
1e1a0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
1e1b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1e1c0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
1e1d0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1e1e0 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
1e1f0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1e200 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
1e210 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
1e220 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
1e230 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
1e240 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
1e250 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1e260 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
1e270 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
1e280 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
1e290 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
1e2a0 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
1e2b0 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
1e2c0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
1e2d0 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
1e2e0 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
1e2f0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
1e300 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
1e310 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
1e320 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
1e330 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
1e340 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
1e350 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1e360 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
1e370 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
1e380 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
1e390 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
1e3a0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1e3b0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
1e3c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1e3d0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1e3e0 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
1e3f0 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
1e400 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
1e410 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
1e420 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
1e430 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
1e440 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
1e450 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
1e460 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
1e470 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63  case( m.szMalloc
1e480 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
1e490 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1e4a0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
1e4b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e4c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
1e4d0 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
1e4e0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
1e4f0 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
1e500 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
1e510 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
1e520 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
1e530 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
1e540 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
1e550 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
1e560 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1e570 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
1e580 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1e590 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
1e5a0 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
1e5b0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1e5c0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
1e5d0 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
1e5e0 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
1e5f0 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
1e600 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
1e610 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
1e620 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
1e630 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
1e640 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
1e650 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
1e660 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
1e670 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
1e680 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
1e690 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
1e6a0 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
1e6b0 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
1e6c0 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
1e6d0 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
1e6e0 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
1e6f0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
1e700 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c  eyCompare(.  sql
1e710 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e730 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1e740 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75  tion */.  VdbeCu
1e750 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
1e760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e770 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
1e780 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
1e790 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1e7a0 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20  *pUnpacked,     
1e7b0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
1e7c0 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a  rsion of key */.
1e7d0 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7f0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1e800 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
1e810 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
1e820 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
1e830 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
1e840 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43  ursor *pCur = pC
1e850 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d  ->pCursor;.  Mem
1e860 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   m;..  assert( s
1e870 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1e880 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
1e890 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20  ;.  VVA_ONLY(rc 
1e8a0 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  =) sqlite3BtreeK
1e8b0 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
1e8c0 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ellKey);.  asser
1e8d0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1e8e0 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69   );    /* pCur i
1e8f0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
1e900 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
1e910 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43   fail */.  /* nC
1e920 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61  ellKey will alwa
1e930 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  ys be between 0 
1e940 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62  and 0xffffffff b
1e950 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
1e960 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65  y.  ** that btre
1e970 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
1e980 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61  and sqlite3GetVa
1e990 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70  rint32() are imp
1e9a0 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66  lemented */.  if
1e9b0 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c  ( nCellKey<=0 ||
1e9c0 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66   nCellKey>0x7fff
1e9d0 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73  ffff ){.    *res
1e9e0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1e9f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ea00 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
1ea10 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1ea20 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
1ea30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
1ea40 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43  FromBtree(pC->pC
1ea50 75 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e  ursor, 0, (u32)n
1ea60 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
1ea70 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1ea80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1ea90 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
1eaa0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1eab0 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70  e(m.n, m.z, pUnp
1eac0 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  acked);.  sqlite
1ead0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1eae0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
1eaf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1eb00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1eb10 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
1eb20 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
1eb30 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
1eb40 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
1eb50 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
1eb60 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1eb70 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
1eb80 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
1eb90 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
1eba0 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
1ebb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ebc0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
1ebd0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d  >mutex) );.  db-
1ebe0 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
1ebf0 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
1ec00 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
1ec10 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
1ec20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
1ec30 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
1ec40 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1ec50 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
1ec60 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
1ec70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ec80 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
1ec90 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
1eca0 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
1ecb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
1ecc0 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
1ecd0 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
1ece0 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
1ecf0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
1ed00 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
1ed10 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
1ed20 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
1ed30 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
1ed40 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
1ed50 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
1ed60 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
1ed70 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
1ed80 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
1ed90 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
1eda0 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
1edb0 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
1edc0 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
1edd0 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
1ede0 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
1edf0 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
1ee00 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
1ee10 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
1ee20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
1ee30 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
1ee40 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
1ee50 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
1ee60 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
1ee70 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
1ee80 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
1ee90 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
1eea0 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
1eeb0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
1eec0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
1eed0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
1eee0 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
1eef0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ef00 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
1ef10 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
1ef20 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
1ef30 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.
1ef40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1ef50 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
1ef60 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
1ef70 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
1ef80 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64   the value bound
1ef90 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56  .** parameter iV
1efa0 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65  ar of VM v. Exce
1efb0 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  pt, if the value
1efc0 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c   is an SQL NULL,
1efd0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e   return .** 0 in
1efe0 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74  stead. Unless it
1eff0 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20   is NULL, apply 
1f000 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e  affinity aff (on
1f010 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
1f020 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e  AFF_*.** constan
1f030 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ts) to the value
1f040 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1f050 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  g it..**.** The 
1f060 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d  returned value m
1f070 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
1f080 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
1f090 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
1f0a0 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  e()..*/.sqlite3_
1f0b0 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64  value *sqlite3Vd
1f0c0 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
1f0d0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
1f0e0 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73  r, u8 aff){.  as
1f0f0 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
1f100 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d    if( v ){.    M
1f110 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61  em *pMem = &v->a
1f120 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20  Var[iVar-1];.   
1f130 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66   if( 0==(pMem->f
1f140 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
1f150 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1f160 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20  3_value *pRet = 
1f170 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
1f180 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  v->db);.      if
1f190 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
1f1a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1f1b0 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74  Copy((Mem *)pRet
1f1c0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , pMem);.       
1f1d0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70   sqlite3ValueApp
1f1e0 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c  lyAffinity(pRet,
1f1f0 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46   aff, SQLITE_UTF
1f200 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  8);.      }.    
1f210 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20    return pRet;. 
1f220 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1f230 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
1f240 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69  nfigure SQL vari
1f250 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61  able iVar so tha
1f260 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20  t binding a new 
1f270 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e  value to it sign
1f280 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  als.** to sqlite
1f290 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74  3_reoptimize() t
1f2a0 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67  hat re-preparing
1f2b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d   the statement m
1f2c0 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
1f2d0 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70  a better query p
1f2e0 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lan..*/.void sql
1f2f0 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
1f300 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  sk(Vdbe *v, int 
1f310 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28  iVar){.  assert(
1f320 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
1f330 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20   iVar>32 ){.    
1f340 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66  v->expmask = 0xf
1f350 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65  fffffff;.  }else
1f360 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
1f370 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
1f380 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
1f390 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f3a0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1f3b0 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
1f3c0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
1f3d0 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
1f3e0 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
1f3f0 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
1f400 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
1f410 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
1f420 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
1f430 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
1f440 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
1f450 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
1f460 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
1f470 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
1f480 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
1f490 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
1f4a0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
1f4b0 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  tab){.  sqlite3 
1f4c0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73  *db = p->db;.  s
1f4d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f4e0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
1f4f0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
1f500 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
1f510 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
1f520 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1f530 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
1f540 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
1f550 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  sg = 0;.}.#endif
1f560 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1f570 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.