/ Hex Artifact Content
Login

Artifact 70d414ecc1a345f71a52c7e5e4e1bdfa184081ca:


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 61 73 73 65 72 74 28 20 70 41 2d 3e 64  .  assert( pA->d
06f0: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74  b==pB->db );.  t
0700: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0710: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0720: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0730: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0740: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0750: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0760: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0770: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0780: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0790: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
07a0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
07b0: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
07c0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
07d0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
07e0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
07f0: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
0800: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pareV2;.}../*.**
0810: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
0820: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
0830: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
0840: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
0850: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
0860: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
0870: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0880: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
0890: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
08a0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
08b0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
08c0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
08d0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
08e0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
08f0: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0900: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0910: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
0920: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
0930: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0940: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0950: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0960: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0970: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0980: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0990: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
09a0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
09b0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
09c0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
09d0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
09e0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
09f0: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0a00: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0a10: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0a20: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0a30: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0a40: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0a50: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0a60: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0a70: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0a80: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0a90: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0aa0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0ab0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0ac0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0ad0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0ae0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0af0: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0b00: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0b10: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0b20: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0b30: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0b40: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0b50: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0b60: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0b70: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0b80: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0b90: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0ba0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0bb0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0bc0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0bd0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0be0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0bf0: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0c00: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0c10: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0c20: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0c30: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0c40: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0c50: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0c60: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0c70: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0c80: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0c90: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0ca0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0cb0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0cc0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0cd0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0ce0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
0cf0: 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73  rt( nOp<=(1024/s
0d00: 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20  izeof(Op)) );.  
0d10: 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70  assert( nNew>=(p
0d20: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20  ->nOpAlloc+nOp) 
0d30: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
0d40: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e  te3DbRealloc(p->
0d50: 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77  db, v->aOp, nNew
0d60: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
0d70: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0d80: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71  p->nOpAlloc = sq
0d90: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
0da0: 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73  e(p->db, pNew)/s
0db0: 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76  izeof(Op);.    v
0dc0: 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20  ->aOp = pNew;.  
0dd0: 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77  }.  return (pNew
0de0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
0df0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a  QLITE_NOMEM);.}.
0e00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0e10: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72 6f 75  EBUG./* This rou
0e20: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 20 63  tine is just a c
0e30: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
0e40: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
0e50: 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a  int that will.**
0e60: 20 66 69 72 65 20 61 66 74 65 72 20 65 61 63 68   fire after each
0e70: 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73 65 72   opcode is inser
0e80: 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61 79 65  ted and displaye
0e90: 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52 41 47  d using.** "PRAG
0ea0: 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61  MA vdbe_addoptra
0eb0: 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69  ce=on"..*/.stati
0ec0: 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64 64 6f  c void test_addo
0ed0: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69  p_breakpoint(voi
0ee0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  d){.  static int
0ef0: 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d   n = 0;.  n++;.}
0f00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0f10: 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63  dd a new instruc
0f20: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74  tion to the list
0f30: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   of instructions
0f40: 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a   current in the.
0f50: 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e  ** VDBE.  Return
0f60: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
0f70: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74  the new instruct
0f80: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ion..**.** Param
0f90: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eters:.**.**    
0fa0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
0fb0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  Pointer to the V
0fc0: 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20  DBE.**.**    op 
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
0fe0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73   opcode for this
0ff0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a   instruction.**.
1000: 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33  **    p1, p2, p3
1010: 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a        Operands.*
1020: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
1030: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1040: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
1050: 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73  to fix an addres
1060: 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c  s and.** the sql
1070: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1080: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
1090: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
10a0: 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65  of the P4.** ope
10b0: 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rand..*/.int sql
10c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56  ite3VdbeAddOp3(V
10d0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
10e0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
10f0: 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69  int p3){.  int i
1100: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
1110: 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  ..  i = p->nOp;.
1120: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
1130: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
1140: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
1150: 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78 66 66   op>0 && op<0xff
1160: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 61   );.  if( p->pPa
1170: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69  rse->nOpAlloc<=i
1180: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77   ){.    if( grow
1190: 4f 70 41 72 72 61 79 28 70 2c 20 31 29 20 29 7b  OpArray(p, 1) ){
11a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
11b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
11c0: 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp++;.  pOp = &
11d0: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70  p->aOp[i];.  pOp
11e0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f  ->opcode = (u8)o
11f0: 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30  p;.  pOp->p5 = 0
1200: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31  ;.  pOp->p1 = p1
1210: 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32  ;.  pOp->p2 = p2
1220: 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33  ;.  pOp->p3 = p3
1230: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
1240: 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  0;.  pOp->p4type
1250: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23   = P4_NOTUSED;.#
1260: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1270: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
1280: 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d  ENTS.  pOp->zCom
1290: 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ment = 0;.#endif
12a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
12b0: 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 64 62  EBUG.  if( p->db
12c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
12d0: 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
12e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c 20 6b  ){.    int jj, k
12f0: 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50  k;.    Parse *pP
1300: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
1310: 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d  ;.    for(jj=kk=
1320: 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43  0; jj<SQLITE_N_C
1330: 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a  OLCACHE; jj++){.
1340: 20 20 20 20 20 20 73 74 72 75 63 74 20 79 43 6f        struct yCo
1350: 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50 61 72  lCache *x = pPar
1360: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20 2b 20  se->aColCache + 
1370: 6a 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 78 2d  jj;.      if( x-
1380: 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  >iLevel>pParse->
1390: 69 43 61 63 68 65 4c 65 76 65 6c 20 7c 7c 20 78  iCacheLevel || x
13a0: 2d 3e 69 52 65 67 3d 3d 30 20 29 20 63 6f 6e 74  ->iReg==0 ) cont
13b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 72 69 6e  inue;.      prin
13c0: 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25  tf(" r[%d]={%d:%
13d0: 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d  d}", x->iReg, x-
13e0: 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c  >iTable, x->iCol
13f0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b  umn);.      kk++
1400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1410: 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22  kk ) printf("\n"
1420: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1430: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
1440: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
1450: 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61   test_addop_brea
1460: 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65  kpoint();.  }.#e
1470: 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45  ndif.#ifdef VDBE
1480: 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e  _PROFILE.  pOp->
1490: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f  cycles = 0;.  pO
14a0: 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  p->cnt = 0;.#end
14b0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
14c0: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
14d0: 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d   pOp->iSrcLine =
14e0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
14f0: 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c  urn i;.}.int sql
1500: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56  ite3VdbeAddOp0(V
1510: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b  dbe *p, int op){
1520: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1530: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1540: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  p, 0, 0, 0);.}.i
1550: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1560: 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp1(Vdbe *p, in
1570: 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20  t op, int p1){. 
1580: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1590: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
15a0: 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e   p1, 0, 0);.}.in
15b0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
15c0: 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op2(Vdbe *p, int
15d0: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
15e0: 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p2){.  return s
15f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1600: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1610: 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  0);.}.../*.** Ad
1620: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
1630: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
1640: 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e   value as a poin
1650: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1660: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
1670: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
1680: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1690: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
16a0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
16b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16c0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
16d0: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
16e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
16f0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1700: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1710: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1720: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1740: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1750: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1760: 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34  P4,    /* The P4
1770: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1780: 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20  t p4type        
1790: 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20    /* P4 operand 
17a0: 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  type */.){.  int
17b0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
17c0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
17d0: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
17e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
17f0: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34  eP4(p, addr, zP4
1800: 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74  , p4type);.  ret
1810: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
1820: 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72  ** Add an OP_Par
1830: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e  seSchema opcode.
1840: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
1850: 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f  s broken out fro
1860: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
1870: 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69  AddOp4() since i
1880: 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20  t needs to also 
1890: 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c  needs to mark al
18a0: 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68  l btrees.** as h
18b0: 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e  aving been used.
18c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72  .**.** The zWher
18d0: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61  e string must ha
18e0: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
18f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
1900: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20  lloc()..** This 
1910: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b  routine will tak
1920: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
1930: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
1940: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ory..*/.void sql
1950: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
1960: 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70  SchemaOp(Vdbe *p
1970: 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20  , int iDb, char 
1980: 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *zWhere){.  int 
1990: 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  j;.  int addr = 
19a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b0: 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(p, OP_ParseSch
19c0: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 29 3b  ema, iDb, 0, 0);
19d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
19e0: 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20  angeP4(p, addr, 
19f0: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
1a00: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
1a10: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
1a20: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
1a30: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
1a40: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
1a50: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
1a60: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
1a70: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
1a80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1a90: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
1aa0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
1ab0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
1ac0: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
1ad0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
1ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1af0: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
1b00: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
1b10: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
1b20: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1b30: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
1b40: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
1b50: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
1b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b70: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
1b80: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
1b90: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
1ba0: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
1bb0: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
1bc0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1bd0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1be0: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1bf0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1c00: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51 4c  eP4(p, addr, SQL
1c10: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70  ITE_INT_TO_PTR(p
1c20: 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  4), P4_INT32);. 
1c30: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1c40: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1c50: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
1c60: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
1c70: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
1c80: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
1c90: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
1ca0: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
1cb0: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
1cc0: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
1cd0: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
1ce0: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
1cf0: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
1d00: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
1d10: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
1d20: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
1d30: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
1d40: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
1d50: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
1d60: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
1d70: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
1d80: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
1d90: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
1da0: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
1db0: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
1dc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
1dd0: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
1de0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
1df0: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
1e00: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
1e10: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
1e20: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
1e30: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
1e40: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
1e50: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
1e60: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
1e70: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
1e80: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a  e resolved..**.*
1e90: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
1ea0: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ed if a malloc()
1eb0: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73   fails..*/.int s
1ec0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1ed0: 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  bel(Vdbe *v){.  
1ee0: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50  Parse *p = v->pP
1ef0: 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20  arse;.  int i = 
1f00: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
1f10: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
1f20: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1f30: 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28   );.  if( (i & (
1f40: 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i-1))==0 ){.    
1f50: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69  p->aLabel = sqli
1f60: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
1f70: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
1f80: 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  bel, .          
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 2a               (i*
1fb0: 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  2+1)*sizeof(p->a
1fc0: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a  Label[0]));.  }.
1fd0: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
1fe0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1ff0: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  [i] = -1;.  }.  
2000: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a  return -1-i;.}..
2010: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
2020: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
2030: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
2040: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2050: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
2060: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
2070: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
2080: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
2090: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
20a0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
20b0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
20c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
20d0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
20e0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b  Vdbe *v, int x){
20f0: 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d  .  Parse *p = v-
2100: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a  >pParse;.  int j
2110: 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72   = -1-x;.  asser
2120: 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( v->magic==VDB
2130: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2140: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e    assert( j<p->n
2150: 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 41  Label );.  if( A
2160: 4c 57 41 59 53 28 6a 3e 3d 30 29 20 26 26 20 70  LWAYS(j>=0) && p
2170: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
2180: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76  p->aLabel[j] = v
2190: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ->nOp;.  }.  p->
21a0: 69 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f  iFixedOp = v->nO
21b0: 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p - 1;.}../*.** 
21c0: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73  Mark the VDBE as
21d0: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e   one that can on
21e0: 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69  ly be run one ti
21f0: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
2200: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e  te3VdbeRunOnlyOn
2210: 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  ce(Vdbe *p){.  p
2220: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
2230: 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  1;.}..#ifdef SQL
2240: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
2250: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
2260: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
2270: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2280: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
2290: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
22a0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
22b0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
22c0: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
22d0: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
22e0: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
22f0: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
2300: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
2310: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
2320: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
2330: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
2340: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
2350: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
2360: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
2370: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
2380: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
2390: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
23a0: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
23d0: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
23e0: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
23f0: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
2400: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
2410: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
2420: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
2430: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2440: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
2450: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
2460: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
2470: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
2480: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
2490: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
24a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24b0: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
24c0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
24d0: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
24e0: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
24f0: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
2500: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
2510: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
2520: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
2530: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2540: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
2550: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
2560: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
2570: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2580: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
2590: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
25a0: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25c0: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
25d0: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
25e0: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
25f0: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
2600: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
2610: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
2620: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
2630: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
2640: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
2650: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
2660: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
2670: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
2680: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
2690: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
26a0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
26b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
26c0: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
26d0: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
26e0: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
26f0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
2700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2710: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
2720: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
2730: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
2740: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
2750: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
2760: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
2770: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
2780: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
2790: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
27a0: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
27b0: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
27c0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
27d0: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
27e0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
27f0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2800: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2810: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
2820: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
2830: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
2840: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
2850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2860: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
2870: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
2880: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
2890: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
28a0: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
28b0: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
28c0: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
28d0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
28e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
28f0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
2900: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
2910: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
2920: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
2930: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2940: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
2950: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
2960: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
2970: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
2980: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2990: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
29a0: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
29b0: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
29c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
29d0: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
29e0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
29f0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
2a00: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
2a10: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
2a20: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
2a30: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
2a40: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
2a50: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
2a60: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
2a70: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
2a80: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
2a90: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
2aa0: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
2ab0: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
2ac0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
2ad0: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
2ae0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
2af0: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
2b00: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
2b10: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
2b20: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
2b30: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
2b40: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
2b50: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a  constraint).**.*
2b60: 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61  * Then check tha
2b70: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  t the value of P
2b80: 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73  arse.mayAbort is
2b90: 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41   true if an.** A
2ba0: 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f  BORT may be thro
2bb0: 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  wn, or false oth
2bc0: 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74  erwise. Return t
2bd0: 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a  rue if it does.*
2be0: 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73  * match, or fals
2bf0: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69  e otherwise. Thi
2c00: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
2c10: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
2c20: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
2c30: 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  an assert statem
2c40: 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69  ent in the compi
2c50: 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a  ler. Similar to:
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28  .**.**   assert(
2c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
2c80: 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  rtMayAbort(pPars
2c90: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
2ca0: 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a  ->mayAbort) );.*
2cb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2cc0: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
2cd0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79  Vdbe *v, int may
2ce0: 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61  Abort){.  int ha
2cf0: 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e  sAbort = 0;.  in
2d00: 74 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d  t hasFkCounter =
2d10: 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20   0;.  Op *pOp;. 
2d20: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
2d30: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74  r;.  memset(&sIt
2d40: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
2d50: 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76  ter));.  sIter.v
2d60: 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = v;..  while( 
2d70: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
2d80: 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b  t(&sIter))!=0 ){
2d90: 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20  .    int opcode 
2da0: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
2db0: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
2dc0: 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63  P_Destroy || opc
2dd0: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
2de0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
2df0: 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28  ename .     || (
2e00: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
2e10: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
2e20: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
2e30: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30    && ((pOp->p1&0
2e40: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
2e50: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
2e60: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20  p2==OE_Abort)). 
2e70: 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41     ){.      hasA
2e80: 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  bort = 1;.      
2e90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
2ea0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2eb0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
2ec0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2ed0: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
2ee0: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
2ef0: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
2f00: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
2f10: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2f20: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
2f30: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
2f40: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
2f50: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
2f60: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
2f70: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
2f80: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
2f90: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
2fa0: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
2fb0: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
2fc0: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
2fd0: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
2fe0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
2ff0: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
3000: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
3010: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
3020: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
3030: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
3040: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
3050: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
3060: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
3070: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
3080: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
3090: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
30a0: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
30b0: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20  || hasFkCounter 
30c0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
30d0: 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68  QLITE_DEBUG - th
30e0: 65 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  e sqlite3AssertM
30f0: 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69  ayAbort() functi
3100: 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  on */../*.** Loo
3110: 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72  p through the pr
3120: 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ogram looking fo
3130: 72 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74  r P2 values that
3140: 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a   are negative.**
3150: 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   on jump instruc
3160: 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63  tions.  Each suc
3170: 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  h value is a lab
3180: 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65  el.  Resolve the
3190: 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74  .** label by set
31a0: 74 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75  ting the P2 valu
31b0: 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  e to its correct
31c0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e   non-zero value.
31d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
31e0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
31f0: 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63  ce after all opc
3200: 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  odes have been i
3210: 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56  nserted..**.** V
3220: 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e  ariable *pMaxFun
3230: 63 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20  cArgs is set to 
3240: 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  the maximum valu
3250: 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75  e of any P2 argu
3260: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f  ment .** to an O
3270: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41  P_Function, OP_A
3280: 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69  ggStep or OP_VFi
3290: 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69  lter opcode. Thi
32a0: 73 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a  s is used by .**
32b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
32c0: 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20  Ready() to size 
32d0: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
32e0: 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   array..**.** Th
32f0: 65 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65  e Op.opflags fie
3300: 6c 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c  ld is set on all
3310: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61   opcodes..*/.sta
3320: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
3330: 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70  P2Values(Vdbe *p
3340: 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41  , int *pMaxFuncA
3350: 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rgs){.  int i;. 
3360: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
3370: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20  *pMaxFuncArgs;. 
3380: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73   Op *pOp;.  Pars
3390: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
33a0: 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c  Parse;.  int *aL
33b0: 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61  abel = pParse->a
33c0: 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64  Label;.  p->read
33d0: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62  Only = 1;.  p->b
33e0: 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  IsReader = 0;.  
33f0: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
3400: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
3410: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
3420: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
3430: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
3440: 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72   /* NOTE: Be sur
3450: 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70  e to update mkop
3460: 63 6f 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61  codeh.awk when a
3470: 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e  dding or removin
3480: 67 0a 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66  g.    ** cases f
3490: 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21  rom this switch!
34a0: 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20   */.    switch( 
34b0: 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  opcode ){.      
34c0: 63 61 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  case OP_Function
34d0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  :.      case OP_
34e0: 41 67 67 53 74 65 70 3a 20 7b 0a 20 20 20 20 20  AggStep: {.     
34f0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e     if( pOp->p5>n
3500: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
3510: 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20  gs = pOp->p5;.  
3520: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3530: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3540: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20  OP_Transaction: 
3550: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
3560: 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65  p->p2!=0 ) p->re
3570: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
3580: 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75      /* fall thru
3590: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
35a0: 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f    case OP_AutoCo
35b0: 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65  mmit:.      case
35c0: 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b   OP_Savepoint: {
35d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52  .        p->bIsR
35e0: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
35f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3600: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
3610: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20  _OMIT_WAL.      
3620: 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69  case OP_Checkpoi
3630: 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  nt:.#endif.     
3640: 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a   case OP_Vacuum:
3650: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a  .      case OP_J
3660: 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20  ournalMode: {.  
3670: 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c        p->readOnl
3680: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  y = 0;.        p
3690: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
36a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
36b0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
36c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
36d0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63  UALTABLE.      c
36e0: 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20  ase OP_VUpdate: 
36f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
3700: 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29  p->p2>nMaxArgs )
3710: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
3720: 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65  >p2;.        bre
3730: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3740: 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65    case OP_VFilte
3750: 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r: {.        int
3760: 20 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   n;.        asse
3770: 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e  rt( p->nOp - i >
3780: 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61  = 3 );.        a
3790: 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f  ssert( pOp[-1].o
37a0: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65  pcode==OP_Intege
37b0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d  r );.        n =
37c0: 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20   pOp[-1].p1;.   
37d0: 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41       if( n>nMaxA
37e0: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
37f0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   n;.        brea
3800: 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
3810: 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  f.      case OP_
3820: 4e 65 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65  Next:.      case
3830: 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a   OP_NextIfOpen:.
3840: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f        case OP_So
3850: 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20  rterNext: {.    
3860: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
3870: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
3880: 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  reeNext;.       
3890: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
38a0: 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20  4_ADVANCE;.     
38b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
38c0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
38d0: 50 72 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65  Prev:.      case
38e0: 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20   OP_PrevIfOpen: 
38f0: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  {.        pOp->p
3900: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
3910: 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
3920: 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  s;.        pOp->
3930: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
3940: 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  NCE;.        bre
3950: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3960: 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c  }..    pOp->opfl
3970: 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63  ags = sqlite3Opc
3980: 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f  odeProperty[opco
3990: 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f  de];.    if( (pO
39a0: 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46  p->opflags & OPF
39b0: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70  LG_JUMP)!=0 && p
39c0: 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20  Op->p2<0 ){.    
39d0: 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70    assert( -1-pOp
39e0: 2d 3e 70 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61  ->p2<pParse->nLa
39f0: 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70  bel );.      pOp
3a00: 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31  ->p2 = aLabel[-1
3a10: 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d  -pOp->p2];.    }
3a20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
3a30: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72  Free(p->db, pPar
3a40: 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70  se->aLabel);.  p
3a50: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20  Parse->aLabel = 
3a60: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61  0;.  pParse->nLa
3a70: 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78  bel = 0;.  *pMax
3a80: 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41  FuncArgs = nMaxA
3a90: 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rgs;.  assert( p
3aa0: 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c  ->bIsReader!=0 |
3ab0: 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  | DbMaskAllZero(
3ac0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
3ad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3ae0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
3af0: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
3b00: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72  tion to be inser
3b10: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
3b20: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3b30: 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61  dr(Vdbe *p){.  a
3b40: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
3b50: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
3b60: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
3b70: 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nOp;.}../*.** Th
3b80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
3b90: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
3ba0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70   the array of op
3bb0: 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64  codes associated
3bc0: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62   with.** the Vdb
3bd0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
3be0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
3bf0: 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  It is the caller
3c00: 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  s responsibility
3c10: 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66  .** to arrange f
3c20: 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  or the returned 
3c30: 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e  array to be even
3c40: 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69  tually freed usi
3c50: 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46  ng the .** vdbeF
3c60: 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e  reeOpArray() fun
3c70: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  ction..**.** Bef
3c80: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
3c90: 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74  pnOp is set to t
3ca0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
3cb0: 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75  ries in the retu
3cc0: 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41  rned.** array. A
3cd0: 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69  lso, *pnMaxArg i
3ce0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72  s set to the lar
3cf0: 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65  ger of its curre
3d00: 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a  nt value and .**
3d10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
3d20: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64  ntries in the Vd
3d30: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79  be.apArg[] array
3d40: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65   required to exe
3d50: 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74  cute the .** ret
3d60: 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a  urned program..*
3d70: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
3d80: 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79  3VdbeTakeOpArray
3d90: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
3da0: 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41  nOp, int *pnMaxA
3db0: 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61  rg){.  VdbeOp *a
3dc0: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61  Op = p->aOp;.  a
3dd0: 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70  ssert( aOp && !p
3de0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3df0: 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ed );..  /* Chec
3e00: 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64  k that sqlite3Vd
3e10: 62 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61  beUsesBtree() wa
3e20: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20  s not called on 
3e30: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73  this VM */.  ass
3e40: 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65  ert( DbMaskAllZe
3e50: 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  ro(p->btreeMask)
3e60: 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
3e70: 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41  Values(p, pnMaxA
3e80: 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70  rg);.  *pnOp = p
3e90: 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20  ->nOp;.  p->aOp 
3ea0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f  = 0;.  return aO
3eb0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
3ec0: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
3ed0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
3ee0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
3ef0: 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  k.  Return the.*
3f00: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
3f10: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
3f20: 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73   added..*/.int s
3f30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
3f40: 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ist(Vdbe *p, int
3f50: 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74   nOp, VdbeOpList
3f60: 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74   const *aOp, int
3f70: 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74   iLineno){.  int
3f80: 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28   addr;.  assert(
3f90: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3fa0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3fb0: 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70  if( p->nOp + nOp
3fc0: 20 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f   > p->pParse->nO
3fd0: 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70  pAlloc && growOp
3fe0: 41 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b  Array(p, nOp) ){
3ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4000: 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e   }.  addr = p->n
4010: 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  Op;.  if( ALWAYS
4020: 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69  (nOp>0) ){.    i
4030: 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70  nt i;.    VdbeOp
4040: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20  List const *pIn 
4050: 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69  = aOp;.    for(i
4060: 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20  =0; i<nOp; i++, 
4070: 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  pIn++){.      in
4080: 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a  t p2 = pIn->p2;.
4090: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
40a0: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ut = &p->aOp[i+a
40b0: 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74  ddr];.      pOut
40c0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e  ->opcode = pIn->
40d0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f  opcode;.      pO
40e0: 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31  ut->p1 = pIn->p1
40f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30  ;.      if( p2<0
4100: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
4110: 72 74 28 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  rt( sqlite3Opcod
4120: 65 50 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e  eProperty[pOut->
4130: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
4140: 4a 55 4d 50 20 29 3b 0a 20 20 20 20 20 20 20 20  JUMP );.        
4150: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20  pOut->p2 = addr 
4160: 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20  + ADDR(p2);.    
4170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4180: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a   pOut->p2 = p2;.
4190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
41a0: 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33  ut->p3 = pIn->p3
41b0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
41c0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
41d0: 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  D;.      pOut->p
41e0: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  4.p = 0;.      p
41f0: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
4200: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4210: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
4220: 54 53 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  TS.      pOut->z
4230: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e  Comment = 0;.#en
4240: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
4250: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
4260: 20 20 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63        pOut->iSrc
4270: 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69  Line = iLineno+i
4280: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 28 76  ;.#else.      (v
4290: 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e  oid)iLineno;.#en
42a0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
42b0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
42c0: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
42d0: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
42e0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pTrace ){.      
42f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4300: 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20  ntOp(0, i+addr, 
4310: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29  &p->aOp[i+addr])
4320: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
4330: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f  .    }.    p->nO
4340: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20  p += nOp;.  }.  
4350: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
4360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4370: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
4380: 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a  CANSTATUS)./*.**
4390: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
43a0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f   the array of co
43b0: 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62  unters managed b
43c0: 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  y sqlite3_stmt_s
43d0: 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  canstatus()..*/.
43e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
43f0: 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64  ScanStatus(.  Vd
4400: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4420: 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73   VM to add scans
4430: 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20  tatus() to */.  
4440: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c  int addrExplain,
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
4470: 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
4480: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f  */.  int addrLoo
4490: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
44a0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
44b0: 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  of loop counter 
44c0: 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69  */ .  int addrVi
44d0: 73 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  sit,            
44e0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
44f0: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
4500: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f   counter */.  Lo
4510: 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20  gEst nEst,      
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4530: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
4540: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
4550: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4560: 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *zName         
4570: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
4580: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
4590: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f  being scanned */
45a0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  .){.  int nByte 
45b0: 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a  = (p->nScan+1) *
45c0: 20 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74   sizeof(ScanStat
45d0: 75 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75  us);.  ScanStatu
45e0: 73 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20  s *aNew;.  aNew 
45f0: 3d 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73  = (ScanStatus*)s
4600: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
4610: 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c  p->db, p->aScan,
4620: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61   nByte);.  if( a
4630: 4e 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53  New ){.    ScanS
4640: 74 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61  tatus *pNew = &a
4650: 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b  New[p->nScan++];
4660: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45  .    pNew->addrE
4670: 78 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70  xplain = addrExp
4680: 6c 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lain;.    pNew->
4690: 61 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c  addrLoop = addrL
46a0: 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  oop;.    pNew->a
46b0: 64 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56  ddrVisit = addrV
46c0: 69 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  isit;.    pNew->
46d0: 6e 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20  nEst = nEst;.   
46e0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pNew->zName = s
46f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
4700: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
4710: 20 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65    p->aScan = aNe
4720: 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  w;.  }.}.#endif.
4730: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4740: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4750: 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P1 operand for a
4760: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
4770: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
4780: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
4790: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
47a0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
47b0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
47c0: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
47d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
47e0: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
47f0: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
4800: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
4810: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
4820: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4830: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
4840: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
4850: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
4860: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
4870: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
4880: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
4890: 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20  ddr].p1 = val;. 
48a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
48b0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
48c0: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66  the P2 operand f
48d0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
48e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
48f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4900: 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67  eful for setting
4910: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
4920: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4930: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
4940: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
4950: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
4960: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4970: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
4980: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
4990: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
49a0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
49b0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
49c0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
49d0: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
49e0: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
49f0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4a00: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
4a10: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
4a20: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
4a30: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
4a40: 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70  if( ((u32)p->nOp
4a50: 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  )>addr ){.    p-
4a60: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20  >aOp[addr].p3 = 
4a70: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
4a80: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
4a90: 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65  ue of the P5 ope
4aa0: 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73  rand for the mos
4ab0: 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64  t recently.** ad
4ac0: 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ded operation..*
4ad0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4ae0: 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20  beChangeP5(Vdbe 
4af0: 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61  *p, u8 val){.  a
4b00: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4b10: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
4b20: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
4b30: 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  p>0 );.    p->aO
4b40: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d  p[p->nOp-1].p5 =
4b50: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
4b60: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32  ** Change the P2
4b70: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
4b80: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
4b90: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
4ba0: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
4bb0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
4bc0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
4bd0: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
4be0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4bf0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
4c00: 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ddr){.  sqlite3V
4c10: 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61  dbeChangeP2(p, a
4c20: 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  ddr, p->nOp);.  
4c30: 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65  p->pParse->iFixe
4c40: 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  dOp = p->nOp - 1
4c50: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
4c60: 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66  he input FuncDef
4c70: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70   structure is ep
4c80: 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72  hemeral, then fr
4c90: 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68  ee it.  If.** th
4ca0: 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74  e FuncDef is not
4cb0: 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20   ephermal, then 
4cc0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73  do nothing..*/.s
4cd0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45  tatic void freeE
4ce0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
4cf0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
4d00: 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20  ncDef *pDef){.  
4d10: 69 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29  if( ALWAYS(pDef)
4d20: 20 26 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46   && (pDef->funcF
4d30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
4d40: 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a  NC_EPHEM)!=0 ){.
4d50: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4d60: 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d  e(db, pDef);.  }
4d70: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
4d80: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
4d90: 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c  sqlite3 *, Op *,
4da0: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65   int);../*.** De
4db0: 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20  lete a P4 value 
4dc0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
4dd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
4de0: 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eP4(sqlite3 *db,
4df0: 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69   int p4type, voi
4e00: 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34  d *p4){.  if( p4
4e10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4e20: 64 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68  db );.    switch
4e30: 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ( p4type ){.    
4e40: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a    case P4_REAL:.
4e50: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
4e60: 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20  T64:.      case 
4e70: 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20  P4_DYNAMIC:.    
4e80: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
4e90: 41 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  AY: {.        sq
4ea0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4eb0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4ec0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4ed0: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
4ee0: 4f 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  O: {.        if(
4ef0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4f00: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65  d==0 ) sqlite3Ke
4f10: 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49  yInfoUnref((KeyI
4f20: 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  nfo*)p4);.      
4f30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4f40: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
4f50: 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20  PRINTF: {.      
4f60: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4f70: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
4f80: 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20  te3_free(p4);.  
4f90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4fa0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4fb0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
4fc0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
4fd0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
4fe0: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
4ff0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5000: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5010: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
5020: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
5030: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
5040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5050: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
5060: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
5070: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5080: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
5090: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
50a0: 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c      if( p->szMal
50b0: 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46  loc ) sqlite3DbF
50c0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
50d0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  oc);.          s
50e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
50f0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
5100: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5110: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5120: 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20   P4_VTAB : {.   
5130: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
5140: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
5150: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
5160: 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a  ((VTable *)p4);.
5170: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5180: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
51a0: 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
51b0: 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61  ed for aOp and a
51c0: 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c  ny p4 values all
51d0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a  ocated for the.*
51e0: 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69  * opcodes contai
51f0: 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61  ned within. If a
5200: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69  Op is not NULL i
5210: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
5220: 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20  contain .** nOp 
5230: 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61  entries. .*/.sta
5240: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
5250: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
5260: 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69   *db, Op *aOp, i
5270: 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61  nt nOp){.  if( a
5280: 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  Op ){.    Op *pO
5290: 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61  p;.    for(pOp=a
52a0: 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70  Op; pOp<&aOp[nOp
52b0: 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  ]; pOp++){.     
52c0: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
52d0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
52e0: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  .p);.#ifdef SQLI
52f0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
5300: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
5310: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5320: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
5330: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
5340: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
5350: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70  e3DbFree(db, aOp
5360: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b  );.}../*.** Link
5370: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20   the SubProgram 
5380: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
5390: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
53a0: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ment into the li
53b0: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20  nked.** list at 
53c0: 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d  Vdbe.pSubProgram
53d0: 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75  . This list is u
53e0: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c  sed to delete al
53f0: 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a  l sub-program.**
5400: 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68   objects when th
5410: 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e VM is no longe
5420: 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76  r required..*/.v
5430: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
5440: 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64  inkSubProgram(Vd
5450: 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72  be *pVdbe, SubPr
5460: 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e  ogram *p){.  p->
5470: 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70  pNext = pVdbe->p
5480: 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65  Program;.  pVdbe
5490: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a  ->pProgram = p;.
54a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
54b0: 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64  the opcode at ad
54c0: 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a  dr into OP_Noop.
54d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
54e0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
54f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
5500: 72 29 7b 0a 20 20 69 66 28 20 61 64 64 72 3c 70  r){.  if( addr<p
5510: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->nOp ){.    Vdb
5520: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
5530: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
5540: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
5550: 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62  b;.    freeP4(db
5560: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
5570: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d  Op->p4.p);.    m
5580: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69  emset(pOp, 0, si
5590: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20  zeof(pOp[0]));. 
55a0: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
55b0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66   OP_Noop;.    if
55c0: 28 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31  ( addr==p->nOp-1
55d0: 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d   ) p->nOp--;.  }
55e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
55f0: 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20   last opcode is 
5600: 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e  "op" and it is n
5610: 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ot a jump destin
5620: 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72  ation,.** then r
5630: 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72  emove it.  Retur
5640: 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e  n true if and on
5650: 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20  ly if an opcode 
5660: 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  was removed..*/.
5670: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 44  int sqlite3VdbeD
5680: 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65  eletePriorOpcode
5690: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29  (Vdbe *p, u8 op)
56a0: 7b 0a 20 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d  {.  if( (p->nOp-
56b0: 31 29 3e 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69  1)>(p->pParse->i
56c0: 46 69 78 65 64 4f 70 29 20 26 26 20 70 2d 3e 61  FixedOp) && p->a
56d0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63  Op[p->nOp-1].opc
56e0: 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73  ode==op ){.    s
56f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5700: 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70  ToNoop(p, p->nOp
5710: 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  -1);.    return 
5720: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
5730: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
5740: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5750: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
5760: 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  4 operand for a 
5770: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
5780: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
5790: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
57a0: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
57b0: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
57c0: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
57d0: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
57e0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
57f0: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
5800: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
5810: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
5820: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  he program..**.*
5830: 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74  * If n>=0 then t
5840: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73  he P4 operand is
5850: 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e   dynamic, meanin
5860: 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66  g that a copy of
5870: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
5880: 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f  s made into memo
5890: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
58a0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
58b0: 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66  )..** A value of
58c0: 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79   n==0 means copy
58d0: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70   bytes of zP4 up
58e0: 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e   to and includin
58f0: 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e  g the.** first n
5900: 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e  ull byte.  If n>
5910: 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20  0 then copy n+1 
5920: 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a  bytes of zP4..**
5930: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
5940: 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49  s of n (P4_STATI
5950: 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P4_COLLSEQ et
5960: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
5970: 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP4 points.** 
5980: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
5990: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
59a0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
59b0: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
59c0: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
59d0: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
59e0: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
59f0: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
5a00: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
5a10: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
5a20: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
5a30: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
5a40: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
5a50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5a60: 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70  ChangeP4(Vdbe *p
5a70: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
5a80: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74  t char *zP4, int
5a90: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
5aa0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
5ab0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
5ac0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
5ad0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
5ae0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
5af0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  IT );.  if( p->a
5b00: 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op==0 || db->mal
5b10: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
5b20: 20 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20   if( n!=P4_VTAB 
5b30: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28  ){.      freeP4(
5b40: 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  db, n, (void*)*(
5b50: 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20  char**)&zP4);.  
5b60: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
5b70: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
5b80: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
5b90: 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20  rt( addr<p->nOp 
5ba0: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
5bb0: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
5bc0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
5bd0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
5be0: 64 72 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dr];.  assert( p
5bf0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e  Op->p4type==P4_N
5c00: 4f 54 55 53 45 44 0a 20 20 20 20 20 20 20 7c 7c  OTUSED.       ||
5c10: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
5c20: 5f 49 4e 54 33 32 0a 20 20 20 20 20 20 20 7c 7c  _INT32.       ||
5c30: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
5c40: 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72  _KEYINFO );.  fr
5c50: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
5c60: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
5c70: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
5c80: 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49  0;.  if( n==P4_I
5c90: 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  NT32 ){.    /* N
5ca0: 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69  ote: this cast i
5cb0: 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20  s safe, because 
5cc0: 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20  the origin data 
5cd0: 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74  point was an int
5ce0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73  .    ** that was
5cf0: 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73   cast to a (cons
5d00: 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20  t char *). */.  
5d10: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51    pOp->p4.i = SQ
5d20: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
5d30: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
5d40: 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32  4type = P4_INT32
5d50: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50  ;.  }else if( zP
5d60: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d  4==0 ){.    pOp-
5d70: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
5d80: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5d90: 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65  NOTUSED;.  }else
5da0: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
5db0: 46 4f 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  FO ){.    pOp->p
5dc0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
5dd0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5de0: 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a  e = P4_KEYINFO;.
5df0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
5e00: 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f  4_VTAB ){.    pO
5e10: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
5e20: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5e30: 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b  4type = P4_VTAB;
5e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
5e50: 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a  Lock((VTable *)z
5e60: 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  P4);.    assert(
5e70: 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29   ((VTable *)zP4)
5e80: 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20  ->db==p->db );. 
5e90: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29   }else if( n<0 )
5ea0: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5eb0: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
5ec0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5ed0: 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a  (signed char)n;.
5ee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
5ef0: 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69   n==0 ) n = sqli
5f00: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29  te3Strlen30(zP4)
5f10: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ;.    pOp->p4.z 
5f20: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
5f30: 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e  up(p->db, zP4, n
5f40: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
5f50: 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b  pe = P4_DYNAMIC;
5f60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
5f70: 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20  t the P4 on the 
5f80: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
5f90: 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  ded opcode to th
5fa0: 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68  e KeyInfo for th
5fb0: 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e  e.** index given
5fc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5fd0: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
5fe0: 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
5ff0: 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
6000: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
6010: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
6020: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73  rt( v!=0 );.  as
6030: 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
6040: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
6050: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
6060: 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
6070: 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
6080: 65 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20  e, pIdx),.      
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a  P4_KEYINFO);.}..
60b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
60c0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
60d0: 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  MENTS./*.** Chan
60e0: 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ge the comment o
60f0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
6100: 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  tly coded instru
6110: 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e  ction.  Or.** in
6120: 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64  sert a No-op and
6130: 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74   add the comment
6140: 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73   to that new ins
6150: 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a  truction.  This.
6160: 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64  ** makes the cod
6170: 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64  e easier to read
6180: 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e   during debuggin
6190: 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73  g.  None of this
61a0: 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61   happens.** in a
61b0: 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c   production buil
61c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
61d0: 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56  d vdbeVComment(V
61e0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
61f0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f  ar *zFormat, va_
6200: 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65  list ap){.  asse
6210: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
6220: 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61  p->aOp==0 );.  a
6230: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30  ssert( p->aOp==0
6240: 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   || p->aOp[p->nO
6250: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30  p-1].zComment==0
6260: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
6270: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
6280: 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61   p->nOp ){.    a
6290: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b  ssert( p->aOp );
62a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
62b0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70  ee(p->db, p->aOp
62c0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
62d0: 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  ent);.    p->aOp
62e0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
62f0: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  ent = sqlite3VMP
6300: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f  rintf(p->db, zFo
6310: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d  rmat, ap);.  }.}
6320: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6330: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
6340: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
6350: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
6360: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
6370: 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61   p ){.    va_sta
6380: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
6390: 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e  .    vdbeVCommen
63a0: 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  t(p, zFormat, ap
63b0: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
63c0: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
63d0: 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d  lite3VdbeNoopCom
63e0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
63f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
6400: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
6410: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
6420: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6430: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f  eAddOp0(p, OP_No
6440: 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  op);.    va_star
6450: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
6460: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
6470: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
6480: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
6490: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20  ;.  }.}.#endif  
64a0: 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  /* NDEBUG */..#i
64b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
64c0: 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20  _COVERAGE./*.** 
64d0: 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66  Set the value if
64e0: 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69   the iSrcLine fi
64f0: 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76  eld for the prev
6500: 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73  iously coded ins
6510: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
6520: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
6530: 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20  LineNumber(Vdbe 
6540: 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a  *v, int iLine){.
6550: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
6560: 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69  Op(v,-1)->iSrcLi
6570: 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65  ne = iLine;.}.#e
6580: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56  ndif /* SQLITE_V
6590: 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a  DBE_COVERAGE */.
65a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
65b0: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67  e opcode for a g
65c0: 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49  iven address.  I
65d0: 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73  f the address is
65e0: 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74   -1, then.** ret
65f0: 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
6600: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f  ently inserted o
6610: 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pcode..**.** If 
6620: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
6630: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
6640: 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20  curred prior to 
6650: 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74  the calling of t
6660: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  his.** routine, 
6670: 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
6680: 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70  o a dummy VdbeOp
6690: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
66a0: 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a  d.  That opcode.
66b0: 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62  ** is readable b
66c0: 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c  ut not writable,
66d0: 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61   though it is ca
66e0: 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65  st to a writable
66f0: 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72   value..** The r
6700: 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79  eturn of a dummy
6710: 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74   opcode allows t
6720: 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69  he call to conti
6730: 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a  nue functioning.
6740: 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20  ** after an OOM 
6750: 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61  fault without ha
6760: 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f  ving to check to
6770: 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75   see if the retu
6780: 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73  rn from .** this
6790: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61   routine is a va
67a0: 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75  lid pointer.  Bu
67b0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75  t because the du
67c0: 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c  mmy.opcode is 0,
67d0: 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e  .** dummy will n
67e0: 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20  ever be written 
67f0: 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72  to.  This is ver
6800: 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ified by code in
6810: 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  spection and.** 
6820: 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20  by running with 
6830: 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62  Valgrind..*/.Vdb
6840: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6850: 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  GetOp(Vdbe *p, i
6860: 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43  nt addr){.  /* C
6870: 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61  89 specifies tha
6880: 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22  t the constant "
6890: 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69  dummy" will be i
68a0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
68b0: 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68  l.  ** zeros, wh
68c0: 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20  ich is correct. 
68d0: 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20   MSVC generates 
68e0: 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72  a warning, never
68f0: 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74  theless. */.  st
6900: 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d  atic VdbeOp dumm
6910: 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  y;  /* Ignore th
6920: 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61  e MSVC warning a
6930: 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69  bout no initiali
6940: 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  zer */.  assert(
6950: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
6960: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
6970: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
6980: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
6990: 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  - 1;.  }.  asser
69a0: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
69b0: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
69c0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
69d0: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  ed );.  if( p->d
69e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
69f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56  ){.    return (V
6a00: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20  dbeOp*)&dummy;. 
6a10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6a20: 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  rn &p->aOp[addr]
6a30: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66  ;.  }.}..#if def
6a40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
6a50: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
6a60: 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  NTS)./*.** Retur
6a70: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  n an integer val
6a80: 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ue for one of th
6a90: 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  e parameters to 
6aa0: 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a  the opcode pOp.*
6ab0: 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
6ac0: 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a  character c..*/.
6ad0: 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73  static int trans
6ae0: 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f  lateP(char c, co
6af0: 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  nst Op *pOp){.  
6b00: 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74  if( c=='1' ) ret
6b10: 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69  urn pOp->p1;.  i
6b20: 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75  f( c=='2' ) retu
6b30: 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66  rn pOp->p2;.  if
6b40: 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72  ( c=='3' ) retur
6b50: 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28  n pOp->p3;.  if(
6b60: 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e   c=='4' ) return
6b70: 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65   pOp->p4.i;.  re
6b80: 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a  turn pOp->p5;.}.
6b90: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
6ba0: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
6bb0: 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20  "comment" field 
6bc0: 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65  of a VDBE opcode
6bd0: 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   listing..**.** 
6be0: 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69  The Synopsis: fi
6bf0: 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20  eld in comments 
6c00: 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f  in the vdbe.c so
6c10: 75 72 63 65 20 66 69 6c 65 20 67 65 74 73 20 63  urce file gets c
6c20: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61  onverted.** to a
6c30: 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67 20 74  n extra string t
6c40: 68 61 74 20 69 73 20 61 70 70 65 6e 64 65 64 20  hat is appended 
6c50: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70  to the sqlite3Op
6c60: 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20  codeName().  In 
6c70: 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f  the.** absence o
6c80: 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73  f other comments
6c90: 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20  , this synopsis 
6ca0: 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d  becomes the comm
6cb0: 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64  ent on the opcod
6cc0: 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73  e..** Some trans
6cd0: 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a  lation occurs:.*
6ce0: 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20  *.**       "PX" 
6cf0: 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a       ->  "r[X]".
6d00: 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 22  **       "PX@PY"
6d10: 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59     ->  "r[X..X+Y
6d20: 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20  -1]"  or "r[x]" 
6d30: 69 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a  if y is 0 or 1.*
6d40: 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 2b 31  *       "PX@PY+1
6d50: 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d  " ->  "r[X..X+Y]
6d60: 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69  "    or "r[x]" i
6d70: 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20  f y is 0.**     
6d80: 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20    "PY..PY"  ->  
6d90: 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f  "r[X..Y]"      o
6da0: 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78  r "r[x]" if y<=x
6db0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6dc0: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20  isplayComment(. 
6dd0: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20   const Op *pOp, 
6de0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
6df0: 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65  e to be commente
6e00: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
6e10: 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65  r *zP4,   /* Pre
6e20: 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64  viously obtained
6e30: 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f   value for P4 */
6e40: 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  .  char *zTemp, 
6e50: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
6e60: 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20  esult here */.  
6e70: 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20  int nTemp       
6e80: 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69     /* Space avai
6e90: 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d  lable in zTemp[]
6ea0: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
6eb0: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20  har *zOpName;.  
6ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e  const char *zSyn
6ed0: 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70  opsis;.  int nOp
6ee0: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20  Name;.  int ii, 
6ef0: 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  jj;.  zOpName = 
6f00: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
6f10: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a  e(pOp->opcode);.
6f20: 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    nOpName = sqli
6f30: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e  te3Strlen30(zOpN
6f40: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e  ame);.  if( zOpN
6f50: 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29  ame[nOpName+1] )
6f60: 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f  {.    int seenCo
6f70: 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  m = 0;.    char 
6f80: 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73  c;.    zSynopsis
6f90: 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f   = zOpName += nO
6fa0: 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66  pName + 1;.    f
6fb0: 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e  or(ii=jj=0; jj<n
6fc0: 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a  Temp-1 && (c = z
6fd0: 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30  Synopsis[ii])!=0
6fe0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
6ff0: 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20  f( c=='P' ){.   
7000: 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73       c = zSynops
7010: 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20  is[++ii];.      
7020: 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a    if( c=='4' ){.
7030: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7040: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7050: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
7060: 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20  %s", zP4);.     
7070: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
7080: 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'X' ){.         
7090: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
70a0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
70b0: 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  p+jj, "%s", pOp-
70c0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
70d0: 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20        seenCom = 
70e0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
70f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
7100: 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28  v1 = translateP(
7110: 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  c, pOp);.       
7120: 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20     int v2;.     
7130: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7140: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7150: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20  zTemp+jj, "%d", 
7160: 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  v1);.          i
7170: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
7180: 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c  psis+ii+1, "@P",
7190: 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   2)==0 ){.      
71a0: 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20        ii += 3;. 
71b0: 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d             jj +=
71c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
71d0: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
71e0: 20 20 20 20 20 20 20 20 76 32 20 3d 20 74 72 61          v2 = tra
71f0: 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69  nslateP(zSynopsi
7200: 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20  s[ii], pOp);.   
7210: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
7220: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
7230: 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29  i+1,"+1",2)==0 )
7240: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7250: 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  ii += 2;.       
7260: 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20         v2++;.   
7270: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7280: 20 20 20 20 20 20 20 69 66 28 20 76 32 3e 31 20         if( v2>1 
7290: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
72a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
72b0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
72c0: 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31  p+jj, "..%d", v1
72d0: 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  +v2-1);.        
72e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
72f0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
7300: 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31  p(zSynopsis+ii+1
7310: 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20  , "..P3", 4)==0 
7320: 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b  && pOp->p3==0 ){
7330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20  .            ii 
7340: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  += 4;.          
7350: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7360: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
7370: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
7380: 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  jj);.      }else
7390: 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  {.        zTemp[
73a0: 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20  jj++] = c;.     
73b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
73c0: 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c   !seenCom && jj<
73d0: 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e  nTemp-5 && pOp->
73e0: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
73f0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7400: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
7410: 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70  mp+jj, "; %s", p
7420: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
7430: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
7440: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
7450: 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  +jj);.    }.    
7460: 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a  if( jj<nTemp ) z
7470: 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20  Temp[jj] = 0;.  
7480: 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a  }else if( pOp->z
7490: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  Comment ){.    s
74a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
74b0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
74c0: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
74d0: 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c  t);.    jj = sql
74e0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
74f0: 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mp);.  }else{.  
7500: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
7510: 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a      jj = 0;.  }.
7520: 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23    return jj;.}.#
7530: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7540: 44 45 42 55 47 20 2a 2f 0a 0a 0a 23 69 66 20 21  DEBUG */...#if !
7550: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7560: 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20  MIT_EXPLAIN) || 
7570: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
7580: 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e   \.     || defin
7590: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
75a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
75b0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
75c0: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
75d0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
75e0: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
75f0: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
7600: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
7610: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
7620: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
7630: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
7640: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
7650: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
7660: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
7670: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
7680: 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28  zTemp;.  assert(
7690: 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20   nTemp>=20 );.  
76a0: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74  switch( pOp->p4t
76b0: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
76c0: 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20  P4_KEYINFO: {.  
76d0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
76e0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
76f0: 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
7700: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pKeyInfo;.      
7710: 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
7720: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
7730: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7740: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7750: 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64 22 2c 20   zTemp, "k(%d", 
7760: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
7770: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c  );.      i = sql
7780: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
7790: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
77a0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
77b0: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
77c0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
77d0: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
77e0: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
77f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7800: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  Coll = pColl ? p
7810: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e  Coll->zName : "n
7820: 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  il";.        int
7830: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
7840: 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20  en30(zColl);.   
7850: 20 20 20 20 20 69 66 28 20 6e 3d 3d 36 20 26 26       if( n==6 &&
7860: 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42   memcmp(zColl,"B
7870: 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20 29 7b 0a  INARY",6)==0 ){.
7880: 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20            zColl 
7890: 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20 20  = "B";.         
78a0: 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20   n = 1;.        
78b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 2b  }.        if( i+
78c0: 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  n>nTemp-6 ){.   
78d0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
78e0: 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34  Temp[i],",...",4
78f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
7900: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
7910: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
7920: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
7930: 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
7940: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20  ortOrder[j] ){. 
7950: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
7960: 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  ++] = '-';.     
7970: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
7980: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a  cpy(&zTemp[i], z
7990: 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20 20 20  Coll, n+1);.    
79a0: 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20      i += n;.    
79b0: 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b    }.      zTemp[
79c0: 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  i++] = ')';.    
79d0: 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a    zTemp[i] = 0;.
79e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
79f0: 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62  nTemp );.      b
7a00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7a10: 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a  case P4_COLLSEQ:
7a20: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
7a30: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70   *pColl = pOp->p
7a40: 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  4.pColl;.      s
7a50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7a60: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28  nTemp, zTemp, "(
7a70: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
7a80: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
7a90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7aa0: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
7ab0: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
7ac0: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
7ad0: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
7ae0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7af0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28  emp, zTemp, "%s(
7b00: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
7b10: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
7b20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7b30: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
7b40: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT64: {.      sq
7b50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7b60: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
7b70: 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  ld", *pOp->p4.pI
7b80: 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  64);.      break
7b90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7ba0: 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20   P4_INT32: {.   
7bb0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7bc0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7bd0: 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%d", pOp->p4.
7be0: 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  i);.      break;
7bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7c00: 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20  P4_REAL: {.     
7c10: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7c20: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7c30: 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70  "%.16g", *pOp->p
7c40: 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20  4.pReal);.      
7c50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7c60: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
7c70: 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
7c80: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a  = pOp->p4.pMem;.
7c90: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
7ca0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
7cb0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
7cc0: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
7cd0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
7ce0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
7cf0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7d00: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7d10: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
7d20: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
7d30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
7d40: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7d50: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
7d60: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7d70: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7d80: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e  %.16g", pMem->u.
7d90: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
7da0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
7db0: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
7dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7dd0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7de0: 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  emp, "NULL");.  
7df0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7e00: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
7e10: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
7e20: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
7e30: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
7e40: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7e50: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
7e60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7e70: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
7e80: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
7e90: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
7ea0: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
7eb0: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
7ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7ed0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7ee0: 6d 70 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70  mp, "vtab:%p", p
7ef0: 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65  Vtab);.      bre
7f00: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
7f10: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
7f20: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73  ARRAY: {.      s
7f30: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7f40: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69  nTemp, zTemp, "i
7f50: 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20  ntarray");.     
7f60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7f70: 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f    case P4_SUBPRO
7f80: 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71  GRAM: {.      sq
7f90: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7fa0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72  Temp, zTemp, "pr
7fb0: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62  ogram");.      b
7fc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7fd0: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a  case P4_ADVANCE:
7fe0: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   {.      zTemp[0
7ff0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
8000: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
8010: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a  fault: {.      z
8020: 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a  P4 = pOp->p4.z;.
8030: 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30        if( zP4==0
8040: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
8050: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20  = zTemp;.       
8060: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
8070: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8080: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
8090: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
80a0: 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  4;.}.#endif../*.
80b0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
80c0: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
80d0: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
80e0: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
80f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
8100: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
8110: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
8120: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
8130: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
8140: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
8150: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ses that will be
8160: 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66   use.  A mask of
8170: 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73   these databases
8180: 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  .** is maintaine
8190: 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  d in p->btreeMas
81a0: 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d  k.  The p->lockM
81b0: 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65  ask value is the
81c0: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d   subset of.** p-
81d0: 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61  >btreeMask of da
81e0: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
81f0: 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b  l require a lock
8200: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8210: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
8220: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
8230: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
8240: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26  & i<p->db->nDb &
8250: 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  & i<(int)sizeof(
8260: 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  yDbMask)*8 );.  
8270: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
8280: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
8290: 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73  sk)*8 );.  DbMas
82a0: 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  kSet(p->btreeMas
82b0: 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d  k, i);.  if( i!=
82c0: 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  1 && sqlite3Btre
82d0: 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d  eSharable(p->db-
82e0: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a  >aDb[i].pBt) ){.
82f0: 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d      DbMaskSet(p-
8300: 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20  >lockMask, i);. 
8310: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
8320: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
8330: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
8340: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
8350: 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  E>0./*.** If SQL
8360: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ite is compiled 
8370: 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  to support share
8380: 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64  d-cache mode and
8390: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
83a0: 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  e,.** this routi
83b0: 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d  ne obtains the m
83c0: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
83d0: 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72  with each BtShar
83e0: 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ed structure.** 
83f0: 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65  that may be acce
8400: 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ssed by the VM p
8410: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
8420: 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73  ment. In doing s
8430: 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74  o it also.** set
8440: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  s the BtShared.d
8450: 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68  b member of each
8460: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
8470: 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73   structures, ens
8480: 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68  uring.** that th
8490: 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68  e correct busy-h
84a0: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
84b0: 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65  is invoked if re
84c0: 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  quired..**.** If
84d0: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
84e0: 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f  hreadsafe but do
84f0: 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  es support share
8500: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
8510: 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  en.** sqlite3Btr
8520: 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76  eeEnter() is inv
8530: 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  oked to set the 
8540: 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69  BtShared.db vari
8550: 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ables.** of all 
8560: 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75  of BtShared stru
8570: 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c  ctures accessibl
8580: 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61  e via the databa
8590: 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73  se handle .** as
85a0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
85b0: 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  e VM..**.** If S
85c0: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
85d0: 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73  eadsafe and does
85e0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61   not support sha
85f0: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
8600: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
8610: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
8620: 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d  ** The p->btreeM
8630: 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62  ask field is a b
8640: 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74  itmask of all bt
8650: 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72  rees that the pr
8660: 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65  epared .** state
8670: 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72  ment p will ever
8680: 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20   use.  Let N be 
8690: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  the number of bi
86a0: 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61  ts in p->btreeMa
86b0: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  sk.** correspond
86c0: 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68  ing to btrees th
86d0: 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61  at use shared ca
86e0: 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72  che.  Then the r
86f0: 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69  untime of.** thi
8700: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e  s routine is N*N
8710: 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72  .  But as N is r
8720: 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20  arely more than 
8730: 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  1, this should n
8740: 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c  ot.** be a probl
8750: 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
8760: 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62  te3VdbeEnter(Vdb
8770: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
8780: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
8790: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
87a0: 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73  nDb;.  if( DbMas
87b0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b  kAllZero(p->lock
87c0: 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20  Mask) ) return; 
87d0: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
87e0: 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d  ase */.  db = p-
87f0: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d  >db;.  aDb = db-
8800: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62  >aDb;.  nDb = db
8810: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30  ->nDb;.  for(i=0
8820: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  ; i<nDb; i++){. 
8830: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44     if( i!=1 && D
8840: 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63  bMaskTest(p->loc
8850: 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41  kMask,i) && ALWA
8860: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
8870: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
8880: 65 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62  e3BtreeEnter(aDb
8890: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
88a0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
88b0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
88c0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
88d0: 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  CHE) && SQLITE_T
88e0: 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a  HREADSAFE>0./*.*
88f0: 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20  * Unlock all of 
8900: 74 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69  the btrees previ
8910: 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20  ously locked by 
8920: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
8930: 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f  3VdbeEnter()..*/
8940: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8950: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b  eLeave(Vdbe *p){
8960: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
8970: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61  te3 *db;.  Db *a
8980: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20  Db;.  int nDb;. 
8990: 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65   if( DbMaskAllZe
89a0: 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20  ro(p->lockMask) 
89b0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
89c0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
89d0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
89e0: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
89f0: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
8a00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44  .  for(i=0; i<nD
8a10: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
8a20: 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54   i!=1 && DbMaskT
8a30: 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  est(p->lockMask,
8a40: 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  i) && ALWAYS(aDb
8a50: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
8a60: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
8a70: 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42  eLeave(aDb[i].pB
8a80: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
8a90: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
8aa0: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
8ab0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
8ac0: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
8ad0: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
8ae0: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
8af0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
8b00: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
8b10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8b20: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c  3VdbePrintOp(FIL
8b30: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c  E *pOut, int pc,
8b40: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61   Op *pOp){.  cha
8b50: 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a  r *zP4;.  char z
8b60: 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20  Ptr[50];.  char 
8b70: 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61  zCom[100];.  sta
8b80: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
8b90: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
8ba0: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
8bb0: 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c  d %-13s %.2X %s\
8bc0: 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d  n";.  if( pOut==
8bd0: 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75  0 ) pOut = stdou
8be0: 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  t;.  zP4 = displ
8bf0: 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20  ayP4(pOp, zPtr, 
8c00: 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23  sizeof(zPtr));.#
8c10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8c20: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
8c30: 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f  ENTS.  displayCo
8c40: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
8c50: 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f  zCom, sizeof(zCo
8c60: 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f  m));.#else.  zCo
8c70: 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  m[0] = 0;.#endif
8c80: 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73  .  /* NB:  The s
8c90: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
8ca0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  () function is i
8cb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f  mplemented by co
8cc0: 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20  de created.  ** 
8cd0: 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  by the mkopcodeh
8ce0: 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64  .awk and mkopcod
8cf0: 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77  ec.awk scripts w
8d00: 68 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65  hich extract the
8d10: 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  .  ** informatio
8d20: 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e  n from the vdbe.
8d30: 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f  c source text */
8d40: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
8d50: 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a   zFormat1, pc, .
8d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63        sqlite3Opc
8d70: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
8d80: 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode), pOp->p1, p
8d90: 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p2, pOp->p3,
8da0: 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20   zP4, pOp->p5,. 
8db0: 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20       zCom.  );. 
8dc0: 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d   fflush(pOut);.}
8dd0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
8de0: 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20  elease an array 
8df0: 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74  of N Mem element
8e00: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
8e10: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
8e20: 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  (Mem *p, int N){
8e30: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
8e40: 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d  .    Mem *pEnd =
8e50: 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69   &p[N];.    sqli
8e60: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
8e70: 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66  .    u8 malloc_f
8e80: 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
8e90: 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66  ocFailed;.    if
8ea0: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
8eb0: 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a  ed ){.      do{.
8ec0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73          if( p->s
8ed0: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
8ee0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
8ef0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d  Malloc);.      }
8f00: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
8f10: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
8f20: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  n;.    }.    do{
8f30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
8f40: 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20  &p[1])==pEnd || 
8f50: 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62  p[0].db==p[1].db
8f60: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
8f70: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
8f80: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
8f90: 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  p) );..      /* 
8fa0: 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65  This block is re
8fb0: 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20  ally an inlined 
8fc0: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
8fd0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
8fe0: 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ().      ** that
8ff0: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
9000: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
9010: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t the memory cel
9020: 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20  l value is .    
9030: 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74    ** being set t
9040: 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c  o NULL after rel
9050: 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d  easing any dynam
9060: 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ic resources..  
9070: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
9080: 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f  The justificatio
9090: 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e  n for duplicatin
90a0: 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61  g code is that a
90b0: 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20  ccording to .   
90c0: 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c     ** callgrind,
90d0: 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63   this causes a c
90e0: 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65  ertain test case
90f0: 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20   to hit the CPU 
9100: 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65  4.7 .      ** pe
9110: 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20  rcent less (x86 
9120: 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69  linux, gcc versi
9130: 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74  on 4.1.2, -O6) t
9140: 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a  han if .      **
9150: 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61   sqlite3MemRelea
9160: 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64  se() were called
9170: 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68   from here. With
9180: 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73   -O2, this jumps
9190: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36  .      ** to 6.6
91a0: 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65   percent. The te
91b0: 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72  st case is inser
91c0: 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69  ting 1000 rows i
91d0: 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20  nto a table .   
91e0: 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e     ** with no in
91f0: 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69  dexes using a si
9200: 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e  ngle prepared IN
9210: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  SERT statement, 
9220: 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a  bind() .      **
9230: 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e   and reset(). In
9240: 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65  serts are groupe
9250: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63  d into a transac
9260: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
9270: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
9280: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67  ->flags & MEM_Ag
9290: 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  g );.      testc
92a0: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
92b0: 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20  MEM_Dyn );.     
92c0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
92d0: 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20  ags & MEM_Frame 
92e0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
92f0: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
9300: 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20  M_RowSet );.    
9310: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
9320: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
9330: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
9340: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
9350: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
9360: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
9370: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a   }else if( p->sz
9380: 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  Malloc ){.      
9390: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
93a0: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
93b0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61  .        p->szMa
93c0: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  lloc = 0;.      
93d0: 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67  }..      p->flag
93e0: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
93f0: 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  d;.    }while( (
9400: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
9410: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9420: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
9430: 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d;.  }.}../*.** 
9440: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
9450: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
9460: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
9470: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
9480: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
9490: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
94a0: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
94b0: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
94c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
94d0: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
94e0: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
94f0: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
9500: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
9510: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
9520: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
9530: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
9540: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
9550: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
9560: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
9570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
9580: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
9590: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
95a0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
95b0: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
95c0: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Mem);.  sqlite3D
95d0: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
95e0: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
95f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
9600: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
9610: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
9620: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
9630: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
9640: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
9650: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
9660: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
9670: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
9680: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
9690: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
96a0: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
96b0: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
96c0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
96d0: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
96e0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
96f0: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
9700: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
9710: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
9720: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
9730: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
9740: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
9750: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
9760: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
9770: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
9780: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
9790: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
97a0: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
97b0: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
97c0: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
97d0: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a  QUERY PLAN..**.*
97e0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
97f0: 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20  n==1, first the 
9800: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20  main program is 
9810: 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63  listed, then eac
9820: 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67  h of.** the trig
9830: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
9840: 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62  are listed one b
9850: 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y one..*/.int sq
9860: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
9870: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
9880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9890: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69  e VDBE */.){.  i
98a0: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e      /* Stop when
98d0: 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68   row count reach
98e0: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74  es this */.  int
98f0: 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20   nSub = 0;      
9900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9910: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
9920: 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f  ub-vdbes seen so
9930: 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f   far */.  SubPro
9940: 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30  gram **apSub = 0
9950: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
9960: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76  * Array of sub-v
9970: 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  dbes */.  Mem *p
9980: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
99a0: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f  * Memory cell ho
99b0: 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  ld array of subp
99c0: 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rogs */.  sqlite
99d0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20  3 *db = p->db;  
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
99f0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
9a00: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
9a10: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
9a40: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
9a50: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a70: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
9a80: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
9a90: 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20  ->aMem[1];      
9aa0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
9ab0: 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65  Mem of result se
9ac0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
9ad0: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
9ae0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
9af0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
9b00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9b10: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
9b20: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
9b30: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
9b40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
9b50: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
9b60: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
9b70: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
9b80: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
9b90: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
9ba0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
9bb0: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
9bc0: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
9bd0: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
9be0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
9bf0: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
9c00: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
9c10: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
9c20: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
9c30: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
9c40: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
9c50: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
9c60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
9c70: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
9c80: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
9c90: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
9ca0: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
9cb0: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
9cc0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
9cd0: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
9ce0: 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61  .  */.    db->ma
9cf0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
9d00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9d10: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
9d20: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
9d30: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
9d40: 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20  s reaches nRow, 
9d50: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20  that means the. 
9d60: 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20   ** listing has 
9d70: 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c  finished and sql
9d80: 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75  ite3_step() shou
9d90: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
9da0: 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77  _DONE..  ** nRow
9db0: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
9dc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
9dd0: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  s in the main pr
9de0: 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a  ogram, plus.  **
9df0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
9e00: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
9e10: 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75  n all trigger su
9e20: 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e  bprograms encoun
9e30: 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61  tered.  ** so fa
9e40: 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  r.  The nRow val
9e50: 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ue will increase
9e60: 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20   as new trigger 
9e70: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a  subprograms are.
9e80: 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64    ** encountered
9e90: 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c  , but p->pc will
9ea0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63   eventually catc
9eb0: 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20  h up to nRow..  
9ec0: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e  */.  nRow = p->n
9ed0: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  Op;.  if( p->exp
9ee0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  lain==1 ){.    /
9ef0: 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65  * The first 8 me
9f00: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75  mory cells are u
9f10: 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75  sed for the resu
9f20: 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77  lt set.  So we w
9f30: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  ill.    ** comma
9f40: 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65  ndeer the 9th ce
9f50: 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f  ll to use as sto
9f60: 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61  rage for an arra
9f70: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20  y of pointers.  
9f80: 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20    ** to trigger 
9f90: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68  subprograms.  Th
9fa0: 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e  e VDBE is guaran
9fb0: 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20  teed to have at 
9fc0: 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63  least 9.    ** c
9fd0: 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ells.  */.    as
9fe0: 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20  sert( p->nMem>9 
9ff0: 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70  );.    pSub = &p
a000: 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69  ->aMem[9];.    i
a010: 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d  f( pSub->flags&M
a020: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
a030: 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74   /* On the first
a040: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
a050: 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69  _step(), pSub wi
a060: 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20  ll hold a NULL. 
a070: 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   It is.      ** 
a080: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
a090: 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f   BLOB by the P4_
a0a0: 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65  SUBPROGRAM proce
a0b0: 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f  ssing logic belo
a0c0: 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20  w */.      nSub 
a0d0: 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66  = pSub->n/sizeof
a0e0: 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61  (Vdbe*);.      a
a0f0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
a100: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
a110: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
a120: 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a  ; i<nSub; i++){.
a130: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70        nRow += ap
a140: 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[i]->nOp;.   
a150: 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
a160: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
a170: 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20   }while( i<nRow 
a180: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
a190: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
a1a0: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
a1b0: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f   );.  if( i>=nRo
a1c0: 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  w ){.    p->rc =
a1d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
a1e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
a1f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
a200: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
a210: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
a220: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
a230: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
a240: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
a250: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
a260: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
a270: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
a280: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20  rStr(p->rc));.  
a290: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
a2a0: 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f  *zP4;.    Op *pO
a2b0: 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e  p;.    if( i<p->
a2c0: 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nOp ){.      /* 
a2d0: 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20  The output line 
a2e0: 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20  number is small 
a2f0: 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61  enough that we a
a300: 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a  re still in the.
a310: 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72        ** main pr
a320: 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  ogram. */.      
a330: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
a340: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a350: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72     /* We are cur
a360: 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73  rently listing s
a370: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67  ubprograms.  Fig
a380: 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e  ure out which on
a390: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70  e and.      ** p
a3a0: 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f  ick up the appro
a3b0: 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a  priate opcode. *
a3c0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  /.      int j;. 
a3d0: 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70       i -= p->nOp
a3e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
a3f0: 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   i>=apSub[j]->nO
a400: 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; j++){.       
a410: 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e   i -= apSub[j]->
a420: 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nOp;.      }.   
a430: 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b     pOp = &apSub[
a440: 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  j]->aOp[i];.    
a450: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  }.    if( p->exp
a460: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
a470: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a480: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
a490: 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20  em->u.i = i;    
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a4c0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
a4d0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  /.      pMem++;.
a4e0: 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66    .      pMem->f
a4f0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69  lags = MEM_Stati
a500: 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  c|MEM_Str|MEM_Te
a510: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
a520: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
a530: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
a540: 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70  ->opcode); /* Op
a550: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  code */.      as
a560: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
a570: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
a580: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
a590: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
a5a0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
a5b0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
a5c0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
a5d0: 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f    /* When an OP_
a5e0: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
a5f0: 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65  s encounter (the
a600: 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61   only opcode tha
a610: 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61  t has.      ** a
a620: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61   P4_SUBPROGRAM a
a630: 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64  rgument), expand
a640: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
a650: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
a660: 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b  grams.      ** k
a670: 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39  ept in p->aMem[9
a680: 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ].z to hold the 
a690: 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73  new program - as
a6a0: 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70  suming this subp
a6b0: 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20  rogram.      ** 
a6c0: 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
a6d0: 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20  been seen..     
a6e0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f   */.      if( pO
a6f0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  p->p4type==P4_SU
a700: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
a710: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
a720: 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  (nSub+1)*sizeof(
a730: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
a740: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
a750: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
a760: 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nSub; j++){.    
a770: 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b        if( apSub[
a780: 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  j]==pOp->p4.pPro
a790: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
a7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a7b0: 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53  if( j==nSub && S
a7c0: 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65  QLITE_OK==sqlite
a7d0: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75  3VdbeMemGrow(pSu
a7e0: 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d  b, nByte, nSub!=
a7f0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
a800: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
a810: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
a820: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b            apSub[
a830: 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70  nSub++] = pOp->p
a840: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
a850: 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67        pSub->flag
a860: 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20  s |= MEM_Blob;. 
a870: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e           pSub->n
a880: 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53   = nSub*sizeof(S
a890: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
a8a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a8b0: 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e     }..    pMem->
a8c0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
a8d0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
a8e0: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a900: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
a910: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
a920: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
a930: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
a940: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a960: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
a970: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
a980: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a990: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
a9a0: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
a9d0: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
a9e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
a9f0: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
aa00: 69 7a 65 28 70 4d 65 6d 2c 20 33 32 29 20 29 7b  ize(pMem, 32) ){
aa10: 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20   /* P4 */.      
aa20: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
aa30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
aa40: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
aa50: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
aa60: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
aa70: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
aa80: 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69  rm;.    zP4 = di
aa90: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65  splayP4(pOp, pMe
aaa0: 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69  m->z, 32);.    i
aab0: 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20  f( zP4!=pMem->z 
aac0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
aad0: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d  VdbeMemSetStr(pM
aae0: 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c  em, zP4, -1, SQL
aaf0: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
ab00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
ab10: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
ab20: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
ab30: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
ab40: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
ab50: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
ab60: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
ab70: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a    }.    pMem++;.
ab80: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
ab90: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
aba0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
abb0: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
abc0: 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20  (pMem, 4) ){.   
abd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
abe0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
abf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
ac00: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
ac10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
ac20: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ac30: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
ac40: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
ac50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ac60: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
ac70: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
ac80: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
ac90: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  /.      pMem->en
aca0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
acb0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
acc0: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
acd0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
ace0: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66  OMMENTS.      if
acf0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
ad00: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
ad10: 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20  Mem, 500) ){.   
ad20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
ad30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ad40: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
ad50: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
ad60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
ad70: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ad80: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
ad90: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64       pMem->n = d
ada0: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
adb0: 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c  p, zP4, pMem->z,
adc0: 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65   500);.      pMe
add0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
ade0: 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20  UTF8;.#else.    
adf0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ae00: 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20  MEM_Null;       
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65  /* Comment */.#e
ae30: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
ae40: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
ae50: 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69  8 - 4*(p->explai
ae60: 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65  n-1);.    p->pRe
ae70: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d  sultSet = &p->aM
ae80: 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63  em[1];.    p->rc
ae90: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
aea0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
aeb0: 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  W;.  }.  return 
aec0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
aed0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
aee0: 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AIN */..#ifdef S
aef0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
af00: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
af10: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
af20: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
af30: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
af40: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
af50: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
af60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
af70: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53  = 0;.  if( p->zS
af80: 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d  ql ){.    z = p-
af90: 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  >zSql;.  }else i
afa0: 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a  f( p->nOp>=1 ){.
afb0: 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70      const VdbeOp
afc0: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
afd0: 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  0];.    if( pOp-
afe0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
aff0: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
b000: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f   ){.      z = pO
b010: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77  p->p4.z;.      w
b020: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
b030: 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a  pace(*z) ) z++;.
b040: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
b050: 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a  z ) printf("SQL:
b060: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a   [%s]\n", z);.}.
b070: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
b080: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b090: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
b0a0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
b0b0: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
b0c0: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
b0d0: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
b0e0: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
b0f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
b100: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
b110: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
b120: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
b130: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
b140: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
b150: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
b160: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
b170: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
b180: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
b190: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
b1a0: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
b1b0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
b1c0: 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30  .    char z[1000
b1d0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
b1e0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
b1f0: 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  ), z, "%s", pOp-
b200: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28  >p4.z);.    for(
b210: 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70  i=0; sqlite3Issp
b220: 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  ace(z[i]); i++){
b230: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  }.    for(j=0; z
b240: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
b250: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70   if( sqlite3Issp
b260: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  ace(z[i]) ){.   
b270: 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21       if( z[i-1]!
b280: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
b290: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
b2a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b2b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
b2c0: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
b2d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b2e0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  z[j] = 0;.    sq
b2f0: 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51  lite3IoTrace("SQ
b300: 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  L %s\n", z);.  }
b310: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
b320: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
b330: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
b340: 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  _IOTRACE */../*.
b350: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
b360: 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73  e from a fixed s
b370: 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20 72  ize buffer and r
b380: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
b390: 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65  to.** that space
b3a0: 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65  .  If insufficie
b3b0: 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61 69  nt space is avai
b3c0: 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55  lable, return NU
b3d0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42  LL..**.** The pB
b3e0: 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  uf parameter is 
b3f0: 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
b400: 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77  e of a pointer w
b410: 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63  hich will.** rec
b420: 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d  eive the new mem
b430: 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f  ory.  pBuf is no
b440: 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66  rmally NULL.  If
b450: 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20   pBuf is not.** 
b460: 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74  NULL, it means t
b470: 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  hat memory space
b480: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
b490: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
b4a0: 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75  that.** this rou
b4b0: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
b4c0: 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77  allocate any new
b4d0: 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70   memory.  When p
b4e0: 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55  Buf is not.** NU
b4f0: 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  LL simply return
b500: 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c   pBuf.  Only all
b510: 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79  ocate new memory
b520: 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75 66   space when pBuf
b530: 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  .** is NULL..**.
b540: 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20  ** nByte is the 
b550: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
b560: 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e  of space needed.
b570: 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70  .**.** *ppFrom p
b580: 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62  oints to availab
b590: 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e  le space and pEn
b5a0: 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  d points to the 
b5b0: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76  end of the.** av
b5c0: 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20  ailable space.  
b5d0: 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c  When space is al
b5e0: 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d  located, *ppFrom
b5f0: 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61 73   is advanced pas
b600: 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  t.** the end of 
b610: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70  the allocated sp
b620: 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79  ace..**.** *pnBy
b630: 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20  te is a counter 
b640: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
b650: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
b660: 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65 64  that have failed
b670: 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e  .** to allocate.
b680: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69 6e    If there is in
b690: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
b6a0: 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73   in *ppFrom to s
b6b0: 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65  atisfy the.** re
b6c0: 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72  quest, then incr
b6d0: 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79  ement *pnByte by
b6e0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
b6f0: 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73  he request..*/.s
b700: 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f  tatic void *allo
b710: 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a  cSpace(.  void *
b720: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f  pBuf,          /
b730: 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20 70  * Where return p
b740: 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73  ointer will be s
b750: 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  tored */.  int n
b760: 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
b770: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
b780: 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  es to allocate *
b790: 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c  /.  u8 **ppFrom,
b7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
b7b0: 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f  UT: Allocate fro
b7c0: 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75  m *ppFrom */.  u
b7d0: 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  8 *pEnd,        
b7e0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
b7f0: 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68  o 1 byte past th
b800: 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d  e end of *ppFrom
b810: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
b820: 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20   *pnByte        
b830: 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69    /* If allocati
b840: 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64  on cannot be mad
b850: 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  e, increment *pn
b860: 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  Byte */.){.  ass
b870: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
b880: 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f  ALIGNMENT(*ppFro
b890: 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66  m) );.  if( pBuf
b8a0: 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a   ) return pBuf;.
b8b0: 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
b8c0: 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26  (nByte);.  if( &
b8d0: 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d  (*ppFrom)[nByte]
b8e0: 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20   <= pEnd ){.    
b8f0: 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70  pBuf = (void*)*p
b900: 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72  pFrom;.    *ppFr
b910: 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  om += nByte;.  }
b920: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74  else{.    *pnByt
b930: 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a  e += nByte;.  }.
b940: 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d    return pBuf;.}
b950: 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74  ../*.** Rewind t
b960: 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20  he VDBE back to 
b970: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e  the beginning in
b980: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
b990: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a  .** running it..
b9a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
b9b0: 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a  dbeRewind(Vdbe *
b9c0: 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  p){.#if defined(
b9d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
b9e0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
b9f0: 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a  OFILE).  int i;.
ba00: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
ba10: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
ba20: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
ba30: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
ba40: 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75  .  /* There shou
ba50: 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ld be at least o
ba60: 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ne opcode..  */.
ba70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
ba80: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  >0 );..  /* Set 
ba90: 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42  the magic to VDB
baa0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e  E_MAGIC_RUN soon
bab0: 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
bac0: 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61  ater. */.  p->ma
bad0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
bae0: 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51  _RUN;..#ifdef SQ
baf0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
bb00: 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b  (i=1; i<p->nMem;
bb10: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
bb20: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62  t( p->aMem[i].db
bb30: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23  ==p->db );.  }.#
bb40: 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20  endif.  p->pc = 
bb50: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
bb60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72  LITE_OK;.  p->er
bb70: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
bb80: 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63  bort;.  p->magic
bb90: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
bba0: 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20  N;.  p->nChange 
bbb0: 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43  = 0;.  p->cacheC
bbc0: 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e  tr = 1;.  p->min
bbd0: 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20  WriteFileFormat 
bbe0: 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61  = 255;.  p->iSta
bbf0: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  tement = 0;.  p-
bc00: 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d  >nFkConstraint =
bc10: 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   0;.#ifdef VDBE_
bc20: 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d  PROFILE.  for(i=
bc30: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
bc40: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  ){.    p->aOp[i]
bc50: 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d  .cnt = 0;.    p-
bc60: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d  >aOp[i].cycles =
bc70: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
bc80: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
bc90: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
bca0: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20  e for execution 
bcb0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69  for the first ti
bcc0: 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61  me after.** crea
bcd0: 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c  ting the virtual
bce0: 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20   machine.  This 
bcf0: 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20  involves things 
bd00: 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63  such.** as alloc
bd10: 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 20  ating registers 
bd20: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  and initializing
bd30: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75   the program cou
bd40: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74  nter..** After t
bd50: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70  he VDBE has be p
bd60: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62  repped, it can b
bd70: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e  e executed by on
bd80: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c  e or more.** cal
bd90: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
bda0: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a  eExec().  .**.**
bdb0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
bdc0: 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61  ay be called exa
bdd0: 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63  ctly once on eac
bde0: 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  h virtual machin
bdf0: 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  e..** After this
be00: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
be10: 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  ed the VM has be
be20: 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e  en "packaged" an
be30: 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f  d is ready.** to
be40: 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69   run.  After thi
be50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
be60: 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c  led, further cal
be70: 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65  ls to .** sqlite
be80: 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e  3VdbeAddOp() fun
be90: 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69  ctions are prohi
bea0: 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75  bited.  This rou
beb0: 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73  tine disconnects
bec0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f  .** the Vdbe fro
bed0: 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  m the Parse obje
bee0: 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67  ct that helped g
bef0: 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68  enerate it so th
bf00: 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64  at the.** the Vd
bf10: 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e  be becomes an in
bf20: 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79  dependent entity
bf30: 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f   and the Parse o
bf40: 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20  bject can be.** 
bf50: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a  destroyed..**.**
bf60: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
bf70: 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f  VdbeRewind() pro
bf80: 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72  cedure to restor
bf90: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
bfa0: 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69  ine back.** to i
bfb0: 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65  ts initial state
bfc0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65   after it has be
bfd0: 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  en run..*/.void 
bfe0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
bff0: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
c020: 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  BE */.  Parse *p
c030: 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20  Parse           
c040: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
c050: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  g context */.){.
c060: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
c090: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
c0a0: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72  /* Number of par
c0d0: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ameters */.  int
c0e0: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c100: 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f  umber of VM memo
c110: 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  ry registers */.
c120: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20    int nCursor;  
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
c150: 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a  rsors required *
c160: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20  /.  int nArg;   
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c190: 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62  arguments in sub
c1a0: 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  programs */.  in
c1b0: 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20  t nOnce;        
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1d0: 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63  Number of OP_Onc
c1e0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a  e instructions *
c1f0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
c220: 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72  er */.  u8 *zCsr
c230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c240: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
c250: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
c260: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  llocation */.  u
c270: 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *zEnd;        
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c290: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
c2a0: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
c2b0: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  y */.  int nByte
c2c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c2d0: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63        /* How muc
c2e0: 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69  h extra memory i
c2f0: 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61  s needed */..  a
c300: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
c310: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
c320: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
c330: 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
c340: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
c350: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
c360: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c370: 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29  rse==p->pParse )
c380: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
c390: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
c3a0: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b  llocFailed==0 );
c3b0: 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65  .  nVar = pParse
c3c0: 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d  ->nVar;.  nMem =
c3d0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
c3e0: 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73   nCursor = pPars
c3f0: 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20  e->nTab;.  nArg 
c400: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72  = pParse->nMaxAr
c410: 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61  g;.  nOnce = pPa
c420: 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66  rse->nOnce;.  if
c430: 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e  ( nOnce==0 ) nOn
c440: 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72  ce = 1; /* Ensur
c450: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62  e at least one b
c460: 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46  yte in p->aOnceF
c470: 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a  lag[] */.  .  /*
c480: 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72   For each cursor
c490: 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20   required, also 
c4a0: 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72  allocate a memor
c4b0: 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20  y cell. Memory. 
c4c0: 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b   ** cells (nMem+
c4d0: 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d  1-nCursor)..nMem
c4e0: 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c  , inclusive, wil
c4f0: 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  l never be used 
c500: 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65  by.  ** the vdbe
c510: 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61   program. Instea
c520: 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20  d they are used 
c530: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  to allocate spac
c540: 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43  e for.  ** VdbeC
c550: 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73  ursor/BtCursor s
c560: 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62  tructures. The b
c570: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
c580: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20  sociated with . 
c590: 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20   ** cursor 0 is 
c5a0: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
c5b0: 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f   cell nMem. Memo
c5c0: 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29  ry cell (nMem-1)
c5d0: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
c5e0: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
c5f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c600: 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20  cursor 1, etc.. 
c610: 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73   **.  ** See als
c620: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
c630: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
c640: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20   += nCursor;..  
c650: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
c660: 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67  e for memory reg
c670: 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69  isters, SQL vari
c680: 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73  ables, VDBE curs
c690: 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e  ors and .  ** an
c6a0: 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61   array to marsha
c6b0: 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61  l SQL function a
c6c0: 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a  rguments in..  *
c6d0: 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29  /.  zCsr = (u8*)
c6e0: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b  &p->aOp[p->nOp];
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
c700: 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20  emory avaliable 
c710: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  for allocation *
c720: 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29  /.  zEnd = (u8*)
c730: 26 70 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e  &p->aOp[pParse->
c740: 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46  nOpAlloc];  /* F
c750: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 65  irst byte past e
c760: 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a  nd of zCsr[] */.
c770: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
c780: 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20  es(p, &nArg);.  
c790: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
c7a0: 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65  al = (u8)(pParse
c7b0: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26  ->isMultiWrite &
c7c0: 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  & pParse->mayAbo
c7d0: 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rt);.  if( pPars
c7e0: 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d  e->explain && nM
c7f0: 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65  em<10 ){.    nMe
c800: 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65  m = 10;.  }.  me
c810: 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45  mset(zCsr, 0, zE
c820: 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72  nd-zCsr);.  zCsr
c830: 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a   += (zCsr - (u8*
c840: 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28  )0)&7;.  assert(
c850: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
c860: 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20  NMENT(zCsr) );. 
c870: 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
c880: 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f  ..  /* Memory fo
c890: 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72  r registers, par
c8a0: 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c  ameters, cursor,
c8b0: 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74   etc, is allocat
c8c0: 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70  ed in two.  ** p
c8d0: 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66  asses.  On the f
c8e0: 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72  irst pass, we tr
c8f0: 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65  y to reuse unuse
c900: 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20 0a  d space at the .
c910: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
c920: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49  opcode array.  I
c930: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
c940: 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d  to satisfy all m
c950: 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69  emory.  ** requi
c960: 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69  rements by reusi
c970: 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  ng the opcode ar
c980: 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74  ray tail, then t
c990: 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70  he second.  ** p
c9a0: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
c9b0: 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20   the rest using 
c9c0: 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69  a fresh allocati
c9d0: 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  on.  .  **.  ** 
c9e0: 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70  This two-pass ap
c9f0: 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73  proach that reus
ca00: 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  es as much memor
ca10: 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
ca20: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74  om.  ** the left
ca30: 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68  over space at th
ca40: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  e end of the opc
ca50: 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69  ode array can si
ca60: 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
ca70: 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75   reduce the amou
ca80: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c  nt of memory hel
ca90: 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20  d by a prepared 
caa0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
cab0: 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65    do {.    nByte
cac0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65   = 0;.    p->aMe
cad0: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  m = allocSpace(p
cae0: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
caf0: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
cb00: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
cb10: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
cb20: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72  locSpace(p->aVar
cb30: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
cb40: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
cb50: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
cb60: 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
cb70: 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41  ace(p->apArg, nA
cb80: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c  rg*sizeof(Mem*),
cb90: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
cba0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  Byte);.    p->az
cbb0: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
cbc0: 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a  (p->azVar, nVar*
cbd0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26  sizeof(char*), &
cbe0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
cbf0: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  te);.    p->apCs
cc00: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
cc10: 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72  ->apCsr, nCursor
cc20: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
cc30: 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or*),.          
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
cc60: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e  yte);.    p->aOn
cc70: 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70  ceFlag = allocSp
cc80: 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  ace(p->aOnceFlag
cc90: 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20  , nOnce, &zCsr, 
cca0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 23  zEnd, &nByte);.#
ccb0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ccc0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
ccd0: 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65  TUS.    p->anExe
cce0: 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  c = allocSpace(p
ccf0: 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70  ->anExec, p->nOp
cd00: 2a 73 69 7a 65 6f 66 28 69 36 34 29 2c 20 26 7a  *sizeof(i64), &z
cd10: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
cd20: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  e);.#endif.    i
cd30: 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  f( nByte ){.    
cd40: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
cd50: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
cd60: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
cd70: 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d   }.    zCsr = p-
cd80: 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64  >pFree;.    zEnd
cd90: 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b   = &zCsr[nByte];
cda0: 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65  .  }while( nByte
cdb0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
cdc0: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e  ailed );..  p->n
cdd0: 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72  Cursor = nCursor
cde0: 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67  ;.  p->nOnceFlag
cdf0: 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20   = nOnce;.  if( 
ce00: 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70  p->aVar ){.    p
ce10: 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29  ->nVar = (ynVar)
ce20: 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  nVar;.    for(n=
ce30: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
ce40: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e  .      p->aVar[n
ce50: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
ce60: 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  ll;.      p->aVa
ce70: 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  r[n].db = db;.  
ce80: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
ce90: 3e 61 7a 56 61 72 20 26 26 20 70 50 61 72 73 65  >azVar && pParse
cea0: 2d 3e 6e 7a 56 61 72 3e 30 20 29 7b 0a 20 20 20  ->nzVar>0 ){.   
ceb0: 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72   p->nzVar = pPar
cec0: 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d  se->nzVar;.    m
ced0: 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20  emcpy(p->azVar, 
cee0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70  pParse->azVar, p
cef0: 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70  ->nzVar*sizeof(p
cf00: 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20  ->azVar[0]));.  
cf10: 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d    memset(pParse-
cf20: 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73  >azVar, 0, pPars
cf30: 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28  e->nzVar*sizeof(
cf40: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d  pParse->azVar[0]
cf50: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
cf60: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e  >aMem ){.    p->
cf70: 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20  aMem--;         
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf90: 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d  aMem[] goes from
cfa0: 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20   1..nMem */.    
cfb0: 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20  p->nMem = nMem; 
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f  /*       not fro
cfe0: 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20  m 0..nMem-1 */. 
cff0: 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e     for(n=1; n<=n
d000: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Mem; n++){.     
d010: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67   p->aMem[n].flag
d020: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
d030: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  d;.      p->aMem
d040: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
d050: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c   }.  }.  p->expl
d060: 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78  ain = pParse->ex
d070: 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  plain;.  sqlite3
d080: 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
d090: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
d0a0: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
d0b0: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
d0c0: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
d0d0: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
d0e0: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
d0f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
d100: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
d110: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
d120: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
d130: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
d140: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
d150: 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e  eSorterClose(p->
d160: 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20  db, pCx);.  if( 
d170: 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pCx->pBt ){.    
d180: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
d190: 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pCx->pBt);.   
d1a0: 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75   /* The pCx->pCu
d1b0: 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f  rsor will be clo
d1c0: 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  se automatically
d1d0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20  , if it exists, 
d1e0: 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61  by.    ** the ca
d1f0: 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d  ll above. */.  }
d200: 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43  else if( pCx->pC
d210: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
d220: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
d230: 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f  rsor(pCx->pCurso
d240: 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  r);.  }.#ifndef 
d250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
d260: 55 41 4c 54 41 42 4c 45 0a 20 20 65 6c 73 65 20  UALTABLE.  else 
d270: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
d280: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
d290: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
d2a0: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
d2b0: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
d2c0: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
d2d0: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
d2e0: 6c 65 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72  le = pVtabCursor
d2f0: 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
d300: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 56  ;.    assert( pV
d310: 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
d320: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
d330: 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74  pVtabCursor->pVt
d340: 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  ab->nRef--;.    
d350: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
d360: 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20  pVtabCursor);.  
d370: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
d380: 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65  * Copy the value
d390: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
d3a0: 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74  VdbeFrame struct
d3b0: 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e  ure to its Vdbe.
d3c0: 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64   This.** is used
d3d0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
d3e0: 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75  hen a trigger su
d3f0: 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c  b-program is hal
d400: 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a  ted to restore.*
d410: 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  * control to the
d420: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a   main program..*
d430: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
d440: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64  eFrameRestore(Vd
d450: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  beFrame *pFrame)
d460: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46  {.  Vdbe *v = pF
d470: 72 61 6d 65 2d 3e 76 3b 0a 23 69 66 64 65 66 20  rame->v;.#ifdef 
d480: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
d490: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
d4a0: 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61  v->anExec = pFra
d4b0: 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64  me->anExec;.#end
d4c0: 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61  if.  v->aOnceFla
d4d0: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  g = pFrame->aOnc
d4e0: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63  eFlag;.  v->nOnc
d4f0: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
d500: 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  nOnceFlag;.  v->
d510: 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
d520: 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
d530: 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
d540: 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
d550: 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
d560: 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
d570: 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
d580: 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
d590: 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
d5a0: 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
d5b0: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
d5c0: 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
d5d0: 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
d5e0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
d5f0: 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61  e;.  v->db->nCha
d600: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44  nge = pFrame->nD
d610: 62 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72  bChange;.  retur
d620: 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a  n pFrame->pc;.}.
d630: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
d640: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
d650: 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79  Also release any
d660: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
d670: 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69  held by the VM i
d680: 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20  n the Vdbe.aMem 
d690: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
d6a0: 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e  array. This is n
d6b0: 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20  ecessary as the 
d6c0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61  memory cell arra
d6d0: 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a  y may contain.**
d6e0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62   pointers to Vdb
d6f0: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20  eFrame objects, 
d700: 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72  which may in tur
d710: 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  n contain pointe
d720: 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75  rs to.** open cu
d730: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rsors..*/.static
d740: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
d750: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
d760: 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
d770: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
d780: 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f   *pFrame;.    fo
d790: 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
d7a0: 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
d7b0: 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
d7c0: 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
d7d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
d7e0: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65  meRestore(pFrame
d7f0: 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65  );.    p->pFrame
d800: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72   = 0;.    p->nFr
d810: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ame = 0;.  }.  a
d820: 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65  ssert( p->nFrame
d830: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ==0 );..  if( p-
d840: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
d850: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
d860: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
d870: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
d880: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
d890: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
d8a0: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
d8b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
d8c0: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
d8d0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
d8e0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
d8f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d900: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
d910: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
d920: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e  &p->aMem[1], p->
d930: 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69  nMem);.  }.  whi
d940: 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  le( p->pDelFrame
d950: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
d960: 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65  e *pDel = p->pDe
d970: 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  lFrame;.    p->p
d980: 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d  DelFrame = pDel-
d990: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71  >pParent;.    sq
d9a0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
d9b0: 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a  lete(pDel);.  }.
d9c0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
d9d0: 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74   auxdata allocat
d9e0: 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65  ions made by the
d9f0: 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e   VM */.  if( p->
da00: 70 41 75 78 44 61 74 61 20 29 20 73 71 6c 69 74  pAuxData ) sqlit
da10: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
da20: 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20  ata(p, -1, 0);. 
da30: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78   assert( p->pAux
da40: 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Data==0 );.}../*
da50: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
da60: 20 56 4d 20 61 66 74 65 72 20 61 20 73 69 6e 67   VM after a sing
da70: 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69  le run..*/.stati
da80: 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56  c void Cleanup(V
da90: 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
daa0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
dab0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
dac0: 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74  EBUG.  /* Execut
dad0: 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  e assert() state
dae0: 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20  ments to ensure 
daf0: 74 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70  that the Vdbe.ap
db00: 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20  Csr[] and .  ** 
db10: 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61  Vdbe.aMem[] arra
db20: 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ys have already 
db30: 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e  been cleaned up.
db40: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20    */.  int i;.  
db50: 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66  if( p->apCsr ) f
db60: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
db70: 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72  rsor; i++) asser
db80: 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d  t( p->apCsr[i]==
db90: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  0 );.  if( p->aM
dba0: 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  em ){.    for(i=
dbb0: 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69  1; i<=p->nMem; i
dbc0: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
dbd0: 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45  Mem[i].flags==ME
dbe0: 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20  M_Undefined );. 
dbf0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
dc00: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
dc10: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
dc20: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
dc30: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
dc40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
dc50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
dc60: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61  sult columns tha
dc70: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
dc80: 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a  ed by this SQL.*
dc90: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  * statement. Thi
dca0: 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20  s is now set at 
dcb0: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61  compile time, ra
dcc0: 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67  ther than during
dcd0: 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66  .** execution of
dce0: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
dcf0: 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65  m so that sqlite
dd00: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29  3_column_count()
dd10: 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65   can.** be calle
dd20: 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74  d on an SQL stat
dd30: 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c  ement before sql
dd40: 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a  ite3_step()..*/.
dd50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
dd60: 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20  SetNumCols(Vdbe 
dd70: 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75  *p, int nResColu
dd80: 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c  mn){.  Mem *pCol
dd90: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Name;.  int n;. 
dda0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
ddb0: 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ->db;..  release
ddc0: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
ddd0: 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
dde0: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
ddf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
de00: 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
de10: 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75  ;.  n = nResColu
de20: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20  mn*COLNAME_N;.  
de30: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
de40: 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b  (u16)nResColumn;
de50: 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d  .  p->aColName =
de60: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d   pColName = (Mem
de70: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
de80: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
de90: 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28  (Mem)*n );.  if(
dea0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20   p->aColName==0 
deb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c  ) return;.  whil
dec0: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
ded0: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67    pColName->flag
dee0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
def0: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d    pColName->db =
df00: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c   p->db;.    pCol
df10: 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Name++;.  }.}../
df20: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
df30: 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20  e of the idx'th 
df40: 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74  column to be ret
df50: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
df60: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a   statement..** z
df70: 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70  Name must be a p
df80: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20  ointer to a nul 
df90: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
dfa0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  g..**.** This ca
dfb0: 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20  ll must be made 
dfc0: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
dfd0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
dfe0: 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  mCols()..**.** T
dff0: 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74  he final paramet
e000: 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62  er, xDel, must b
e010: 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  e one of SQLITE_
e020: 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f  DYNAMIC, SQLITE_
e030: 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c  STATIC.** or SQL
e040: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49  ITE_TRANSIENT. I
e050: 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44  f it is SQLITE_D
e060: 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65  YNAMIC, then the
e070: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
e080: 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77  ** to by zName w
e090: 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20  ill be freed by 
e0a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20  sqlite3DbFree() 
e0b0: 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73  when the vdbe is
e0c0: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69   destroyed..*/.i
e0d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
e0e0: 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65  tColName(.  Vdbe
e0f0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e110: 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69  Vdbe being confi
e120: 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  gured */.  int i
e130: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
e140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e150: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a  ndex of column z
e160: 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20  Name applies to 
e170: 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20  */.  int var,   
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e190: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
e1a0: 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f  the COLNAME_* co
e1b0: 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  nstants */.  con
e1c0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e1e0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
e1f0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61  er containing na
e200: 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  me */.  void (*x
e210: 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20  Del)(void*)     
e220: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
e230: 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74  ry management st
e240: 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65  rategy for zName
e250: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
e260: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
e270: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
e280: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b  p->nResColumn );
e290: 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43  .  assert( var<C
e2a0: 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66  OLNAME_N );.  if
e2b0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
e2c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73  ailed ){.    ass
e2d0: 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78  ert( !zName || x
e2e0: 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41  Del!=SQLITE_DYNA
e2f0: 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72  MIC );.    retur
e300: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e310: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
e320: 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a  >aColName!=0 );.
e330: 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70    pColName = &(p
e340: 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76  ->aColName[idx+v
e350: 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  ar*p->nResColumn
e360: 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
e370: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
e380: 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  pColName, zName,
e390: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
e3a0: 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72  , xDel);.  asser
e3b0: 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61  t( rc!=0 || !zNa
e3c0: 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d  me || (pColName-
e3d0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29  >flags&MEM_Term)
e3e0: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
e3f0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72  rc;.}../*.** A r
e400: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
e410: 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20  nsaction may or 
e420: 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76  may not be activ
e430: 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  e on database ha
e440: 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61  ndle.** db. If a
e450: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
e460: 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69  active, commit i
e470: 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  t. If there is a
e480: 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
e490: 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d  ction spanning m
e4a0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
e4b0: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
e4c0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65   routine.** take
e4d0: 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61  s care of the ma
e4e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69  ster journal tri
e4f0: 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ckery..*/.static
e500: 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28   int vdbeCommit(
e510: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
e520: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
e530: 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30    int nTrans = 0
e540: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
e550: 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61  databases with a
e560: 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74  n active write-t
e570: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
e580: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e590: 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63  OK;.  int needXc
e5a0: 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64  ommit = 0;..#ifd
e5b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
e5c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
e5d0: 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f   With this optio
e5e0: 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79  n, sqlite3VtabSy
e5f0: 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  nc() is defined 
e600: 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20  to be simply .  
e610: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20  ** SQLITE_OK so 
e620: 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a  p is not used. .
e630: 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41    */.  UNUSED_PA
e640: 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64  RAMETER(p);.#end
e650: 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  if..  /* Before 
e660: 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
e670: 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
e680: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
e690: 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
e6a0: 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
e6b0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
e6c0: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
e6d0: 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
e6e0: 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
e6f0: 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
e700: 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
e710: 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
e720: 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
e730: 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
e740: 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
e750: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
e760: 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
e770: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
e780: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
e790: 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20  Sync(db, p);..  
e7a0: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
e7b0: 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
e7c0: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
e7d0: 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
e7e0: 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
e7f0: 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
e800: 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
e810: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
e820: 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
e830: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
e840: 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
e850: 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
e860: 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
e870: 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
e880: 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
e890: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
e8a0: 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
e8b0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
e8c0: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
e8d0: 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
e8e0: 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
e8f0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
e900: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
e910: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
e920: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
e930: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
e940: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
e950: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
e960: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
e970: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
e980: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
e990: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
e9a0: 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
e9b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e9c0: 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
e9d0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65  Lock(sqlite3Btre
e9e0: 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20  ePager(pBt));.  
e9f0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ea00: 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20  Leave(pBt);.    
ea10: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  }.  }.  if( rc!=
ea20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ea30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
ea40: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
ea50: 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61  re any write-tra
ea60: 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  nsactions at all
ea70: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d  , invoke the com
ea80: 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  mit hook */.  if
ea90: 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26  ( needXcommit &&
eaa0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
eab0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d  back ){.    rc =
eac0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
ead0: 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74  back(db->pCommit
eae0: 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Arg);.    if( rc
eaf0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
eb00: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
eb10: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20  NT_COMMITHOOK;. 
eb20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
eb30: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
eb40: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
eb50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
eb60: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
eb70: 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
eb80: 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
eb90: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
eba0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
ebb0: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
ebc0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
ebd0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
ebe0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
ebf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
ec00: 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
ec10: 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
ec20: 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
ec30: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
ec40: 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20  ase is :memory: 
ec50: 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  or a temp file. 
ec60: 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63   In .  ** that c
ec70: 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75  ase we do not su
ec80: 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
ec90: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
eca0: 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a   so use the .  *
ecb0: 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  * simple case th
ecc0: 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  en too..  */.  i
ecd0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
ece0: 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72  len30(sqlite3Btr
ecf0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
ed00: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20  ->aDb[0].pBt)). 
ed10: 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20    || nTrans<=1. 
ed20: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
ed30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
ed40: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
ed50: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
ed60: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
ed70: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
ed80: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
ed90: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
eda0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
edb0: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
edc0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
edd0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79   the commit only
ede0: 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65   if all database
edf0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
ee00: 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e  omplete phase 1.
ee10: 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20   .    ** If one 
ee20: 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d  of the BtreeComm
ee30: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
ee40: 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69  ls fails, this i
ee50: 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20  ndicates an.    
ee60: 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c  ** IO error whil
ee70: 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  e deleting or tr
ee80: 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e  uncating a journ
ee90: 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75  al file. It is u
eea0: 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20  nlikely,.    ** 
eeb0: 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  but could happen
eec0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
eed0: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
eee0: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
eef0: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
ef00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
ef10: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
ef20: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
ef30: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
ef40: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
ef50: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
ef60: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
ef70: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
ef80: 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30  tPhaseTwo(pBt, 0
ef90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
efa0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
efb0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
efc0: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
efd0: 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(db);.    }.  }
efe0: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c  ..  /* The compl
eff0: 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20  ex case - There 
f000: 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  is a multi-file 
f010: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
f020: 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54  n active..  ** T
f030: 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d  his requires a m
f040: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
f050: 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  le to ensure the
f060: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
f070: 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61    ** committed a
f080: 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  tomically..  */.
f090: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f0a0: 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73  MIT_DISKIO.  els
f0b0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e{.    sqlite3_v
f0c0: 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70  fs *pVfs = db->p
f0d0: 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65  Vfs;.    int nee
f0e0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63  dSync = 0;.    c
f0f0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
f100: 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65  ;   /* File-name
f110: 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20   for the master 
f120: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63  journal */.    c
f130: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e  har const *zMain
f140: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
f150: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
f160: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
f170: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
f180: 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20   *pMaster = 0;. 
f190: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
f1a0: 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  0;.    int res;.
f1b0: 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75      int retryCou
f1c0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  nt = 0;.    int 
f1d0: 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20  nMainFile;..    
f1e0: 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
f1f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
f200: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69  name */.    nMai
f210: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53  nFile = sqlite3S
f220: 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c  trlen30(zMainFil
f230: 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  e);.    zMaster 
f240: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
f250: 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58  (db, "%s-mjXXXXX
f260: 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c  X9XXz", zMainFil
f270: 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73  e);.    if( zMas
f280: 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ter==0 ) return 
f290: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f2a0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32    do {.      u32
f2b0: 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20   iRandom;.      
f2c0: 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29  if( retryCount )
f2d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  {.        if( re
f2e0: 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a  tryCount>100 ){.
f2f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f300: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
f310: 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25  L, "MJ delete: %
f320: 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
f330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
f340: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
f350: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
f360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f370: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
f380: 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20  tryCount==1 ){. 
f390: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f3a0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
f3b0: 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25  , "MJ collide: %
f3c0: 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  s", zMaster);.  
f3d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f3e0: 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74        retryCount
f3f0: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
f400: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
f410: 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69  eof(iRandom), &i
f420: 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73  Random);.      s
f430: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
f440: 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61  13, &zMaster[nMa
f450: 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36  inFile], "-mj%06
f460: 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20  X9%02X",.       
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f480: 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d          (iRandom
f490: 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69  >>8)&0xffffff, i
f4a0: 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20  Random&0xff);.  
f4b0: 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70      /* The antip
f4c0: 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61  enultimate chara
f4d0: 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74  cter of the mast
f4e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
f4f0: 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65  must.      ** be
f500: 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61   "9" to avoid na
f510: 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68  me collisions wh
f520: 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c  en using 8+3 fil
f530: 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20  enames. */.     
f540: 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72   assert( zMaster
f550: 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
f560: 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39  (zMaster)-3]=='9
f570: 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ' );.      sqlit
f580: 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d  e3FileSuffix3(zM
f590: 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72  ainFile, zMaster
f5a0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
f5b0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
f5c0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
f5d0: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
f5e0: 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77  S, &res);.    }w
f5f0: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
f600: 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20  _OK && res );.  
f610: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f620: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
f630: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
f640: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
f650: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f660: 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c  OpenMalloc(pVfs,
f670: 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74   zMaster, &pMast
f680: 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  er, .          S
f690: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
f6a0: 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
f6b0: 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
f6c0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
f6d0: 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
f6e0: 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
f6f0: 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  NAL, 0.      );.
f700: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
f710: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f720: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
f730: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
f740: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f750: 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
f760: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
f770: 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
f780: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
f790: 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
f7a0: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
f7b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f7c0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
f7d0: 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
f7e0: 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
f7f0: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
f800: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
f810: 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
f820: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
f830: 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
f840: 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
f850: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f860: 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
f870: 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
f880: 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
f890: 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
f8a0: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
f8b0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
f8c0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
f8d0: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
f8e0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
f8f0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
f900: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
f910: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
f920: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
f930: 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
f940: 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
f950: 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
f960: 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20     if( zFile==0 
f970: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
f980: 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72  tinue;  /* Ignor
f990: 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f  e TEMP and :memo
f9a0: 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
f9b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f9c0: 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
f9d0: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
f9e0: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
f9f0: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
fa00: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
fa10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
fa20: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
fa30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
fa40: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
fa50: 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
fa60: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
fa70: 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
fa80: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
fa90: 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
faa0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
fab0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
fac0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fad0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fae0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
faf0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
fb00: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
fb10: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
fb20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
fb30: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
fb40: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
fb50: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fb60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
fb70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
fb80: 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
fb90: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
fba0: 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
fbb0: 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
fbc0: 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
fbd0: 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
fbe0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
fbf0: 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  f( needSync .   
fc00: 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33    && 0==(sqlite3
fc10: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
fc20: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
fc30: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
fc40: 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26  QUENTIAL).     &
fc50: 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
fc60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
fc70: 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45  (pMaster, SQLITE
fc80: 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20  _SYNC_NORMAL)). 
fc90: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
fca0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
fcb0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
fcc0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
fcd0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
fce0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
fcf0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
fd00: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
fd10: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
fd20: 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20  /* Sync all the 
fd30: 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65  db files involve
fd40: 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  d in the transac
fd50: 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63  tion. The same c
fd60: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  all.    ** sets 
fd70: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fd80: 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61  al pointer in ea
fd90: 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ch individual jo
fda0: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a  urnal. If.    **
fdb0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
fdc0: 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65   here, do not de
fdd0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
fde0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
fdf0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
fe00: 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
fe10: 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
fe20: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
fe30: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
fe40: 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68  itPhaseOne(), th
fe50: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68  en there is a ch
fe60: 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20  ance that the.  
fe70: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
fe80: 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nal file will be
fe90: 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77   orphaned. But w
fea0: 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20  e cannot delete 
feb0: 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61  it,.    ** in ca
fec0: 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  se the master jo
fed0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
fee0: 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
fef0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
ff00: 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20   ** file before 
ff10: 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75  the failure occu
ff20: 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rred..    */.   
ff30: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
ff40: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
ff50: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
ff60: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
ff70: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
ff80: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
ff90: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
ffa0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
ffb0: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d  PhaseOne(pBt, zM
ffc0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  aster);.      }.
ffd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ffe0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
fff0: 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
10000 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  t( rc!=SQLITE_BU
10010 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  SY );.    if( rc
10020 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10030 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
10040 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
10050 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
10060 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10070 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  Delete the maste
10080 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
10090 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65  This commits the
100a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66   transaction. Af
100b0 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ter.    ** doing
100c0 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74   this the direct
100d0 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67  ory is synced ag
100e0 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69  ain before any i
100f0 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a  ndividual.    **
10100 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c   transaction fil
10110 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  es are deleted..
10120 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
10130 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10140 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  pVfs, zMaster, n
10150 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 73 71  eedSync);.    sq
10160 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10170 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
10180 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
10190 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
101a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
101b0 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
101c0 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
101d0 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
101e0 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
101f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
10200 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
10210 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
10220 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
10230 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
10240 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
10250 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
10260 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
10270 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
10280 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
10290 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
102a0 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
102b0 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
102c0 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
102d0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
102e0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
102f0 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
10300 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
10310 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
10320 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
10330 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
10340 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
10350 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
10360 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
10370 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10380 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
10390 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
103a0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
103b0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
103c0 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
103d0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
103e0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
103f0 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
10400 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
10410 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
10420 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  pBt, 1);.      }
10430 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10440 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
10450 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f  c();.    enable_
10460 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10470 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69  ors();..    sqli
10480 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
10490 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
104a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
104b0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
104c0 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  ne checks that t
104d0 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65  he sqlite3.nVdbe
104e0 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72  Active count var
104f0 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
10500 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
10510 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
10520 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
10530 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
10540 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
10550 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
10560 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
10570 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
10580 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
10590 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
105a0 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
105b0 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
105c0 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
105d0 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
105e0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
105f0 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
10600 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
10610 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
10620 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
10630 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
10640 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
10650 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
10660 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e  nWrite = 0;.  in
10670 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70  t nRead = 0;.  p
10680 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
10690 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
106a0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  if( sqlite3_stmt
106b0 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73  _busy((sqlite3_s
106c0 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20  tmt*)p) ){.     
106d0 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
106e0 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
106f0 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20   ) nWrite++;.   
10700 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
10710 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20  der ) nRead++;. 
10720 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
10730 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
10740 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56  ert( cnt==db->nV
10750 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61  dbeActive );.  a
10760 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64  ssert( nWrite==d
10770 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b  b->nVdbeWrite );
10780 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64  .  assert( nRead
10790 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  ==db->nVdbeRead 
107a0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
107b0 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
107c0 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
107d0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64  ./*.** If the Vd
107e0 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
107f0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
10800 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65  opened a stateme
10810 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  nt-transaction,.
10820 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e  ** close it now.
10830 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75   Argument eOp mu
10840 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56  st be either SAV
10850 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10860 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  or.** SAVEPOINT_
10870 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69  RELEASE. If it i
10880 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
10890 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73  BACK, then the s
108a0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
108b0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
108c0 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69  d back. If eOp i
108d0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
108e0 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ASE, then the .*
108f0 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
10900 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
10910 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
10920 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
10930 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
10940 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
10950 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
10960 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
10970 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
10980 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
10990 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
109a0 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
109b0 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
109c0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
109d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
109e0 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74    /* If p->iStat
109f0 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72  ement is greater
10a00 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
10a10 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65   this Vdbe opene
10a20 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d  d a .  ** statem
10a30 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
10a40 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
10a50 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20  losed here. The 
10a60 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20  only exception. 
10a70 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49   ** is that an I
10a80 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
10a90 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69   occurred, causi
10aa0 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  ng an emergency 
10ab0 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49  rollback..  ** I
10ac0 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d  n this case (db-
10ad0 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c  >nStatement==0),
10ae0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
10af0 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a  thing to do..  *
10b00 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61  /.  if( db->nSta
10b10 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74  tement && p->iSt
10b20 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69  atement ){.    i
10b30 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt i;.    const 
10b40 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d  int iSavepoint =
10b50 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31   p->iStatement-1
10b60 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
10b70 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
10b80 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53  LLBACK || eOp==S
10b90 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
10ba0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
10bb0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20  b->nStatement>0 
10bc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
10bd0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
10be0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
10bf0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
10c00 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
10c10 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
10c20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
10c30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10c40 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
10c50 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
10c60 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
10c70 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
10c80 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
10c90 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ACK ){.         
10ca0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
10cb0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
10cc0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
10cd0 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
10ce0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10cf0 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
10d00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10d10 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
10d20 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
10d30 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
10d40 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
10d50 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
10d60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
10d70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10d80 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
10d90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10da0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d   }.    }.    db-
10db0 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
10dc0 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74     p->iStatement
10dd0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72   = 0;..    if( r
10de0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10df0 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
10e00 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10e10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
10e20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
10e30 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
10e40 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
10e50 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
10e60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
10e70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10e80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10e90 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
10ea0 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
10eb0 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
10ec0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
10ed0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
10ee0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
10ef0 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
10f00 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c   rolled back, al
10f10 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a  so restore the .
10f20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
10f30 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64  handles deferred
10f40 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
10f50 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ter to the value
10f60 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20   it had when .  
10f70 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
10f80 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
10f90 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20  as opened.  */. 
10fa0 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
10fb0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
10fc0 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66  {.      db->nDef
10fd0 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e  erredCons = p->n
10fe0 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20  StmtDefCons;.   
10ff0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
11000 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  ImmCons = p->nSt
11010 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20  mtDefImmCons;.  
11020 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11030 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11040 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
11050 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
11060 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  nsaction opened 
11070 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  by the database 
11080 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63  .** handle assoc
11090 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
110a0 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
110b0 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74  rgument is about
110c0 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69   to be .** commi
110d0 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61  tted. If there a
110e0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
110f0 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
11100 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  key constraint.*
11110 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65  * violations, re
11120 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
11130 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  R. Otherwise, SQ
11140 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
11150 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
11160 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61  tanding FK viola
11170 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66  tions and this f
11180 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
11190 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
111a0 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  , set the result
111b0 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51   of the VM to SQ
111c0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
111d0 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e  FOREIGNKEY.** an
111e0 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72  d write an error
111f0 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20   message to it. 
11200 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  Then return SQLI
11210 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66  TE_ERROR..*/.#if
11220 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11230 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74  _FOREIGN_KEY.int
11240 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
11250 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  kFk(Vdbe *p, int
11260 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71   deferred){.  sq
11270 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
11280 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72  b;.  if( (deferr
11290 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65  ed && (db->nDefe
112a0 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65  rredCons+db->nDe
112b0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30  ferredImmCons)>0
112c0 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72  ) .   || (!defer
112d0 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e  red && p->nFkCon
112e0 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b  straint>0) .  ){
112f0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
11300 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
11310 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70  OREIGNKEY;.    p
11320 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
11330 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71  OE_Abort;.    sq
11340 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
11350 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
11360 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  "FOREIGN KEY con
11370 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29  straint failed")
11380 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11390 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
113a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
113b0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
113c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
113d0 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
113e0 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
113f0 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
11400 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
11410 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
11420 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
11430 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
11440 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
11450 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
11460 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
11470 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
11480 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
11490 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
114a0 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
114b0 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
114c0 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
114d0 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
114e0 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20  TE_MAGIC_HALT.  
114f0 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74  It is harmless t
11500 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f  o.** call this o
11510 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69  n a VM that is i
11520 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47  n the SQLITE_MAG
11530 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a  IC_HALT state..*
11540 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
11550 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
11560 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
11570 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
11580 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
11590 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
115a0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
115b0 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
115c0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
115d0 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
115e0 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
115f0 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
11600 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
11610 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
11620 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  lt(Vdbe *p){.  i
11630 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11650 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * Used to store 
11660 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e  transient return
11670 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69   codes */.  sqli
11680 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
11690 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
116a0 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  tion contains th
116b0 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74  e logic that det
116c0 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61  ermines if a sta
116d0 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74  tement or.  ** t
116e0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
116f0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
11700 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
11710 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
11720 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   ** execution of
11730 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
11740 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  chine. .  **.  *
11750 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
11760 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73  following errors
11770 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a   occur:.  **.  *
11780 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  *     SQLITE_NOM
11790 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  EM.  **     SQLI
117a0 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20  TE_IOERR.  **   
117b0 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20    SQLITE_FULL.  
117c0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e  **     SQLITE_IN
117d0 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a  TERRUPT.  **.  *
117e0 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72  * Then the inter
117f0 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20  nal cache might 
11800 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69  have been left i
11810 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
11820 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57  t.  ** state.  W
11830 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e need to rollba
11840 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
11850 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
11860 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
11870 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c  ne, or the compl
11880 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ete transaction 
11890 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
118a0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
118b0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66  tion..  */..  if
118c0 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
118d0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
118e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
118f0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  M;.  }.  if( p->
11900 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73  aOnceFlag ) mems
11910 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c  et(p->aOnceFlag,
11920 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67   0, p->nOnceFlag
11930 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72  );.  closeAllCur
11940 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70  sors(p);.  if( p
11950 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
11960 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
11970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11980 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69  .  }.  checkActi
11990 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
119a0 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
119b0 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
119c0 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
119d0 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f   never started o
119e0 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51  r if the.  ** SQ
119f0 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73  L statement does
11a00 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69   not read or wri
11a10 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69  te a database fi
11a20 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  le.  */.  if( p-
11a30 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73  >pc>=0 && p->bIs
11a40 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e  Reader ){.    in
11a50 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
11a60 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
11a70 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
11a80 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
11a90 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
11aa0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
11ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
11ac0 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
11ad0 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
11ae0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
11af0 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
11b00 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
11b10 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
11b20 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  eEnter(p);..    
11b30 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
11b40 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
11b50 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
11b60 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
11b70 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
11b80 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
11b90 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
11ba0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
11bd0 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
11be0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
11bf0 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
11c00 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
11c10 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
11c20 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
11c30 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
11c40 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
11c50 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
11c60 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
11c70 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
11c80 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
11c90 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
11ca0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
11cb0 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
11cc0 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
11cd0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
11ce0 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
11cf0 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
11d00 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
11d10 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
11d20 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
11d30 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
11d40 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
11d50 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
11d60 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
11d70 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
11d80 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
11d90 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
11da0 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69  curred while wri
11db0 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
11dc0 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  nal, sub-journal
11dd0 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20   or database.   
11de0 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61     ** file as pa
11df0 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20  rt of an effort 
11e00 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65  to free up cache
11e10 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63   space (see func
11e20 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61  tion.      ** pa
11e30 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70  gerStress() in p
11e40 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c  ager.c), the rol
11e50 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65  lback is require
11e60 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20  d to restore .  
11e70 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72      ** the pager
11e80 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   to a consistent
11e90 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
11ea0 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72  .      if( !p->r
11eb0 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d  eadOnly || mrc!=
11ec0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
11ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11ee0 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
11ef0 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
11f00 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73  E_FULL) && p->us
11f10 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
11f20 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
11f30 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
11f40 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
11f50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11f60 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
11f70 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
11f80 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
11f90 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
11fa0 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
11fb0 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
11fc0 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
11fd0 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
11fe0 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
11ff0 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
12000 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
12010 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
12020 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
12030 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
12040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
12050 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
12060 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
12070 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
12080 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
12090 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
120a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
120b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
120c0 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
120d0 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
120e0 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
120f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12100 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
12110 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
12120 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
12130 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
12140 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
12150 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
12160 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
12170 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
12180 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
12190 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
121a0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
121b0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
121c0 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
121d0 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
121e0 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
121f0 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
12200 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
12210 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
12220 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
12230 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
12240 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
12250 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
12260 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
12270 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e  t .     && db->n
12280 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72  VdbeWrite==(p->r
12290 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20  eadOnly==0) .   
122a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
122b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
122c0 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
122d0 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
122e0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
122f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
12300 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
12310 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  k(p, 1);.       
12320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12330 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12340 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61  if( NEVER(p->rea
12350 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  dOnly) ){.      
12360 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12370 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
12380 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12390 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
123a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
123b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
123c0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
123d0 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KEY;.        }el
123e0 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f  se{ .          /
123f0 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
12400 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
12410 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
12420 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
12430 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
12440 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
12450 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  ' constraint and
12460 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65   there are no de
12470 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20  ferred foreign. 
12480 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20           ** key 
12490 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
124a0 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
124b0 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
124c0 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
124d0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
124e0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
124f0 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
12500 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
12510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12520 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
12530 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  Y && p->readOnly
12540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
12550 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
12560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
12570 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
12580 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
125a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
125b0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
125c0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
125d0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
125e0 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  E_OK);.         
125f0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
12600 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12610 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
12620 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
12630 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
12640 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
12650 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
12660 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
12670 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20  ITE_DeferFKs;.  
12680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
12690 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
126a0 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
126b0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
126c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
126d0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
126e0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
126f0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
12700 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
12710 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
12720 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
12730 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
12740 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
12750 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12760 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
12770 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
12780 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
12790 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
127a0 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20  _RELEASE;.      
127b0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
127c0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
127d0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  rt ){.        eS
127e0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
127f0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
12800 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12810 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
12820 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
12830 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
12840 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
12850 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
12860 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
12870 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
12880 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
12890 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
128a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
128b0 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65    /* If eStateme
128c0 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ntOp is non-zero
128d0 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65  , then a stateme
128e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  nt transaction n
128f0 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
12900 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
12910 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c  olled back. Call
12920 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
12930 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a  eStatement() to.
12940 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66      ** do so. If
12950 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
12960 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
12970 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
12980 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
12990 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
129a0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
129b0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
129c0 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68   then promote th
129d0 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
129e0 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72   statement error
129f0 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   code..    */.  
12a00 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
12a10 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
12a20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
12a30 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
12a40 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
12a50 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
12a60 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
12a70 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
12a80 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
12a90 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
12aa0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
12ab0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
12ac0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12ad0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
12ae0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
12af0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
12b00 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
12b10 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
12b20 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
12b30 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
12b40 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
12b50 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
12b60 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
12b70 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
12b80 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
12b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12ba0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
12bb0 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
12bc0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
12bd0 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
12be0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
12bf0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
12c00 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
12c10 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
12c20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
12c30 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
12c40 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
12c50 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
12c60 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
12c70 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
12c80 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
12c90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
12ca0 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
12cb0 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
12cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
12cd0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
12ce0 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
12cf0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
12d00 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
12d10 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
12d20 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
12d30 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
12d40 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ve(p);.  }..  /*
12d50 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
12d60 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
12d70 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
12d80 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
12d90 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
12da0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
12db0 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20  nVdbeActive--;. 
12dc0 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
12dd0 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57  nly ) db->nVdbeW
12de0 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  rite--;.    if( 
12df0 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64  p->bIsReader ) d
12e00 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a  b->nVdbeRead--;.
12e10 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12e20 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d  nVdbeActive>=db-
12e30 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20  >nVdbeRead );.  
12e40 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
12e50 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64  dbeRead>=db->nVd
12e60 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61  beWrite );.    a
12e70 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
12e80 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a  Write>=0 );.  }.
12e90 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
12ea0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
12eb0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
12ec0 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
12ed0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
12ee0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
12ef0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12f00 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
12f10 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
12f20 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
12f30 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
12f40 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
12f50 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
12f60 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
12f70 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
12f80 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
12f90 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
12fa0 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
12fb0 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
12fc0 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
12fd0 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
12fe0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
12ff0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
13000 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
13010 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
13020 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
13030 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
13040 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
13050 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
13060 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
13070 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
13080 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
13090 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
130a0 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
130b0 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
130c0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
130d0 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
130e0 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
130f0 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
13100 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
13110 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
13120 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
13130 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
13140 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
13150 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
13160 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13170 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
13180 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
13190 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
131a0 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
131b0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
131c0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
131d0 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
131e0 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
131f0 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
13200 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
13210 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
13220 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
13230 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
13240 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13250 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
13260 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
13270 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
13280 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
13290 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
132a0 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
132b0 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
132c0 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
132d0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
132e0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
132f0 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
13300 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
13310 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46  {.    u8 mallocF
13320 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
13330 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71  ocFailed;.    sq
13340 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
13350 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66  Malloc();.    if
13360 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20  ( db->pErr==0 ) 
13370 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74  db->pErr = sqlit
13380 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
13390 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
133a0 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
133b0 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
133c0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
133d0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
133e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
133f0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
13400 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
13410 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c  led = mallocFail
13420 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43  ed;.    db->errC
13430 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73  ode = rc;.  }els
13440 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
13450 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d  ror(db, rc);.  }
13460 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13470 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
13480 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a  NABLE_SQLLOG./*.
13490 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f  ** If an SQLITE_
134a0 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f  CONFIG_SQLLOG ho
134b0 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ok is registered
134c0 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20   and the VM has 
134d0 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e  been run, .** in
134e0 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  voke it..*/.stat
134f0 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f  ic void vdbeInvo
13500 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76  keSqllog(Vdbe *v
13510 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
13520 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
13530 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53  llog && v->rc==S
13540 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a  QLITE_OK && v->z
13550 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20  Sql && v->pc>=0 
13560 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78  ){.    char *zEx
13570 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33  panded = sqlite3
13580 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c  VdbeExpandSql(v,
13590 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61   v->zSql);.    a
135a0 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e  ssert( v->db->in
135b0 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
135c0 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20    if( zExpanded 
135d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
135e0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
135f0 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20  llog(.          
13600 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
13610 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
13620 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
13630 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 1.      );.   
13640 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13650 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65  (v->db, zExpande
13660 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  d);.    }.  }.}.
13670 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
13680 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
13690 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
136a0 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
136b0 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
136c0 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
136d0 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
136e0 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
136f0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
13700 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
13710 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
13720 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
13730 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
13740 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
13750 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
13760 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
13770 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
13780 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
13790 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
137a0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
137b0 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
137c0 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
137d0 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
137e0 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
137f0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
13800 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
13810 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
13820 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
13830 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
13840 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
13850 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
13860 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
13870 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
13880 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
13890 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
138a0 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
138b0 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
138c0 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
138d0 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
138e0 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
138f0 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
13900 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
13910 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
13920 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
13930 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
13940 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
13950 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
13960 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
13970 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
13980 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
13990 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
139a0 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
139b0 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
139c0 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
139d0 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
139e0 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
139f0 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
13a00 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
13a10 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
13a20 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
13a30 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
13a40 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
13a50 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
13a60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13a70 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
13a80 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
13a90 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
13aa0 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
13ab0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
13ac0 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  f( p->runOnlyOnc
13ad0 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  e ) p->expired =
13ae0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
13af0 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
13b00 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
13b10 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
13b20 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
13b30 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
13b40 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
13b50 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
13b60 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
13b70 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
13b80 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
13b90 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
13ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
13bb0 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
13bc0 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
13bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13be0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e  rWithMsg(db, p->
13bf0 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f  rc, p->zErrMsg ?
13c00 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45   "%s" : 0, p->zE
13c10 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
13c20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
13c30 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
13c40 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
13c50 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
13c60 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
13c70 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
13c80 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
13c90 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
13ca0 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
13cb0 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
13cc0 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
13cd0 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
13ce0 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
13cf0 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
13d00 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
13d10 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
13d20 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
13d30 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
13d40 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
13d50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
13d60 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
13d70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
13d80 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
13d90 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
13da0 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
13db0 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
13dc0 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
13dd0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c  .        char c,
13de0 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
13df0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
13e00 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  - ");.        fo
13e10 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a  r(i=0; (c = p->z
13e20 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  Sql[i])!=0; i++)
13e30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13e40 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc=='\n' ) fprin
13e50 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
13e60 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63            putc(c
13e70 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  , out);.        
13e80 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20    pc = c;.      
13e90 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
13ea0 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc!='\n' ) fprin
13eb0 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
13ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
13ed0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
13ee0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
13ef0 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar zHdr[100];.  
13f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
13f10 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48  printf(sizeof(zH
13f20 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20  dr), zHdr, "%6u 
13f30 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a  %12llu %8llu ",.
13f40 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
13f50 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
13f60 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
13f70 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
13f80 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
13f90 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
13fa0 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
13fb0 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
13fc0 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
13fd0 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64  f(out, "%s", zHd
13fe0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
13ff0 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
14000 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
14010 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
14020 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
14030 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
14040 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d    p->iCurrentTim
14050 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = 0;.  p->magi
14060 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
14070 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
14080 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
14090 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
140a0 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
140b0 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
140c0 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
140d0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
140e0 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
140f0 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
14100 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
14110 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
14120 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
14130 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
14140 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
14150 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14160 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
14170 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
14180 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
14190 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
141a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
141b0 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
141c0 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
141d0 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
141e0 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
141f0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
14200 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
14210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72  .}../*.** If par
14220 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65  ameter iOp is le
14230 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
14240 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  en invoke the de
14250 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20  structor for.** 
14260 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61  all auxiliary da
14270 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72  ta pointers curr
14280 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20  ently cached by 
14290 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
142a0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
142b0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  gument..**.** Or
142c0 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61  , if iOp is grea
142d0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
142e0 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  l to zero, then 
142f0 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
14300 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  s.** only invoke
14310 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69  d for those auxi
14320 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
14330 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74  ers created by t
14340 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63  he user .** func
14350 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20  tion invoked by 
14360 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  the OP_Function 
14370 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75  opcode at instru
14380 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a  ction iOp of .**
14390 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f   VM pVdbe, and o
143a0 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a  nly then if:.**.
143b0 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f  **    * the asso
143c0 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  ciated function 
143d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
143e0 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28   32nd or later (
143f0 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20  counting.**     
14400 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
14410 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  ght), or.**.**  
14420 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f    * the correspo
14430 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67  nding bit in arg
14440 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c  ument mask is cl
14450 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66  ear (where the f
14460 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e  irst.**      fun
14470 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
14480 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62  corresponds to b
14490 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76  it 0 etc.)..*/.v
144a0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
144b0 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
144c0 65 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f  e *pVdbe, int iO
144d0 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
144e0 41 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26  AuxData **pp = &
144f0 70 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b  pVdbe->pAuxData;
14500 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b  .  while( *pp ){
14510 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41  .    AuxData *pA
14520 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66  ux = *pp;.    if
14530 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c  ( (iOp<0).     |
14540 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f  | (pAux->iOp==iO
14550 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67  p && (pAux->iArg
14560 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20  >31 || !(mask & 
14570 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e  MASKBIT32(pAux->
14580 69 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a  iArg)))).    ){.
14590 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
145a0 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29  pAux->iArg==31 )
145b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  ;.      if( pAux
145c0 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
145d0 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
145e0 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
145f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
14600 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b  p = pAux->pNext;
14610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
14620 46 72 65 65 28 70 56 64 62 65 2d 3e 64 62 2c 20  Free(pVdbe->db, 
14630 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
14640 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
14650 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
14660 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
14670 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
14680 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
14690 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
146a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
146b0 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
146c0 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
146d0 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
146e0 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
146f0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
14700 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
14710 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
14720 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
14730 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
14740 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
14750 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
14760 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
14770 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
14780 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
14790 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
147a0 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
147b0 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
147c0 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
147d0 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
147e0 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
147f0 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
14800 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Next;.  int i;. 
14810 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
14820 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
14830 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
14840 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
14850 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65  nVar);.  release
14860 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
14870 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
14880 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
14890 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
148a0 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
148b0 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
148c0 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
148d0 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
148e0 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
148f0 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
14900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
14910 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
14920 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e    }.  for(i=p->n
14930 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  zVar-1; i>=0; i-
14940 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  -) sqlite3DbFree
14950 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d  (db, p->azVar[i]
14960 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41  );.  vdbeFreeOpA
14970 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c  rray(db, p->aOp,
14980 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69   p->nOp);.  sqli
14990 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
149a0 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  >aColName);.  sq
149b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
149c0 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69  p->zSql);.  sqli
149d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
149e0 3e 70 46 72 65 65 29 3b 0a 23 69 66 64 65 66 20  >pFree);.#ifdef 
149f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14a00 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
14a10 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
14a20 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  can; i++){.    s
14a30 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14a40 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61   p->aScan[i].zNa
14a50 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
14a60 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14a70 61 53 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d  aScan);.#endif.}
14a80 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
14a90 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
14aa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
14ab0 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
14ac0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
14ad0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
14ae0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
14af0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
14b00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14b10 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
14b20 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
14b30 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
14b40 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  (db, p);.  if( p
14b50 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
14b60 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
14b70 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
14b80 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
14b90 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
14ba0 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
14bb0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
14bc0 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
14bd0 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
14be0 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
14bf0 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
14c00 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
14c10 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20  ;.  p->db = 0;. 
14c20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14c30 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
14c40 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68  The cursor "p" h
14c50 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65  as a pending see
14c60 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  k operation that
14c70 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
14c80 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74  n.** carried out
14c90 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73  .  Seek the curs
14ca0 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65  or now.  If an e
14cb0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
14cc0 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  urn.** the appro
14cd0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
14ce0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14cf0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
14d00 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
14d10 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
14d20 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c   *p){.  int res,
14d30 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
14d40 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e  TE_TEST.  extern
14d50 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
14d60 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
14d70 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  f.  assert( p->d
14d80 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b  eferredMoveto );
14d90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73  .  assert( p->is
14da0 54 61 62 6c 65 20 29 3b 0a 20 20 72 63 20 3d 20  Table );.  rc = 
14db0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
14dc0 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43  toUnpacked(p->pC
14dd0 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76  ursor, 0, p->mov
14de0 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
14df0 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  es);.  if( rc ) 
14e00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
14e10 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
14e20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
14e30 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c  BKPT;.#ifdef SQL
14e40 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
14e50 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
14e60 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64  +;.#endif.  p->d
14e70 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
14e80 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  0;.  p->cacheSta
14e90 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
14ea0 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  E;.  return SQLI
14eb0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14ec0 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f  Something has mo
14ed0 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f  ved cursor "p" o
14ee0 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61  ut of place.  Ma
14ef0 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77  ybe the row it w
14f00 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  as.** pointed to
14f10 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
14f20 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20   from under it. 
14f30 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74   Or maybe the bt
14f40 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c  ree was.** rebal
14f50 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72  anced.  Whatever
14f60 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20   the cause, try 
14f70 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74  to restore "p" t
14f80 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a  o the place it.*
14f90 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  * is supposed to
14fa0 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49   be pointing.  I
14fb0 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65  f the row was de
14fc0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
14fd0 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73  nder the.** curs
14fe0 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73  or, set the curs
14ff0 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  or to point to a
15000 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74   NULL row..*/.st
15010 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
15020 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d  NOINLINE handleM
15030 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43  ovedCursor(VdbeC
15040 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
15050 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c   isDifferentRow,
15060 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
15070 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
15080 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15090 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
150a0 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29  oved(p->pCursor)
150b0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
150c0 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
150d0 74 6f 72 65 28 70 2d 3e 70 43 75 72 73 6f 72 2c  tore(p->pCursor,
150e0 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77   &isDifferentRow
150f0 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  );.  p->cacheSta
15100 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
15110 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65  E;.  if( isDiffe
15120 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c  rentRow ) p->nul
15130 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75  lRow = 1;.  retu
15140 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15150 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20  Check to ensure 
15160 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
15170 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f  is valid.  Resto
15180 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  re the cursor.**
15190 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65   if need be.  Re
151a0 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72  turn any I/O err
151b0 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74  or from the rest
151c0 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ore operation..*
151d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
151e0 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56  eCursorRestore(V
151f0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
15200 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
15210 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
15220 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  p->pCursor) ){. 
15230 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
15240 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
15250 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15260 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15270 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
15280 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
15290 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
152a0 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
152b0 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
152c0 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
152d0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
152e0 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
152f0 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
15300 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
15310 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
15320 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
15330 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
15340 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
15350 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
15360 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
15370 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
15380 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
15390 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
153a0 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
153b0 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
153c0 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
153d0 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
153e0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
153f0 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
15400 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
15410 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
15420 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
15430 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
15440 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
15450 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
15460 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
15470 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
15480 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
15490 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
154a0 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
154b0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
154c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
154d0 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
154e0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
154f0 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
15500 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
15510 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66  return handleDef
15520 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a  erredMoveto(p);.
15530 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 43 75    }.  if( p->pCu
15540 72 73 6f 72 20 26 26 20 73 71 6c 69 74 65 33 42  rsor && sqlite3B
15550 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
15560 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  ed(p->pCursor) )
15570 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  {.    return han
15580 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70  dleMovedCursor(p
15590 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
155a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
155b0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
155c0 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
155d0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
155e0 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71  rialType().** sq
155f0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
15600 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ypeLen().** sqli
15610 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
15620 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
15630 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20  eSerialPut().** 
15640 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15650 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  lGet().**.** enc
15660 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
15670 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
15680 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
15690 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
156a0 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
156b0 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
156c0 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
156d0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
156e0 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
156f0 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
15700 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
15710 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
15720 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
15730 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
15740 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
15750 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
15760 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
15770 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
15780 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
15790 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
157a0 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
157b0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
157c0 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
157d0 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
157e0 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
157f0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
15800 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
15810 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
15820 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
15830 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
15840 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
15850 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
15860 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
15870 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
15880 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e  blob separately.
15890 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
158a0 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
158b0 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
158c0 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
158d0 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
158e0 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
158f0 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
15900 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
15910 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
15920 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
15930 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
15940 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
15950 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
15960 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
15970 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
15980 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
15990 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
159a0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
159b0 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159d0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
159e0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
159f0 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
15a00 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
15a10 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
15a20 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a40 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
15a50 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
15a60 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
15a80 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
15a90 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
15aa0 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
15ab0 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
15ac0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
15ad0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
15b00 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
15b10 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
15b20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
15b30 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
15b40 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
15b50 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
15b60 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
15b70 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
15b80 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
15b90 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bb0 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
15bc0 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
15bd0 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
15be0 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
15bf0 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
15c00 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
15c10 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
15c20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
15c30 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
15c40 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
15c50 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
15c60 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
15c70 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
15c80 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
15c90 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
15ca0 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
15cb0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
15cc0 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
15cd0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
15ce0 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
15cf0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15d00 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
15d10 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
15d20 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
15d30 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
15d40 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c  u32 n;..  if( fl
15d50 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
15d60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15d70 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
15d80 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
15d90 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
15da0 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
15db0 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
15dc0 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
15dd0 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
15de0 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
15df0 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
15e00 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
15e10 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69  u64 u;.    if( i
15e20 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20  <0 ){.      u = 
15e30 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ~i;.    }else{. 
15e40 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20       u = i;.    
15e50 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  }.    if( u<=127
15e60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15e70 20 28 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69   ((i&1)==i && fi
15e80 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20  le_format>=4) ? 
15e90 38 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20  8+(u32)u : 1;.  
15ea0 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33    }.    if( u<=3
15eb0 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b  2767 ) return 2;
15ec0 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38  .    if( u<=8388
15ed0 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a  607 ) return 3;.
15ee0 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
15ef0 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34  83647 ) return 4
15f00 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  ;.    if( u<=MAX
15f10 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20  _6BYTE ) return 
15f20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  5;.    return 6;
15f30 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
15f40 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
15f50 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
15f60 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
15f70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15f80 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
15f90 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
15fa0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
15fb0 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
15fc0 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
15fd0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
15fe0 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
15ff0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
16000 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
16010 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
16020 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
16030 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16040 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
16050 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
16060 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
16070 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
16080 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
16090 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
160a0 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
160b0 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
160c0 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
160d0 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
160e0 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
160f0 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
16100 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20  onst u8 aSize[] 
16110 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20  = { 0, 1, 2, 3, 
16120 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30  4, 6, 8, 8, 0, 0
16130 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65  , 0, 0 };.    re
16140 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61  turn aSize[seria
16150 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a  l_type];.  }.}..
16160 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
16170 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
16180 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
16190 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
161a0 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
161b0 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
161c0 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
161d0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
161e0 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
161f0 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
16200 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
16210 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
16220 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
16230 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
16240 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
16250 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
16260 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
16270 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
16280 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
16290 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
162a0 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
162b0 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
162c0 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
162d0 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
162e0 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
162f0 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
16300 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
16310 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
16320 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
16330 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
16340 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
16350 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
16360 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
16370 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
16380 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
16390 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
163a0 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
163b0 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
163c0 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
163d0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
163e0 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
163f0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
16400 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
16410 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
16420 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
16430 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
16440 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
16450 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
16460 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
16470 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
16480 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
16490 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
164a0 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
164b0 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
164c0 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
164d0 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
164e0 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
164f0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
16500 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   correct..**.** 
16510 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72  (2007-08-30)  Fr
16520 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73  ank van Vugt has
16530 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72   studied this pr
16540 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a  oblem closely.**
16550 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69   and has send hi
16560 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68  s findings to th
16570 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70  e SQLite develop
16580 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77  ers.  Frank.** w
16590 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20  rites that some 
165a0 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66  Linux kernels of
165b0 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  fer floating poi
165c0 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65  nt hardware.** e
165d0 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73  mulation that us
165e0 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d  es only 32-bit m
165f0 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64  antissas instead
16600 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34   of a full .** 4
16610 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72  8-bits as requir
16620 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73  ed by the IEEE s
16630 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20  tandard.  (This 
16640 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47  is the.** CONFIG
16650 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74  _FPE_FASTFPE opt
16660 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73  ion.)  On such s
16670 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67  ystems, floating
16680 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73   point.** byte s
16690 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20  wapping becomes 
166a0 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64  very complicated
166b0 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62  .  To avoid prob
166c0 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63  lems,.** the nec
166d0 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70  essary byte swap
166e0 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20  ping is carried 
166f0 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62  out using a 64-b
16700 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61  it integer.** ra
16710 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62  ther than a 64-b
16720 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b  it float.  Frank
16730 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74   assures us that
16740 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a   the code here.*
16750 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e  * works for him.
16760 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f    We, the develo
16770 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61  pers, have no wa
16780 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74  y to independent
16790 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69  ly.** verify thi
167a0 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65  s, but Frank see
167b0 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20  ms to know what 
167c0 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62  he is talking ab
167d0 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75  out.** so we tru
167e0 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65  st him..*/.#ifde
167f0 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
16800 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
16810 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f  T.static u64 flo
16820 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a  atSwap(u64 in){.
16830 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36    union {.    u6
16840 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32  4 r;.    u32 i[2
16850 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  ];.  } u;.  u32 
16860 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a  t;..  u.r = in;.
16870 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20    t = u.i[0];.  
16880 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b  u.i[0] = u.i[1];
16890 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20  .  u.i[1] = t;. 
168a0 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23   return u.r;.}.#
168b0 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
168c0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20  dEndianFloat(X) 
168d0 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58   X = floatSwap(X
168e0 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
168f0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
16900 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a  Float(X).#endif.
16910 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
16920 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
16930 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
16940 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
16950 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
16960 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
16970 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
16980 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
16990 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
169a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
169b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
169c0 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66  tten..**.** nBuf
169d0 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   is the amount o
169e0 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  f space left in 
169f0 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c  buf[].  The call
16a00 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
16a10 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74  e.** for allocat
16a20 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ing enough space
16a30 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c   to buf[] to hol
16a40 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
16a50 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  ld, exclusive.**
16a60 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e   of the pMem->u.
16a70 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20  nZero bytes for 
16a80 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65  a MEM_Zero value
16a90 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
16aa0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
16ab0 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  es actually writ
16ac0 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  ten into buf[]. 
16ad0 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
16ae0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a  f bytes in the z
16af0 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20  ero-filled tail 
16b00 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
16b10 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
16b20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65  only.** if those
16b30 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f   bytes were zero
16b40 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20  ed in buf[]..*/ 
16b50 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
16b60 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75  SerialPut(u8 *bu
16b70 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33  f, Mem *pMem, u3
16b80 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
16b90 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
16ba0 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
16bb0 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
16bc0 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
16bd0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
16be0 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
16bf0 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
16c00 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
16c10 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
16c20 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
16c30 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20  em->u.r) );.    
16c40 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
16c50 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28  em->u.r, sizeof(
16c60 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d  v));.      swapM
16c70 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
16c80 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
16c90 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75       v = pMem->u
16ca0 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  .i;.    }.    le
16cb0 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56  n = i = sqlite3V
16cc0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
16cd0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
16ce0 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
16cf0 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
16d00 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28  buf[--i] = (u8)(
16d10 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
16d20 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69   >>= 8;.    }whi
16d30 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74  le( i );.    ret
16d40 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
16d50 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
16d60 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
16d70 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
16d80 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
16d90 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
16da0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
16db0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
16dd0 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
16de0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
16df0 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
16e00 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
16e10 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
16e20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
16e30 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
16e40 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
16e50 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
16e60 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
16e70 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
16e80 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
16e90 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
16ea0 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
16eb0 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
16ec0 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
16ed0 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
16ee0 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
16ef0 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
16f00 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
16f10 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
16f20 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
16f30 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
16f40 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
16f50 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
16f60 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
16f70 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
16f80 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
16f90 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
16fa0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
16fb0 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
16fc0 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
16fd0 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
16fe0 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
16ff0 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
17000 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
17010 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
17020 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
17030 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
17040 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
17050 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
17060 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
17070 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
17080 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
17090 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
170a0 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
170b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
170c0 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
170d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
170e0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
170f0 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
17100 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
17110 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
17120 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
17130 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
17140 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
17150 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
17160 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
17170 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
17180 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
17190 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
171a0 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
171b0 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
171c0 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45  tatic u32 SQLITE
171d0 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c  _NOINLINE serial
171e0 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
171f0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
17200 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
17210 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
17220 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
17230 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
17240 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
17250 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
17260 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
17270 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
17280 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
17290 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
172a0 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
172b0 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
172c0 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
172d0 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
172e0 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
172f0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
17300 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
17310 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f  type==6 ){.    /
17320 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17330 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c  -29851-52272 Val
17340 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
17350 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  an 64-bit.    **
17360 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
17370 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
17380 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
17390 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d  64*)&x;.    pMem
173a0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
173b0 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  t;.    testcase(
173c0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
173d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
173e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
173f0 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65  7343-49114 Value
17400 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
17410 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36   IEEE 754-2008 6
17420 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f  4-bit.    ** flo
17430 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62  ating point numb
17440 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  er. */.#if !defi
17450 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
17460 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
17470 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
17480 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
17490 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
174a0 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
174b0 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
174c0 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
174d0 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
174e0 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
174f0 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
17500 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
17510 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
17520 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
17530 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
17540 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
17550 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
17560 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
17570 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
17580 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
17590 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
175a0 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
175b0 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
175c0 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
175d0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
175e0 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
175f0 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
17600 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
17610 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
17620 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
17630 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
17640 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
17650 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
17660 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
17670 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
17680 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
17690 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
176a0 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
176b0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
176c0 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
176d0 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  >u.r) ? MEM_Null
176e0 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
176f0 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
17700 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
17710 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
17720 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17730 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
17740 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
17750 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
17760 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
17770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
17780 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
17790 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
177a0 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
177b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
177c0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
177d0 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
177e0 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
177f0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
17800 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
17810 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
17820 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
17830 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
17840 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
17850 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
17860 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f  0: {  /* Null */
17870 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
17880 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30  CE-OF: R-24078-0
17890 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20  9375 Value is a 
178a0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70  NULL. */.      p
178b0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
178c0 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
178d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
178e0 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  se 1: {.      /*
178f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17900 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75  44885-25196 Valu
17910 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77  e is an 8-bit tw
17920 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20  os-complement.  
17930 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
17940 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
17950 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  .i = ONE_BYTE_IN
17960 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
17970 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
17980 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
17990 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
179a0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
179b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
179c0 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
179d0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
179e0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
179f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39  DENCE-OF: R-4979
17a00 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73  4-35026 Value is
17a10 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36   a big-endian 16
17a20 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
17a30 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
17a40 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
17a50 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f  pMem->u.i = TWO_
17a60 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
17a70 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
17a80 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
17a90 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
17aa0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
17ab0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
17ac0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
17ad0 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
17ae0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
17af0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
17b00 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56   R-37839-54301 V
17b10 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
17b20 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20  dian 24-bit.    
17b30 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
17b40 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
17b50 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
17b60 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
17b70 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
17b80 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
17b90 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
17ba0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
17bb0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
17bc0 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
17bd0 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
17be0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
17bf0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
17c00 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34  DENCE-OF: R-0184
17c10 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73  9-26079 Value is
17c20 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32   a big-endian 32
17c30 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
17c40 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
17c50 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
17c60 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
17c70 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
17c80 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
17c90 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
17ca0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
17cb0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
17cc0 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
17cd0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
17ce0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
17cf0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
17d00 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17d10 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20  : R-50385-09674 
17d20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
17d30 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20  ndian 48-bit.   
17d40 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
17d50 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
17d60 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
17d70 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  i = FOUR_BYTE_UI
17d80 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69  NT(buf+2) + (((i
17d90 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
17da0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
17db0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
17dc0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
17dd0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
17de0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
17df0 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
17e00 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
17e10 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
17e20 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
17e30 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
17e40 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
17e50 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65  /.      /* These
17e60 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61   use local varia
17e70 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d  bles, so do them
17e80 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72   in a separate r
17e90 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
17ea0 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
17eb0 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d  to move the fram
17ec0 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  e pointer in the
17ed0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
17ee0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72        return ser
17ef0 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61  ialGet(buf,seria
17f00 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20  l_type,pMem);.  
17f10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
17f20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
17f30 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
17f40 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
17f50 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
17f60 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d  NCE-OF: R-12976-
17f70 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74  22893 Value is t
17f80 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f  he integer 0. */
17f90 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
17fa0 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31  CE-OF: R-18143-1
17fb0 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68  2121 Value is th
17fc0 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a  e integer 1. */.
17fd0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
17fe0 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
17ff0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
18000 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
18010 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18020 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
18030 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
18040 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36  ENCE-OF: R-14606
18050 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20  -31564 Value is 
18060 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28  a BLOB that is (
18070 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e  N-12)/2 bytes in
18080 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68  .      ** length
18090 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  ..      ** EVIDE
180a0 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d  NCE-OF: R-28401-
180b0 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61  00140 Value is a
180c0 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74   string in the t
180d0 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64  ext encoding and
180e0 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29  .      ** (N-13)
180f0 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  /2 bytes in leng
18100 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  th. */.      sta
18110 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46  tic const u16 aF
18120 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c  lag[] = { MEM_Bl
18130 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45  ob|MEM_Ephem, ME
18140 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20  M_Str|MEM_Ephem 
18150 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  };.      pMem->z
18160 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
18170 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
18180 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
18190 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
181a0 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65  flags = aFlag[se
181b0 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20  rial_type&1];.  
181c0 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d      return pMem-
181d0 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  >n;.    }.  }.  
181e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a  return 0;.}./*.*
181f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18200 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
18210 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
18220 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
18230 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
18240 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
18250 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
18260 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
18270 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
18280 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
18290 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
182a0 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
182b0 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
182c0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
182d0 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
182e0 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
182f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
18300 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
18310 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
18320 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
18330 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
18340 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
18350 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
18360 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
18370 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
18380 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
18390 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
183a0 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
183b0 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
183c0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
183d0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
183e0 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
183f0 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
18400 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
18410 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
18420 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
18430 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
18440 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
18450 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
18460 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
18470 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
18480 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
18490 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
184a0 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
184b0 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
184c0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
184d0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
184e0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
184f0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
18500 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
18510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
18520 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
18530 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ailable */.  int
18540 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20   szSpace,       
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18560 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
18570 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
18580 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20  har **ppFree    
18590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
185a0 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68  * OUT: Caller sh
185b0 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70  ould free this p
185c0 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55  ointer */.){.  U
185d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
185e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
185f0 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
18600 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
18610 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18630 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53   /* Increment pS
18640 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20  pace by nOff to 
18650 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e  align it */.  in
18660 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18680 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
18690 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
186a0 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e   */..  /* We wan
186b0 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
186c0 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
186d0 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
186e0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
186f0 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
18700 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
18710 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
18720 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
18730 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
18740 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
18750 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
18760 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
18770 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
18780 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
18790 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
187a0 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
187b0 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79  & 7)) & 7;.  nBy
187c0 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
187d0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
187e0 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
187f0 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
18800 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
18810 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
18820 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
18830 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
18840 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
18850 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
18860 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
18870 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
18880 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
18890 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
188a0 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
188b0 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
188c0 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
188d0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
188e0 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
188f0 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
18900 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
18910 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
18920 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
18930 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
18940 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
18950 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
18960 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
18970 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
18980 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
18990 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
189a0 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
189b0 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
189c0 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74   pKey[], populat
189d0 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b  e the .** Unpack
189e0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
189f0 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
18a00 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
18a10 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ent with the.** 
18a20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18a30 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a  decoded record..
18a40 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
18a50 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
18a60 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
18a70 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
18a80 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
18a90 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
18aa0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18ac0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
18ad0 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
18ae0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
18af0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
18b00 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
18b10 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
18b20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  *p      /* Popul
18b30 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ate this structu
18b40 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
18b50 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ing. */.){.  con
18b60 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
18b70 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
18b80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
18b90 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a  pKey;.  int d; .
18ba0 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20    u32 idx;      
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bc0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61    /* Offset in a
18bd0 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  Key[] to read fr
18be0 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20  om */.  u16 u;  
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
18c10 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
18c20 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
18c30 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
18c40 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65  ->aMem;..  p->de
18c50 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
18c60 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
18c70 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
18c80 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
18c90 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
18ca0 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
18cb0 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
18cc0 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
18cd0 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20   && d<=nKey ){. 
18ce0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
18cf0 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20  pe;..    idx += 
18d00 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
18d10 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74  y[idx], serial_t
18d20 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ype);.    pMem->
18d30 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
18d40 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
18d50 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
18d60 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66  ;.    /* pMem->f
18d70 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c  lags = 0; // sql
18d80 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
18d90 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69  t() will set thi
18da0 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  s for us */.    
18db0 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d  pMem->szMalloc =
18dc0 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20   0;.    pMem->z 
18dd0 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
18de0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
18df0 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
18e00 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
18e10 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
18e20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e   if( (++u)>=p->n
18e30 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20  Field ) break;. 
18e40 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d   }.  assert( u<=
18e50 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
18e60 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
18e70 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20  eld = u;.}..#if 
18e80 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
18e90 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18ea0 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e   compares two in
18eb0 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63  dex or table rec
18ec0 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ord keys in the 
18ed0 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74  same way.** as t
18ee0 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
18ef0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f  cordCompare() ro
18f00 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64  utine. Unlike Vd
18f10 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
18f20 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
18f30 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
18f40 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61   and compares va
18f50 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a  lues using the.*
18f60 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
18f70 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c  ialGet() and sql
18f80 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
18f90 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69   functions. It i
18fa0 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73  s used.** in ass
18fb0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
18fc0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
18fd0 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f  the optimized co
18fe0 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  de in.** sqlite3
18ff0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
19000 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75  e() returns resu
19010 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74  lts with these t
19020 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a  wo primitives..*
19030 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
19040 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f   if the result o
19050 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
19060 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65  equivalent to de
19070 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20  siredResult..** 
19080 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
19090 74 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67  there is a disag
190a0 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  reement..*/.stat
190b0 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
190c0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20  dCompareDebug(. 
190d0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
190e0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
190f0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
19100 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
19110 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a  cord *pPKey2, /*
19120 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
19130 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c  int desiredResul
19140 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
19150 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   Correct answer 
19160 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
19170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
19180 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
19190 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
191a0 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
191b0 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dx1;          /*
191c0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
191d0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
191e0 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
191f0 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
19200 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19210 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
19220 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
19230 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
19240 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
19250 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
19260 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
19270 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
19280 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
19290 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
192a0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
192b0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66  ->pKeyInfo;.  if
192c0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ( pKeyInfo->db==
192d0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
192e0 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
192f0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
19300 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
19310 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
19320 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
19330 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
19340 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
19350 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
19360 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
19370 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
19380 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
19390 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
193a0 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
193b0 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
193c0 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
193d0 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
193e0 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
193f0 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
19400 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
19410 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
19420 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
19430 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
19440 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
19450 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
19460 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
19470 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
19480 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
19490 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
194a0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
194b0 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
194c0 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
194d0 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
194e0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
194f0 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
19500 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
19510 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
19520 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
19530 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
19540 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
19550 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
19560 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
19570 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
19580 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
19590 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
195a0 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
195b0 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
195c0 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
195d0 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
195e0 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
195f0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
19600 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
19610 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
19620 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43  ey2->nField || C
19630 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
19640 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
19650 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
19660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
19670 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
19680 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
19690 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
196a0 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
196b0 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
196c0 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
196d0 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
196e0 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
196f0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
19700 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
19710 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
19720 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
19730 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20  rial_type1 );.. 
19740 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
19750 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
19760 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61  h key space rema
19770 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20  ining to avoid. 
19780 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
19790 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64  verread.  The "d
197a0 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
197b0 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  " subexpression 
197c0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61  will.    ** alwa
197d0 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ys be greater th
197e0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
197f0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71  he amount of req
19800 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e  uired key space.
19810 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74  .    ** Use that
19820 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74   approximation t
19830 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65  o avoid the more
19840 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20   expensive call 
19850 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
19860 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
19870 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d  en() in the comm
19880 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  on case..    */.
19890 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61      if( d1+seria
198a0 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e  l_type1+2>(u32)n
198b0 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b  Key1.     && d1+
198c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
198d0 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
198e0 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79  type1)>(u32)nKey
198f0 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  1 .    ){.      
19900 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
19910 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
19920 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
19930 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
19940 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
19950 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
19960 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
19970 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
19980 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
19990 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
199a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
199b0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
199c0 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
199d0 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  [i], pKeyInfo->a
199e0 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66  Coll[i]);.    if
199f0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
19a00 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
19a10 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
19a20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
19a30 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ow */.      if( 
19a40 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
19a50 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
19a60 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a     rc = -rc;  /*
19a70 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75   Invert the resu
19a80 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74  lt for DESC sort
19a90 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20   order. */.     
19aa0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65   }.      goto de
19ab0 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20  bugCompareEnd;. 
19ac0 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20     }.    i++;.  
19ad0 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48  }while( idx1<szH
19ae0 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
19af0 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a  >nField );..  /*
19b00 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
19b10 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
19b20 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
19b30 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
19b40 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
19b50 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
19b60 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
19b70 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
19b80 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
19b90 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
19ba0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
19bb0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
19bc0 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  1)..  */.  asser
19bd0 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
19be0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
19bf0 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
19c00 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  at one of the ke
19c10 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
19c20 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
19c30 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
19c40 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
19c50 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
19c60 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
19c70 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
19c80 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64    rc = pPKey2->d
19c90 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75  efault_rc;..debu
19ca0 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69  gCompareEnd:.  i
19cb0 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
19cc0 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72  ==0 && rc==0 ) r
19cd0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64  eturn 1;.  if( d
19ce0 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26  esiredResult<0 &
19cf0 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20  & rc<0 ) return 
19d00 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  1;.  if( desired
19d10 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30  Result>0 && rc>0
19d20 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
19d30 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
19d40 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
19d50 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
19d60 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
19d70 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
19d80 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
19d90 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
19da0 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
19db0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28  mber of fields (
19dc0 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20  a.k.a. columns) 
19dd0 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69  in the record gi
19de0 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e  ven by.** pKey,n
19df0 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79  Key.  The verify
19e00 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74   that this count
19e10 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
19e20 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a   equal to the.**
19e30 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20   limit given by 
19e40 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
19e50 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46   + pKeyInfo->nXF
19e60 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ield..**.** If t
19e70 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  his constraint i
19e80 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c  s not satisfied,
19e90 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
19ea0 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a  he high-speed.**
19eb0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
19ec0 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65  reInt() and vdbe
19ed0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
19ee0 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77  ing() routines w
19ef0 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20  ill.** not work 
19f00 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74  correctly.  If t
19f10 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65  his assert() eve
19f20 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62  r fires, it prob
19f30 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  ably means.** th
19f40 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e  at the KeyInfo.n
19f50 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f  Field or KeyInfo
19f60 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20  .nXField values 
19f70 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  were computed.**
19f80 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f   incorrectly..*/
19f90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
19fa0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
19fb0 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20  tWithinLimits(. 
19fc0 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74   int nKey, const
19fd0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
19fe0 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20  * The record to 
19ff0 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e  verify */ .  con
1a000 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  st KeyInfo *pKey
1a010 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f  Info       /* Co
1a020 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20  mpare size with 
1a030 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a  this KeyInfo */.
1a040 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20  ){.  int nField 
1a050 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72  = 0;.  u32 szHdr
1a060 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75  ;.  u32 idx;.  u
1a070 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f  32 notUsed;.  co
1a080 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1a090 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
1a0a0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
1a0b0 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52  pKey;..  if( COR
1a0c0 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
1a0d0 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
1a0e0 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
1a0f0 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b  r);.  assert( nK
1a100 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
1a110 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e  t( szHdr<=(u32)n
1a120 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  Key );.  while( 
1a130 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20  idx<szHdr ){.   
1a140 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e   idx += getVarin
1a150 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f  t32(aKey+idx, no
1a160 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65  tUsed);.    nFie
1a170 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ld++;.  }.  asse
1a180 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b  rt( nField <= pK
1a190 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
1a1a0 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1a1b0 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65   );.}.#else.# de
1a1c0 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 46  fine vdbeAssertF
1a1d0 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1a1e0 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e  imits(A,B,C).#en
1a1f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20  dif../*.** Both 
1a200 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d  *pMem1 and *pMem
1a210 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67  2 contain string
1a220 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65   values. Compare
1a230 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
1a240 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ** using the col
1a250 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1a260 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c  pColl. As usual,
1a270 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   return a negati
1a280 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ve , zero.** or 
1a290 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
1a2a0 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  f *pMem1 is less
1a2b0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
1a2c0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1a2d0 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70  .** *pMem2, resp
1a2e0 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61  ectively. Simila
1a2f0 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22  r in spirit to "
1a300 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20  rc = (*pMem1) - 
1a310 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73  (*pMem2);"..*/.s
1a320 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
1a330 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
1a340 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1a350 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  m1,.  const Mem 
1a360 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20  *pMem2,.  const 
1a370 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a  CollSeq *pColl,.
1a380 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20    u8 *prcErr    
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3a0 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f    /* If an OOM o
1a3b0 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51  ccurs, set to SQ
1a3c0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b  LITE_NOMEM */.){
1a3d0 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e  .  if( pMem1->en
1a3e0 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
1a3f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69  .    /* The stri
1a400 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ngs are already 
1a410 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65  in the correct e
1a420 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74  ncoding.  Call t
1a430 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61  he.     ** compa
1a440 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64  rison function d
1a450 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72  irectly */.    r
1a460 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d  eturn pColl->xCm
1a470 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70  p(pColl->pUser,p
1a480 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a  Mem1->n,pMem1->z
1a490 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d  ,pMem2->n,pMem2-
1a4a0 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >z);.  }else{.  
1a4b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f    int rc;.    co
1a4c0 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76  nst void *v1, *v
1a4d0 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e  2;.    int n1, n
1a4e0 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20  2;.    Mem c1;. 
1a4f0 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73     Mem c2;.    s
1a500 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1a510 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c1, pMem1->db
1a520 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1a530 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1a540 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e  nit(&c2, pMem1->
1a550 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
1a560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1a570 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31  mShallowCopy(&c1
1a580 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68  , pMem1, MEM_Eph
1a590 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
1a5a0 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
1a5b0 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d  py(&c2, pMem2, M
1a5c0 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76  EM_Ephem);.    v
1a5d0 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  1 = sqlite3Value
1a5e0 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
1a5f0 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d  lue*)&c1, pColl-
1a600 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20  >enc);.    n1 = 
1a610 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e  v1==0 ? 0 : c1.n
1a620 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74  ;.    v2 = sqlit
1a630 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1a640 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c  ite3_value*)&c2,
1a650 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1a660 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30    n2 = v2==0 ? 0
1a670 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20   : c2.n;.    rc 
1a680 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
1a690 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20  oll->pUser, n1, 
1a6a0 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20  v1, n2, v2);.   
1a6b0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1a6c0 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
1a6d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1a6e0 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
1a6f0 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76   if( (v1==0 || v
1a700 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 20  2==0) && prcErr 
1a710 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49  ) *prcErr = SQLI
1a720 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65  TE_NOMEM;.    re
1a730 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
1a740 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
1a750 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e  o blobs.  Return
1a760 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
1a770 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1a780 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20  the first.** is 
1a790 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1a7a0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
1a7b0 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c  than the second,
1a7c0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
1a7d0 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73  * If one blob is
1a7e0 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
1a7f0 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65   other, then the
1a800 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20   shorter is the 
1a810 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  lessor..*/.stati
1a820 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
1a830 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f  E int sqlite3Blo
1a840 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  bCompare(const M
1a850 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d  em *pB1, const M
1a860 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20  em *pB2){.  int 
1a870 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e  c = memcmp(pB1->
1a880 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e  z, pB2->z, pB1->
1a890 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e  n>pB2->n ? pB2->
1a8a0 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69  n : pB1->n);.  i
1a8b0 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b  f( c ) return c;
1a8c0 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e  .  return pB1->n
1a8d0 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f   - pB2->n;.}.../
1a8e0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
1a8f0 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65   values containe
1a900 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d  d by the two mem
1a910 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72  ory cells, retur
1a920 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65  ning.** negative
1a930 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69  , zero or positi
1a940 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c  ve if pMem1 is l
1a950 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1a960 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a  to, or greater.*
1a970 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f  * than pMem2. So
1a980 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e  rting order is N
1a990 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c  ULL's first, fol
1a9a0 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73  lowed by numbers
1a9b0 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e   (integers.** an
1a9c0 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20  d reals) sorted 
1a9d0 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c  numerically, fol
1a9e0 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72  lowed by text or
1a9f0 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c  dered by the col
1aa00 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
1aa10 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e  ce pColl and fin
1aa20 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65  ally blob's orde
1aa30 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e  red by memcmp().
1aa40 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
1aa50 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
1aa60 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74  dered equal by t
1aa70 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
1aa80 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43  .int sqlite3MemC
1aa90 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
1aaa0 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d   *pMem1, const M
1aab0 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74  em *pMem2, const
1aac0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
1aad0 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a  {.  int f1, f2;.
1aae0 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66    int combined_f
1aaf0 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d  lags;..  f1 = pM
1ab00 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32  em1->flags;.  f2
1ab10 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b   = pMem2->flags;
1ab20 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  .  combined_flag
1ab30 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73  s = f1|f2;.  ass
1ab40 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66  ert( (combined_f
1ab50 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
1ab60 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20  t)==0 );. .  /* 
1ab70 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1ab80 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73  NULL, it is less
1ab90 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e   than the other.
1aba0 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a   If both values.
1abb0 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72    ** are NULL, r
1abc0 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
1abd0 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1abe0 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
1abf0 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45     return (f2&ME
1ac00 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45  M_Null) - (f1&ME
1ac10 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20  M_Null);.  }..  
1ac20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1ac30 69 73 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20  is a number and 
1ac40 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
1ac50 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20  , the number is 
1ac60 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
1ac70 74 68 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20  th are numbers, 
1ac80 63 6f 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73  compare as reals
1ac90 20 69 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61   if one is a rea
1aca0 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72  l, or as integer
1acb0 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76  s.  ** if both v
1acc0 61 6c 75 65 73 20 61 72 65 20 69 6e 74 65 67 65  alues are intege
1acd0 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  rs..  */.  if( c
1ace0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d  ombined_flags&(M
1acf0 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
1ad00 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72   ){.    double r
1ad10 31 2c 20 72 32 3b 0a 20 20 20 20 69 66 28 20 28  1, r2;.    if( (
1ad20 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e  f1 & f2 & MEM_In
1ad30 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1ad40 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20  f( pMem1->u.i < 
1ad50 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1ad60 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1ad70 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70  ( pMem1->u.i > p
1ad80 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1ad90 72 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75  rn 1;.      retu
1ada0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1adb0 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c  if( (f1&MEM_Real
1adc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31  )!=0 ){.      r1
1add0 20 3d 20 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a 20   = pMem1->u.r;. 
1ade0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 31     }else if( (f1
1adf0 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1ae00 20 20 20 20 20 20 72 31 20 3d 20 28 64 6f 75 62        r1 = (doub
1ae10 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20  le)pMem1->u.i;. 
1ae20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ae30 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1ae40 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
1ae50 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1ae60 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 75 2e    r2 = pMem2->u.
1ae70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
1ae80 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f2&MEM_Int)!=0
1ae90 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 28   ){.      r2 = (
1aea0 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e  double)pMem2->u.
1aeb0 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
1aec0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1aed0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 31 3c     }.    if( r1<
1aee0 72 32 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  r2 ) return -1;.
1aef0 20 20 20 20 69 66 28 20 72 31 3e 72 32 20 29 20      if( r1>r2 ) 
1af00 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65  return 1;.    re
1af10 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1af20 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1af30 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74  s a string and t
1af40 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c  he other is a bl
1af50 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69  ob, the string i
1af60 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20  s less..  ** If 
1af70 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73  both are strings
1af80 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20  , compare using 
1af90 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  the collating fu
1afa0 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
1afb0 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1afc0 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
1afd0 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f    if( (f1 & MEM_
1afe0 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1aff0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1b000 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d  .    if( (f2 & M
1b010 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1b020 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1b030 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1b040 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d  ( pMem1->enc==pM
1b050 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20  em2->enc );.    
1b060 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1b070 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1b080 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1b090 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1b0a0 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
1b0b0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1b0c0 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
1b0d0 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
1b0e0 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
1b0f0 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
1b100 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
1b110 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
1b120 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
1b130 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1b140 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
1b150 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
1b160 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
1b170 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
1b180 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
1b190 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
1b1a0 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
1b1b0 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
1b1c0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1b1d0 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
1b1e0 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
1b1f0 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20  , pMem2, pColl, 
1b200 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
1b210 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   If a NULL point
1b220 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73  er was passed as
1b230 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e   the collate fun
1b240 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f  ction, fall thro
1b250 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ugh.    ** to th
1b260 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20  e blob case and 
1b270 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  use memcmp().  *
1b280 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74  /.  }. .  /* Bot
1b290 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  h values must be
1b2a0 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65   blobs.  Compare
1b2b0 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
1b2c0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71    */.  return sq
1b2d0 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1b2e0 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a  (pMem1, pMem2);.
1b2f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
1b300 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
1b310 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1b320 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
1b330 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
1b340 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
1b350 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
1b360 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
1b370 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
1b380 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
1b390 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
1b3a0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1b3b0 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
1b3c0 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
1b3d0 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
1b3e0 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
1b3f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1b400 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
1b410 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1b420 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
1b430 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
1b440 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
1b450 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
1b460 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
1b470 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1b480 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
1b490 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
1b4a0 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
1b4b0 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
1b4c0 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1b4d0 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1b4e0 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
1b4f0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1b500 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1b510 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  ;.      return O
1b520 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
1b530 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
1b540 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1b550 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1b560 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
1b570 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1b580 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
1b590 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1b5a0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1b5b0 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_B
1b5c0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1b5d0 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
1b5e0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1b5f0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1b600 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1b610 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1b620 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1b630 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
1b640 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
1b650 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1b660 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1b670 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
1b680 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1b690 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1b6a0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1b6b0 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
1b6c0 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
1b6d0 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1b6e0 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1b6f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1b700 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1b710 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1b720 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1b730 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1b740 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1b750 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
1b760 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
1b770 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
1b780 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1b790 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1b7a0 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
1b7b0 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
1b7c0 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
1b7d0 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
1b7e0 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
1b7f0 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
1b800 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
1b810 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1b820 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
1b830 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1b840 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
1b850 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
1b860 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
1b870 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
1b880 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
1b890 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1b8a0 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
1b8b0 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
1b8c0 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
1b8d0 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
1b8e0 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
1b8f0 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
1b900 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
1b910 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1b920 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
1b930 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
1b940 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
1b950 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
1b960 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1b970 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1b980 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
1b990 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
1b9a0 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
1b9b0 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
1b9c0 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
1b9d0 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
1b9e0 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
1b9f0 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
1ba00 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
1ba10 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
1ba20 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
1ba30 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
1ba40 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
1ba50 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
1ba60 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
1ba70 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f  Key2->errCode to
1ba80 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
1ba90 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30  UPT and return 0
1baa0 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
1bab0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1bac0 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72  , .** pPKey2->er
1bad0 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  rCode is set to 
1bae0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1baf0 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  , if it is not N
1bb00 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c  ULL, the.** mall
1bb10 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73  oc-failed flag s
1bb20 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  et on database h
1bb30 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70  andle (pPKey2->p
1bb40 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f  KeyInfo->db)..*/
1bb50 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1bb60 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1bb70 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65  hSkip(.  int nKe
1bb80 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1bb90 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1bba0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1bbb0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1bbc0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  ,         /* Rig
1bbd0 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1bbe0 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20  bSkip           
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1bc00 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65  f true, skip the
1bc10 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a   first field */.
1bc20 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc40 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1bc50 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1bc60 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1bc70 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1bca0 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63   next field to c
1bcb0 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20  ompare */.  u32 
1bcc0 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20  szHdr1;         
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1bce0 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65  ize of record he
1bcf0 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ader in bytes */
1bd00 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
1bd30 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65  first type in he
1bd40 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ader */.  int rc
1bd50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1bd60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1bd70 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  urn value */.  M
1bd80 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79  em *pRhs = pPKey
1bd90 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  2->aMem;       /
1bda0 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  * Next field of 
1bdb0 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72  pPKey2 to compar
1bdc0 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
1bdd0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
1bde0 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  2->pKeyInfo;.  c
1bdf0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1be00 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1be10 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1be20 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
1be30 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
1be40 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
1be50 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
1be60 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
1be70 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1be80 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
1be90 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
1bea0 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
1beb0 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
1bec0 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
1bed0 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
1bee0 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
1bef0 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
1bf00 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
1bf10 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
1bf20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
1bf30 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
1bf40 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
1bf50 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
1bf60 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
1bf70 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
1bf80 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1bf90 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
1bfa0 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
1bfb0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1bfc0 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1bfd0 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1bfe0 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
1bff0 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
1c000 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1c010 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
1c020 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1c030 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1c040 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1c050 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
1c060 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
1c070 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56   i = 0;.  }..  V
1c080 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1c090 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1c0a0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1c0b0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1c0c0 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
1c0d0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1c0e0 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32  o->nField+pPKey2
1c0f0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  ->pKeyInfo->nXFi
1c100 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1c110 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43  eld .       || C
1c120 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1c130 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1c140 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1c150 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1c160 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1c170 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
1c180 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1c190 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1c1a0 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1c1b0 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1c1c0 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53  ype;..    /* RHS
1c1d0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a   is an integer *
1c1e0 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e  /.    if( pRhs->
1c1f0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
1c200 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1c210 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1c220 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1];.      testca
1c230 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1c240 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1c250 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1c260 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c270 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1c280 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1c290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1c2a0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1c2b0 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1c2c0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1c2d0 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 28    double rhs = (
1c2e0 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e 69  double)pRhs->u.i
1c2f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c300 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1c310 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1c320 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
1c330 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31          if( mem1
1c340 2e 75 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20  .u.r<rhs ){.    
1c350 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1c360 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1c370 20 6d 65 6d 31 2e 75 2e 72 3e 72 68 73 20 29 7b   mem1.u.r>rhs ){
1c380 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c390 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
1c3a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c3b0 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62     i64 lhs = vdb
1c3c0 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1c3d0 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61  (serial_type, &a
1c3e0 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20  Key1[d1]);.     
1c3f0 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68     i64 rhs = pRh
1c400 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20  s->u.i;.        
1c410 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20  if( lhs<rhs ){. 
1c420 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1c430 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1c440 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20  if( lhs>rhs ){. 
1c450 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1c460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c470 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1c480 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f  * RHS is real */
1c490 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1c4a0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1c4b0 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65  Real ){.      se
1c4c0 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1c4d0 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69  1[idx1];.      i
1c4e0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1c4f0 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
1c500 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1c510 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1c520 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1c530 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1c540 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
1c550 6f 75 62 6c 65 20 72 68 73 20 3d 20 70 52 68 73  ouble rhs = pRhs
1c560 2d 3e 75 2e 72 3b 0a 20 20 20 20 20 20 20 20 64  ->u.r;.        d
1c570 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20 20 20 20  ouble lhs;.     
1c580 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1c590 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1c5a0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
1c5b0 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
1c5c0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1c5d0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==7 ){.         
1c5e0 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 75 2e 72 3b   lhs = mem1.u.r;
1c5f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1c600 20 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20            lhs = 
1c610 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69  (double)mem1.u.i
1c620 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c630 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
1c640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1c650 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1c660 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
1c670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1c680 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1c690 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1c6a0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73     /* RHS is a s
1c6b0 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73  tring */.    els
1c6c0 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1c6d0 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
1c6e0 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
1c6f0 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
1c700 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1c710 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
1c720 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
1c730 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1c740 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
1c750 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1c760 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73     }else if( !(s
1c770 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1c780 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
1c790 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1c7a0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31  se{.        mem1
1c7b0 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  .n = (serial_typ
1c7c0 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
1c7d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1c7e0 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73  d1+mem1.n)==(uns
1c7f0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1c800 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1c810 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d   (d1+mem1.n+1)==
1c820 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1c830 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1c840 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e  d1+mem1.n) > (un
1c850 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
1c860 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
1c870 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1c880 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1c890 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
1c8a0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1c8b0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
1c8c0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1c8d0 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
1c8e0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  nfo->aColl[i] ){
1c8f0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1c900 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1c910 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  enc;.          m
1c920 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
1c930 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  o->db;.         
1c940 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45   mem1.flags = ME
1c950 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20  M_Str;.         
1c960 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a   mem1.z = (char*
1c970 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20  )&aKey1[d1];.   
1c980 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
1c990 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1c9a0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
1c9b0 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65  &mem1, pRhs, pKe
1c9c0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c  yInfo->aColl[i],
1c9d0 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64   &pPKey2->errCod
1c9e0 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
1c9f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ca00 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
1ca10 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70   = MIN(mem1.n, p
1ca20 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Rhs->n);.       
1ca30 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26     rc = memcmp(&
1ca40 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d  aKey1[d1], pRhs-
1ca50 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20  >z, nCmp);.     
1ca60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29       if( rc==0 )
1ca70 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70   rc = mem1.n - p
1ca80 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20  Rhs->n; .       
1ca90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1caa0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1cab0 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c  a blob */.    el
1cac0 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1cad0 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b  gs & MEM_Blob ){
1cae0 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74  .      getVarint
1caf0 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c  32(&aKey1[idx1],
1cb00 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1cb10 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1cb20 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
1cb30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1cb40 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73  al_type<12 || (s
1cb50 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1cb60 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
1cb70 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1cb80 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1cb90 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74  nStr = (serial_t
1cba0 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20  ype - 12) / 2;. 
1cbb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1cbc0 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73   (d1+nStr)==(uns
1cbd0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1cbe0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1cbf0 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75   (d1+nStr+1)==(u
1cc00 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1cc10 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31  .        if( (d1
1cc20 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e  +nStr) > (unsign
1cc30 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
1cc40 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
1cc50 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
1cc60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1cc70 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1cc80 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1cc90 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
1cca0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
1ccb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1ccc0 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74  t nCmp = MIN(nSt
1ccd0 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  r, pRhs->n);.   
1cce0 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
1ccf0 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
1cd00 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
1cd10 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1cd20 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d  =0 ) rc = nStr -
1cd30 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20   pRhs->n;.      
1cd40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cd50 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1cd60 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   null */.    els
1cd70 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  e{.      serial_
1cd80 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1cd90 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  1];.      rc = (
1cda0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b  serial_type!=0);
1cdb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1cdc0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  rc!=0 ){.      i
1cdd0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1cde0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1cdf0 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
1ce00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1ce10 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
1ce20 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1ce30 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1ce40 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20  2, rc) );.      
1ce50 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1ce60 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
1ce70 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
1ce80 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
1ce90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
1cea0 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b   i++;.    pRhs++
1ceb0 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  ;.    d1 += sqli
1cec0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1ced0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1cee0 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73  );.    idx1 += s
1cef0 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
1cf00 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1cf10 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e  }while( idx1<(un
1cf20 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26  signed)szHdr1 &&
1cf30 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
1cf40 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e  d && d1<=(unsign
1cf50 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f  ed)nKey1 );..  /
1cf60 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
1cf70 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
1cf80 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
1cf90 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
1cfa0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
1cfb0 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
1cfc0 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
1cfd0 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
1cfe0 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
1cff0 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
1d000 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
1d010 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
1d020 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  m1).  */.  asser
1d030 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1d040 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
1d050 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
1d060 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  at one or both o
1d070 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
1d080 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
1d090 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
1d0a0 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
1d0b0 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
1d0c0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
1d0d0 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
1d0e0 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ue.  */.  assert
1d0f0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20  ( CORRUPT_DB .  
1d100 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f       || vdbeReco
1d110 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1d120 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1d130 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66  ey2, pPKey2->def
1d140 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20  ault_rc) .      
1d150 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62   || pKeyInfo->db
1d160 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
1d170 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b   );.  return pPK
1d180 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1d190 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1d1a0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1d1b0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1d1c0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1d1d0 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a     /* Left key *
1d1e0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1d1f0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1d200 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
1d210 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
1d220 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1d230 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1d240 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1d250 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  PKey2, 0);.}.../
1d260 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d270 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
1d280 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
1d290 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1d2a0 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
1d2b0 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
1d2c0 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1d2d0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  is an integer, a
1d2e0 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73  nd (b) the .** s
1d2f0 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
1d300 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  rint at the star
1d310 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
1d320 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
1d330 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65  gle.** byte (i.e
1d340 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  . is less than 1
1d350 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  28)..**.** To av
1d360 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f  oid concerns abo
1d370 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ut buffer overre
1d380 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ads, this routin
1d390 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a  e is only used.*
1d3a0 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65  * on schemas whe
1d3b0 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  re the maximum v
1d3c0 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65  alid header size
1d3d0 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20   is 63 bytes or 
1d3e0 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
1d3f0 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
1d400 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20  mpareInt(.  int 
1d410 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1d420 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
1d430 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1d440 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1d450 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
1d460 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
1d470 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26  nst u8 *aKey = &
1d480 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
1d490 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70  1)[*(const u8*)p
1d4a0 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20  Key1 & 0x3F];.  
1d4b0 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20  int serial_type 
1d4c0 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  = ((const u8*)pK
1d4d0 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72  ey1)[1];.  int r
1d4e0 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75  es;.  u32 y;.  u
1d4f0 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d 20  64 x;.  i64 v = 
1d500 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
1d510 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a  u.i;.  i64 lhs;.
1d520 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
1d530 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1d540 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
1d550 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
1d560 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
1d570 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78  *(u8*)pKey1)<=0x
1d580 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  3F || CORRUPT_DB
1d590 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
1d5a0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1d5b0 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
1d5c0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1d5d0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
1d5e0 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
1d5f0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1d600 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1d610 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d620 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
1d630 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
1d640 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1d650 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54     lhs = TWO_BYT
1d660 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1d670 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1d680 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1d690 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1d6a0 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
1d6b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1d6c0 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54  */.      lhs = T
1d6d0 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
1d6e0 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1d6f0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1d700 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d710 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
1d720 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
1d730 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1d740 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1d750 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1d760 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e   lhs = (i64)*(in
1d770 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73  t*)&y;.      tes
1d780 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1d790 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d7a0 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1d7b0 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
1d7c0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1d7d0 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59     lhs = FOUR_BY
1d7e0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
1d7f0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1d800 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
1d810 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1d820 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1d830 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d840 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f  .    case 6: { /
1d850 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
1d860 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1d870 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
1d880 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1d890 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46   x = (x<<32) | F
1d8a0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1d8b0 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73  ey+4);.      lhs
1d8c0 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
1d8d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1d8e0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1d8f0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d900 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73  se 8: .      lhs
1d910 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
1d920 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20  k;.    case 9:. 
1d930 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20       lhs = 1;.  
1d940 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
1d950 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75  /* This case cou
1d960 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69  ld be removed wi
1d970 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74  thout changing t
1d980 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75  he results of ru
1d990 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69  nning.    ** thi
1d9a0 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e  s code. Includin
1d9b0 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20  g it causes gcc 
1d9c0 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61  to generate a fa
1d9d0 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20  ster switch .   
1d9e0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73   ** statement (s
1d9f0 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f  ince the range o
1da00 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73  f switch targets
1da10 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a   now starts at z
1da20 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ero and.    ** i
1da30 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75  s contiguous) bu
1da40 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  t does not cause
1da50 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63   any duplicate c
1da60 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61  ode to be genera
1da70 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67  ted.    ** (as g
1da80 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f  cc is clever eno
1da90 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  ugh to combine t
1daa0 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65  he two like case
1dab0 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a  s). Other .    *
1dac0 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68  * compilers migh
1dad0 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a  t be similar.  *
1dae0 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63  / .    case 0: c
1daf0 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74  ase 7:.      ret
1db00 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
1db10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
1db20 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1db30 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  2);..    default
1db40 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
1db50 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1db60 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
1db70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20  Key1, pPKey2);. 
1db80 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73 20   }..  if( v>lhs 
1db90 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1dba0 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65  ey2->r1;.  }else
1dbb0 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20   if( v<lhs ){.  
1dbc0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1dbd0 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r2;.  }else if( 
1dbe0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
1dbf0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
1dc00 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
1dc10 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
1dc20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74  equal. Compare t
1dc30 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20  he trailing .   
1dc40 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a   ** fields.  */.
1dc50 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
1dc60 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1dc70 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
1dc80 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1dc90 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
1dca0 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
1dcb0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
1dcc0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20   keys are equal 
1dcd0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
1dce0 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a   trailing.    **
1dcf0 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20   fields. Return 
1dd00 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1dd10 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  rc in this case.
1dd20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50   */.    res = pP
1dd30 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1dd40 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1dd50 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1dd60 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1dd70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65  Key1, pPKey2, re
1dd80 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  s) );.  return r
1dd90 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  es;.}../*.** Thi
1dda0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
1ddb0 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
1ddc0 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
1ddd0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1dde0 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
1ddf0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
1de00 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72   pPKey2 is a str
1de10 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68  ing, that (b) th
1de20 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a  e first field.**
1de30 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
1de40 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
1de50 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74  ARY and (c) that
1de60 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
1de70 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61  der varint .** a
1de80 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
1de90 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
1dea0 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
1deb0 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
1dec0 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
1ded0 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74  areString(.  int
1dee0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1def0 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1df00 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1df10 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1df20 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
1df30 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
1df40 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d  onst u8 *aKey1 =
1df50 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79   (const u8*)pKey
1df60 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  1;.  int serial_
1df70 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b  type;.  int res;
1df80 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ..  vdbeAssertFi
1df90 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1dfa0 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
1dfb0 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
1dfc0 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e  nfo);.  getVarin
1dfd0 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
1dfe0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69  erial_type);.  i
1dff0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1e000 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  2 ){.    res = p
1e010 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20  PKey2->r1;      
1e020 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
1e030 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20   is a number or 
1e040 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73  a null */.  }els
1e050 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1e060 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a  ype & 0x01) ){ .
1e070 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1e080 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r2;      /* (p
1e090 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
1e0a0 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65   blob */.  }else
1e0b0 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a  {.    int nCmp;.
1e0c0 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20      int nStr;.  
1e0d0 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b    int szHdr = aK
1e0e0 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74  ey1[0];..    nSt
1e0f0 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1e100 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66  -12) / 2;.    if
1e110 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29  ( (szHdr + nStr)
1e120 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20   > nKey1 ){.    
1e130 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1e140 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1e150 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e160 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1e170 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1e180 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20  .    }.    nCmp 
1e190 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61  = MIN( pPKey2->a
1e1a0 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29  Mem[0].n, nStr )
1e1b0 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63  ;.    res = memc
1e1c0 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d  mp(&aKey1[szHdr]
1e1d0 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  , pPKey2->aMem[0
1e1e0 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20  ].z, nCmp);..   
1e1f0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
1e200 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20       res = nStr 
1e210 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  - pPKey2->aMem[0
1e220 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ].n;.      if( r
1e230 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
1e240 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
1e250 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  eld>1 ){.       
1e260 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
1e270 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1e280 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
1e290 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1e2a0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
1e2b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  e{.          res
1e2c0 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1e2d0 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  lt_rc;.        }
1e2e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e2f0 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
1e300 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1e310 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r2;.      }else{
1e320 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
1e330 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20  PKey2->r1;.     
1e340 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
1e350 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
1e360 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
1e370 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e380 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1e390 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  >r1;.    }.  }..
1e3a0 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
1e3b0 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1e3c0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1e3d0 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20  PKey2, res).    
1e3e0 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
1e3f0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79  .       || pPKey
1e400 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  2->pKeyInfo->db-
1e410 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
1e420 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
1e430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e440 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
1e450 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1e460 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70  rdCompare() comp
1e470 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a  atible function.
1e480 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
1e490 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c  comparing serial
1e4a0 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20  ized records to 
1e4b0 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63  the unpacked rec
1e4c0 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ord passed.** as
1e4d0 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
1e4e0 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d  nt..*/.RecordCom
1e4f0 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65  pare sqlite3Vdbe
1e500 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61  FindCompare(Unpa
1e510 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a  ckedRecord *p){.
1e520 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72    /* varintRecor
1e530 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
1e540 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  d varintRecordCo
1e550 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f  mpareString() bo
1e560 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74  th assume.  ** t
1e570 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
1e580 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68  header varint th
1e590 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
1e5a0 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72   start of each r
1e5b0 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20  ecord.  ** fits 
1e5c0 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
1e5d0 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72   (i.e. is 127 or
1e5e0 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65   less). varintRe
1e5f0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
1e600 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d  .  ** also assum
1e610 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61  es that it is sa
1e620 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61  fe to overread a
1e630 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65   buffer by at le
1e640 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61  ast the .  ** ma
1e650 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c  ximum possible l
1e660 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  egal header size
1e670 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42   plus 8 bytes. B
1e680 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a  ecause there is.
1e690 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
1e6a0 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37  to be at least 7
1e6b0 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20  4 (but not 136) 
1e6c0 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
1e6d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a   following each.
1e6e0 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73    ** buffer pass
1e6f0 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f  ed to varintReco
1e700 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74  rdCompareInt() t
1e710 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e  his makes it con
1e720 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  venient to.  ** 
1e730 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f  limit the size o
1e740 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20  f the header to 
1e750 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65  64 bytes in case
1e760 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  s where the firs
1e770 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20  t field.  ** is 
1e780 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a  an integer..  **
1e790 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73  .  ** The easies
1e7a0 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65  t way to enforce
1e7b0 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74   this limit is t
1e7c0 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20  o consider only 
1e7d0 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a  records with.  *
1e7e0 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c  * 13 fields or l
1e7f0 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73  ess. If the firs
1e800 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e  t field is an in
1e810 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d  teger, the maxim
1e820 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65  um legal.  ** he
1e830 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32  ader size is (12
1e840 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65  *5 + 1 + 1) byte
1e850 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  s.  */.  if( (p-
1e860 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1e870 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  d + p->pKeyInfo-
1e880 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b  >nXField)<=13 ){
1e890 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
1e8a0 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67   p->aMem[0].flag
1e8b0 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b  s;.    if( p->pK
1e8c0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1e8d0 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70  er[0] ){.      p
1e8e0 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->r1 = 1;.      
1e8f0 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r2 = -1;.    
1e900 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
1e910 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  r1 = -1;.      p
1e920 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ->r2 = 1;.    }.
1e930 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
1e940 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20   MEM_Int) ){.   
1e950 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
1e960 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a  cordCompareInt;.
1e970 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
1e980 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
1e990 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Real );.    test
1e9a0 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
1e9b0 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65  M_Null );.    te
1e9c0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
1e9d0 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
1e9e0 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45  if( (flags & (ME
1e9f0 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c  M_Real|MEM_Null|
1ea00 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26  MEM_Blob))==0 &&
1ea10 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   p->pKeyInfo->aC
1ea20 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  oll[0]==0 ){.   
1ea30 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
1ea40 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20   & MEM_Str );.  
1ea50 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
1ea60 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1ea70 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ng;.    }.  }.. 
1ea80 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1ea90 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1eaa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  ;.}../*.** pCur 
1eab0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
1eac0 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
1ead0 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
1eae0 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
1eaf0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
1eb00 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
1eb10 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
1eb20 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
1eb30 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
1eb40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
1eb50 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
1eb60 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
1eb70 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1eb80 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
1eb90 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
1eba0 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
1ebb0 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
1ebc0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
1ebd0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
1ebe0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
1ebf0 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
1ec00 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
1ec10 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
1ec20 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
1ec30 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
1ec40 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1ec50 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
1ec60 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
1ec70 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
1ec80 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
1ec90 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
1eca0 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
1ecb0 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
1ecc0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
1ecd0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
1ece0 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
1ecf0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
1ed00 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
1ed10 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
1ed20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
1ed30 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69  x entry.  Only i
1ed40 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f  ndices entries o
1ed50 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  f less.  ** than
1ed60 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72   2GiB are suppor
1ed70 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72  t - anything lar
1ed80 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62  ge must be datab
1ed90 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1eda0 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74    ** Any corrupt
1edb0 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
1edc0 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  in sqlite3BtreeP
1edd0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74  arseCellPtr(), t
1ede0 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74  hough, so.  ** t
1edf0 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66  his code can saf
1ee00 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20  ely assume that 
1ee10 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62  nCellKey is 32-b
1ee20 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73  its  .  */.  ass
1ee30 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1ee40 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
1ee50 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e  Cur) );.  VVA_ON
1ee60 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33  LY(rc =) sqlite3
1ee70 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
1ee80 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
1ee90 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1eea0 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a  ITE_OK );     /*
1eeb0 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
1eec0 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
1eed0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
1eee0 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c    assert( (nCell
1eef0 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58  Key & SQLITE_MAX
1ef00 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c  _U32)==(u64)nCel
1ef10 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  lKey );..  /* Re
1ef20 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65  ad in the comple
1ef30 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  te content of th
1ef40 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f  e index entry */
1ef50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
1ef60 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
1ef70 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1ef80 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
1ef90 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
1efa0 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
1efb0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1efc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1efd0 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
1efe0 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
1eff0 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
1f000 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
1f010 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
1f020 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
1f030 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
1f040 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
1f050 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
1f060 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a   if( unlikely(sz
1f070 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a  Hdr<3 || (int)sz
1f080 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20  Hdr>m.n) ){.    
1f090 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
1f0a0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
1f0b0 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69    /* The last fi
1f0c0 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  eld of the index
1f0d0 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
1f0e0 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49  teger - the ROWI
1f0f0 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  D..  ** Verify t
1f100 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  hat the last ent
1f110 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  ry really is an 
1f120 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76  integer. */.  (v
1f130 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
1f140 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
1f150 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
1f160 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1f170 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65  Rowid==1 );.  te
1f180 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1f190 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61  d==2 );.  testca
1f1a0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33  se( typeRowid==3
1f1b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1f1c0 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a  typeRowid==4 );.
1f1d0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1f1e0 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65  Rowid==5 );.  te
1f1f0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1f200 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61  d==6 );.  testca
1f210 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38  se( typeRowid==8
1f220 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1f230 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a  typeRowid==9 );.
1f240 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74    if( unlikely(t
1f250 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79  ypeRowid<1 || ty
1f260 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70  peRowid>9 || typ
1f270 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20  eRowid==7) ){.  
1f280 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
1f290 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
1f2a0 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
1f2b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1f2c0 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
1f2d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
1f2e0 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
1f2f0 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
1f300 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
1f310 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
1f320 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
1f330 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1f340 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
1f350 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
1f360 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
1f370 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
1f380 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1f390 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
1f3a0 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
1f3b0 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
1f3c0 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
1f3d0 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
1f3e0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1f3f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1f400 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
1f410 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
1f420 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1f430 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
1f440 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
1f450 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
1f460 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
1f470 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1f480 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
1f490 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
1f4a0 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
1f4b0 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  szMalloc!=0 );. 
1f4c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1f4d0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
1f4e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1f4f0 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
1f500 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
1f510 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
1f520 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
1f530 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
1f540 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
1f550 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
1f560 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
1f570 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
1f580 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
1f590 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
1f5a0 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1f5b0 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
1f5c0 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
1f5d0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
1f5e0 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
1f5f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1f600 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
1f610 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
1f620 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
1f630 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
1f640 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
1f650 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
1f660 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
1f670 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
1f680 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1f690 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
1f6a0 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
1f6b0 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
1f6c0 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
1f6d0 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
1f6e0 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
1f6f0 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
1f700 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
1f710 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
1f720 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f730 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
1f740 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1f750 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f760 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1f770 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1f780 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1f790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f7a0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1f7b0 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
1f7c0 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
1f7d0 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
1f7e0 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70  ed,       /* Unp
1f7f0 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
1f800 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72   key */.  int *r
1f810 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
1f820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1f830 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
1f840 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
1f850 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
1f860 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
1f870 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
1f880 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
1f890 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
1f8a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1f8b0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
1f8c0 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f  (pCur) );.  VVA_
1f8d0 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
1f8e0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
1f8f0 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
1f900 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
1f910 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f  QLITE_OK );    /
1f920 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73  * pCur is always
1f930 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a   valid so KeySiz
1f940 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  e cannot fail */
1f950 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77  .  /* nCellKey w
1f960 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65  ill always be be
1f970 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66  tween 0 and 0xff
1f980 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f  ffffff because o
1f990 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74  f the way.  ** t
1f9a0 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65  hat btreeParseCe
1f9b0 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69  llPtr() and sqli
1f9c0 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
1f9d0 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
1f9e0 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b   */.  if( nCellK
1f9f0 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
1fa00 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  y>0x7fffffff ){.
1fa10 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
1fa20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fa30 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1fa40 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  }.  sqlite3VdbeM
1fa50 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
1fa60 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1fa70 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
1fa80 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
1fa90 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
1faa0 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
1fab0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1fac0 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
1fad0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1fae0 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
1faf0 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
1fb00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1fb10 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
1fb20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fb30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1fb40 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
1fb50 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
1fb60 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
1fb70 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
1fb80 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
1fb90 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1fba0 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
1fbb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
1fbc0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
1fbd0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
1fbe0 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
1fbf0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1fc00 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
1fc10 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
1fc20 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
1fc30 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
1fc40 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
1fc50 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
1fc60 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
1fc70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
1fc80 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
1fc90 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
1fca0 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
1fcb0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
1fcc0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
1fcd0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
1fce0 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
1fcf0 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
1fd00 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1fd10 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1fd20 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
1fd30 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
1fd40 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
1fd50 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
1fd60 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
1fd70 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
1fd80 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
1fd90 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
1fda0 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
1fdb0 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
1fdc0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
1fdd0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
1fde0 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
1fdf0 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
1fe00 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
1fe10 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
1fe20 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
1fe30 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
1fe40 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
1fe50 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
1fe60 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
1fe70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
1fe80 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
1fe90 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
1fea0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
1feb0 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
1fec0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
1fed0 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
1fee0 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
1fef0 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
1ff00 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
1ff10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1ff20 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
1ff30 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
1ff40 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
1ff50 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
1ff60 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
1ff70 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
1ff80 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1ff90 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
1ffa0 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
1ffb0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
1ffc0 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
1ffd0 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
1ffe0 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
1fff0 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
20000 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
20010 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
20020 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
20030 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
20040 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
20050 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
20060 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
20070 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
20080 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
20090 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
200a0 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
200b0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
200c0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
200d0 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
200e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
200f0 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
20100 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
20110 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
20120 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
20130 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
20140 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
20150 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
20160 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
20170 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
20180 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
20190 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
201a0 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
201b0 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
201c0 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
201d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
201e0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
201f0 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
20200 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20210 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
20220 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
20230 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
20240 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
20250 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
20260 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
20270 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
20280 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
20290 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
202a0 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
202b0 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
202c0 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
202d0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
202e0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
202f0 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
20300 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
20310 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
20320 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
20330 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
20340 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
20350 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
20360 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
20370 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
20380 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
20390 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
203a0 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
203b0 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
203c0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
203d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
203e0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
203f0 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
20400 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
20410 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
20420 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
20430 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
20440 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
20450 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
20460 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
20470 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
20480 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
20490 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
204a0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
204b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
204c0 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
204d0 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
204e0 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
204f0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
20500 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
20510 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
20520 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
20530 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
20540 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
20550 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
20560 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
20570 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
20580 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
20590 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
205a0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
205b0 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
205c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
205d0 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a  EUPDATE_HOOK../*
205e0 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
205f0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
20600 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20  t NULL, release 
20610 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  any allocations 
20620 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77  associated .** w
20630 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ith the memory c
20640 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61  ells in the p->a
20650 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73  Mem[] array. Als
20660 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63  o free the Unpac
20670 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
20680 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75  ucture itself, u
20690 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
206a0 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ee()..**.** This
206b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
206c0 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b  d to free Unpack
206d0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
206e0 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  res allocated by
206f0 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61  .** the vdbeUnpa
20700 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74  ckRecord() funct
20710 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62  ion found in vdb
20720 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69  eapi.c..*/.stati
20730 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55  c void vdbeFreeU
20740 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20  npacked(sqlite3 
20750 2a 64 62 2c 20 55 6e 70 61 63 6b 65 64 52 65 63  *db, UnpackedRec
20760 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ord *p){.  if( p
20770 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
20780 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
20790 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nField; i++){. 
207a0 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
207b0 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20   &p->aMem[i];.  
207c0 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d      if( pMem->zM
207d0 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56  alloc ) sqlite3V
207e0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
207f0 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  em);.    }.    s
20800 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20810 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
20820 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65  * Invoke the pre
20830 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66  -update hook. If
20840 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41   this is an UPDA
20850 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65  TE or DELETE pre
20860 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a  -update call,.**
20870 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73   then cursor pas
20880 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
20890 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  d argument shoul
208a0 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  d point to the r
208b0 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62  ow about.** to b
208c0 65 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65  e update or dele
208d0 74 65 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c  ted. If the appl
208e0 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71  ication calls sq
208f0 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
20900 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65  old(),.** the re
20910 71 75 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c  quired value wil
20920 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
20930 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f  he row the curso
20940 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a  r points to..*/.
20950 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
20960 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20  PreUpdateHook(. 
20970 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64   /* Vdbe pre-upd
209a0 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f  ate hook is invo
209b0 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65  ked by */.  Vdbe
209c0 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20  Cursor *pCsr,   
209d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
209e0 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c  ursor to grab ol
209f0 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  d.* values from 
20a00 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49       /* SQLITE_I
20a30 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
20a40 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e   DELETE */.  con
20a50 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20a70 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f  Database name */
20a80 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74     /* Modified t
20ab0 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b  able */.  i64 iK
20ac0 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey1,            
20ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
20ae0 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a  tial key value *
20af0 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20  /.  int iReg    
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
20b20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64  for new.* record
20b30 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
20b40 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20   *db = v->db;.  
20b50 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65  i64 iKey2;.  Pre
20b60 55 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65  Update preupdate
20b70 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
20b80 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTbl = pTab->zNa
20b90 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  me;.  static con
20ba0 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72  st u8 fakeSortOr
20bb0 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  der = 0;..  asse
20bc0 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61  rt( db->pPreUpda
20bd0 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  te==0 );.  memse
20be0 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c  t(&preupdate, 0,
20bf0 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74   sizeof(PreUpdat
20c00 65 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53  e));.  if( op==S
20c10 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a  QLITE_UPDATE ){.
20c20 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61      iKey2 = v->a
20c30 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20  Mem[iReg].u.i;. 
20c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79   }else{.    iKey
20c50 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a  2 = iKey1;.  }..
20c60 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
20c70 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43  nField==pTab->nC
20c80 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ol .       || (p
20c90 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61  Csr->nField==pTa
20ca0 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d  b->nCol+1 && op=
20cb0 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26  =SQLITE_DELETE &
20cc0 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b  & iReg==-1).  );
20cd0 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76 20  ..  preupdate.v 
20ce0 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65  = v;.  preupdate
20cf0 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20  .pCsr = pCsr;.  
20d00 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f  preupdate.op = o
20d10 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  p;.  preupdate.i
20d20 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  NewReg = iReg;. 
20d30 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
20d40 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72  fo.db = db;.  pr
20d50 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
20d60 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
20d70 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
20d80 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54 61 62  fo.nField = pTab
20d90 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64  ->nCol;.  preupd
20da0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72  ate.keyinfo.aSor
20db0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66  tOrder = (u8*)&f
20dc0 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  akeSortOrder;.  
20dd0 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20  preupdate.iKey1 
20de0 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70  = iKey1;.  preup
20df0 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65  date.iKey2 = iKe
20e00 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  y2;.  preupdate.
20e10 69 50 4b 65 79 20 3d 20 70 54 61 62 2d 3e 69 50  iPKey = pTab->iP
20e20 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65  Key;..  db->pPre
20e30 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64  Update = &preupd
20e40 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55  ate;.  db->xPreU
20e50 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62  pdateCallback(db
20e60 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c  ->pPreUpdateArg,
20e70 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54   db, op, zDb, zT
20e80 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32  bl, iKey1, iKey2
20e90 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  );.  db->pPreUpd
20ea0 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ate = 0;.  sqlit
20eb0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65  e3DbFree(db, pre
20ec0 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b  update.aRecord);
20ed0 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
20ee0 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
20ef0 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  e.pUnpacked);.  
20f00 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64  vdbeFreeUnpacked
20f10 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70  (db, preupdate.p
20f20 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  NewUnpacked);.  
20f30 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e  if( preupdate.aN
20f40 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ew ){.    int i;
20f50 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20f60 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b  pCsr->nField; i+
20f70 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
20f80 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
20f90 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b  &preupdate.aNew[
20fa0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i]);.    }.    s
20fb0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20fc0 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29   preupdate.aNew)
20fd0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
20fe0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
20ff0 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
21000 2f 0a                                            /.