/ Hex Artifact Content
Login

Artifact 07b0045d0f34d0ad70c1c42ff75246a7e64e4e87:


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 4f 70  sAbort = 0;.  Op
2d00: 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49   *pOp;.  VdbeOpI
2d10: 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d  ter sIter;.  mem
2d20: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
2d30: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20  izeof(sIter));. 
2d40: 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20   sIter.v = v;.. 
2d50: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
2d60: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
2d70: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
2d80: 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f   opcode = pOp->o
2d90: 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f  pcode;.    if( o
2da0: 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f  pcode==OP_Destro
2db0: 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  y || opcode==OP_
2dc0: 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64  VUpdate || opcod
2dd0: 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23  e==OP_VRename .#
2de0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2df0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
2e00: 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d      || (opcode==
2e10: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20  OP_FkCounter && 
2e20: 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f  pOp->p1==0 && pO
2e30: 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69  p->p2==1) .#endi
2e40: 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f  f.     || ((opco
2e50: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
2e60: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
2e70: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
2e80: 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d  ((pOp->p1&0xff)=
2e90: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2ea0: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
2eb0: 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b  E_Abort)).    ){
2ec0: 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20  .      hasAbort 
2ed0: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
2ee0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
2ef0: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
2f00: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
2f10: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72  ..  /* Return tr
2f20: 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d  ue if hasAbort==
2f30: 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20  mayAbort. Or if 
2f40: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
2f50: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
2f60: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
2f70: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
2f80: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
2f90: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
2fa0: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
2fb0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
2fc0: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
2fd0: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
2fe0: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
2ff0: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
3000: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
3010: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
3020: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
3030: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
3040: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
3050: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
3060: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
3070: 3d 6d 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23  =mayAbort );.}.#
3080: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3090: 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69  DEBUG - the sqli
30a0: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
30b0: 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  t() function */.
30c0: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f  ./*.** Loop thro
30d0: 75 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ugh the program 
30e0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76  looking for P2 v
30f0: 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 6e  alues that are n
3100: 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75  egative.** on ju
3110: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  mp instructions.
3120: 20 20 45 61 63 68 20 73 75 63 68 20 76 61 6c 75    Each such valu
3130: 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52  e is a label.  R
3140: 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61  esolve the.** la
3150: 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74  bel by setting t
3160: 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69  he P2 value to i
3170: 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a  ts correct non-z
3180: 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
3190: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
31a0: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74   called once aft
31b0: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68  er all opcodes h
31c0: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ave been inserte
31d0: 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c  d..**.** Variabl
31e0: 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20  e *pMaxFuncArgs 
31f0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61  is set to the ma
3200: 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61  ximum value of a
3210: 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a  ny P2 argument .
3220: 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63  ** to an OP_Func
3230: 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70  tion, OP_AggStep
3240: 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f   or OP_VFilter o
3250: 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75  pcode. This is u
3260: 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74  sed by .** sqlit
3270: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
3280: 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64  ) to size the Vd
3290: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79  be.apArg[] array
32a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f  ..**.** The Op.o
32b0: 70 66 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20  pflags field is 
32c0: 73 65 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64  set on all opcod
32d0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
32e0: 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  id resolveP2Valu
32f0: 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  es(Vdbe *p, int 
3300: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a  *pMaxFuncArgs){.
3310: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
3320: 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46  MaxArgs = *pMaxF
3330: 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70  uncArgs;.  Op *p
3340: 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  Op;.  Parse *pPa
3350: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
3360: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d  .  int *aLabel =
3370: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b   pParse->aLabel;
3380: 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  .  p->readOnly =
3390: 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64   1;.  p->bIsRead
33a0: 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f  er = 0;.  for(pO
33b0: 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e  p=p->aOp, i=p->n
33c0: 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  Op-1; i>=0; i--,
33d0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20   pOp++){.    u8 
33e0: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
33f0: 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f  code;..    /* NO
3400: 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20 75  TE: Be sure to u
3410: 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  pdate mkopcodeh.
3420: 61 77 6b 20 77 68 65 6e 20 61 64 64 69 6e 67 20  awk when adding 
3430: 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20  or removing.    
3440: 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68  ** cases from th
3450: 69 73 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20  is switch! */.  
3460: 20 20 73 77 69 74 63 68 28 20 6f 70 63 6f 64 65    switch( opcode
3470: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
3480: 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 20  P_Function:.    
3490: 20 20 63 61 73 65 20 4f 50 5f 41 67 67 53 74 65    case OP_AggSte
34a0: 70 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  p: {.        if(
34b0: 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67   pOp->p5>nMaxArg
34c0: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
34d0: 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 20 20 20 20  Op->p5;.        
34e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
34f0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
3500: 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20  nsaction: {.    
3510: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21      if( pOp->p2!
3520: 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  =0 ) p->readOnly
3530: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a   = 0;.        /*
3540: 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   fall thru */.  
3550: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3560: 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a   OP_AutoCommit:.
3570: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61        case OP_Sa
3580: 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20  vepoint: {.     
3590: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
35a0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
35b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
35c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35d0: 57 41 4c 0a 20 20 20 20 20 20 63 61 73 65 20 4f  WAL.      case O
35e0: 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65  P_Checkpoint:.#e
35f0: 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20  ndif.      case 
3600: 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20  OP_Vacuum:.     
3610: 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c   case OP_Journal
3620: 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  Mode: {.        
3630: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  p->readOnly = 0;
3640: 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52  .        p->bIsR
3650: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
3660: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3670: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
3680: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
3690: 4c 45 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  LE.      case OP
36a0: 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20  _VUpdate: {.    
36b0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
36c0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
36d0: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
36e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
36f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3700: 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20   OP_VFilter: {. 
3710: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
3720: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
3730: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
3740: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
3750: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
3760: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
3770: 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d         n = pOp[-
3780: 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 69  1].p1;.        i
3790: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
37a0: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20  nMaxArgs = n;.  
37b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
37c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
37d0: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a    case OP_Next:.
37e0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
37f0: 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20  xtIfOpen:.      
3800: 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65  case OP_SorterNe
3810: 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  xt: {.        pO
3820: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
3830: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
3840: 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  t;.        pOp->
3850: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
3860: 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  NCE;.        bre
3870: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3880: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a    case OP_Prev:.
3890: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
38a0: 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20  evIfOpen: {.    
38b0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
38c0: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
38d0: 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20  reePrevious;.   
38e0: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
38f0: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
3900: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3910: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3920: 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20   pOp->opflags = 
3930: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
3940: 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20  perty[opcode];. 
3950: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66     if( (pOp->opf
3960: 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d  lags & OPFLG_JUM
3970: 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  P)!=0 && pOp->p2
3980: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
3990: 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70  rt( -1-pOp->p2<p
39a0: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b  Parse->nLabel );
39b0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
39c0: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
39d0: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
39e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
39f0: 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c  ->db, pParse->aL
3a00: 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d  abel);.  pParse-
3a10: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70  >aLabel = 0;.  p
3a20: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20  Parse->nLabel = 
3a30: 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  0;.  *pMaxFuncAr
3a40: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20  gs = nMaxArgs;. 
3a50: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
3a60: 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61  eader!=0 || DbMa
3a70: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
3a80: 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a  eeMask) );.}../*
3a90: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
3aa0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
3ab0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
3ac0: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
3ad0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3ae0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
3af0: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
3b00: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3b10: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3b20: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
3b30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3b40: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
3b50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
3b60: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
3b70: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
3b80: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
3b90: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
3ba0: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
3bb0: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
3bc0: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
3bd0: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
3be0: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
3bf0: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
3c00: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
3c10: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
3c20: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
3c30: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
3c40: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
3c50: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
3c60: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3c70: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
3c80: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
3c90: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
3ca0: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
3cb0: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
3cc0: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
3cd0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3ce0: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
3cf0: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
3d00: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
3d10: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
3d20: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
3d30: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
3d40: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
3d50: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
3d60: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
3d70: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
3d80: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
3d90: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
3da0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
3db0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
3dc0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
3dd0: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
3de0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
3df0: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44  M */.  assert( D
3e00: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
3e10: 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20  btreeMask) );.. 
3e20: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
3e30: 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20  (p, pnMaxArg);. 
3e40: 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b   *pnOp = p->nOp;
3e50: 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20  .  p->aOp = 0;. 
3e60: 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a   return aOp;.}..
3e70: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c  /*.** Add a whol
3e80: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74  e list of operat
3e90: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72  ions to the oper
3ea0: 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65  ation stack.  Re
3eb0: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72  turn the.** addr
3ec0: 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74  ess of the first
3ed0: 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64   operation added
3ee0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3ef0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64  VdbeAddOpList(Vd
3f00: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20  be *p, int nOp, 
3f10: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
3f20: 20 2a 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65   *aOp, int iLine
3f30: 6e 6f 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  no){.  int addr;
3f40: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3f50: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3f60: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
3f70: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
3f80: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
3f90: 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28   && growOpArray(
3fa0: 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72  p, nOp) ){.    r
3fb0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
3fc0: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  ddr = p->nOp;.  
3fd0: 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30  if( ALWAYS(nOp>0
3fe0: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
3ff0: 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63      VdbeOpList c
4000: 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b  onst *pIn = aOp;
4010: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4020: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29  nOp; i++, pIn++)
4030: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  {.      int p2 =
4040: 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pIn->p2;.      
4050: 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26  VdbeOp *pOut = &
4060: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a  p->aOp[i+addr];.
4070: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f        pOut->opco
4080: 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65  de = pIn->opcode
4090: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31  ;.      pOut->p1
40a0: 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20   = pIn->p1;.    
40b0: 20 20 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20    if( p2<0 ){.  
40c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
40d0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
40e0: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty[pOut->opcode
40f0: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29  ] & OPFLG_JUMP )
4100: 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  ;.        pOut->
4110: 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52  p2 = addr + ADDR
4120: 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  (p2);.      }els
4130: 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d  e{.        pOut-
4140: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20  >p2 = p2;.      
4150: 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33  }.      pOut->p3
4160: 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20   = pIn->p3;.    
4170: 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d    pOut->p4type =
4180: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
4190: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20     pOut->p4.p = 
41a0: 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  0;.      pOut->p
41b0: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
41c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
41d0: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
41e0: 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e     pOut->zCommen
41f0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
4200: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
4210: 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20  _COVERAGE.      
4220: 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  pOut->iSrcLine =
4230: 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73   iLineno+i;.#els
4240: 65 0a 20 20 20 20 20 20 28 76 6f 69 64 29 69 4c  e.      (void)iL
4250: 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69  ineno;.#endif.#i
4260: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4270: 47 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64  G.      if( p->d
4280: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
4290: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
42a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
42b0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
42c0: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
42d0: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
42e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
42f0: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
4300: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
4310: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
4320: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4330: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
4340: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
4350: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
4360: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4370: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
4380: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
4390: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
43a0: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
43b0: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
43c0: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
43d0: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
43e0: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
43f0: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
4400: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
4410: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
4420: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
4430: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
4440: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4450: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
4460: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
4470: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20  p->aOp[addr].p1 
4480: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
4490: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
44a0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f  alue of the P2 o
44b0: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
44c0: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
44d0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
44e0: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  ne is useful for
44f0: 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20   setting a jump 
4500: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
4510: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4520: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
4530: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
4540: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
4550: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
4560: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
4570: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
4580: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
4590: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
45a0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
45b0: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
45c0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
45d0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
45e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
45f0: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
4600: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
4610: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
4620: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
4630: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
4640: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
4650: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p3 = val;.  }
4660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
4670: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4680: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P5 operand for
4690: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
46a0: 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72  ly.** added oper
46b0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
46c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
46d0: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76  P5(Vdbe *p, u8 v
46e0: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
46f0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
4700: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  aOp ){.    asser
4710: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
4720: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
4730: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20  -1].p5 = val;.  
4740: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
4750: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
4760: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
4770: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
4780: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
4790: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
47a0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
47b0: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
47c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
47d0: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
47e0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
47f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4800: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
4810: 6e 4f 70 29 3b 0a 20 20 70 2d 3e 70 50 61 72 73  nOp);.  p->pPars
4820: 65 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d  e->iFixedOp = p-
4830: 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  >nOp - 1;.}.../*
4840: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
4850: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
4860: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c  re is ephemeral,
4870: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20   then free it.  
4880: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  If.** the FuncDe
4890: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61  f is not epherma
48a0: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  l, then do nothi
48b0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
48c0: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  id freeEphemeral
48d0: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
48e0: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
48f0: 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Def){.  if( ALWA
4900: 59 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65  YS(pDef) && (pDe
4910: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
4920: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
4930: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
4940: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
4950: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
4960: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
4970: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
4980: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
4990: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
49a0: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
49b0: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
49c0: 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69  void freeP4(sqli
49d0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74  te3 *db, int p4t
49e0: 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a  ype, void *p4){.
49f0: 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20    if( p4 ){.    
4a00: 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20  assert( db );.  
4a10: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
4a20: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
4a30: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61  4_REAL:.      ca
4a40: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
4a50: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d     case P4_DYNAM
4a60: 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  IC:.      case P
4a70: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
4a80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4a90: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
4aa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4ab0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4ac0: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
4ad0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4ae0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4af0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
4b00: 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29  ef((KeyInfo*)p4)
4b10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4b20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4b30: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20  ase P4_MPRINTF: 
4b40: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4b50: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4b60: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
4b70: 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p4);.        br
4b80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4b90: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
4ba0: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
4bb0: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
4bc0: 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66  ion(db, (FuncDef
4bd0: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
4be0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4bf0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
4c00: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
4c10: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4c20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4c30: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
4c40: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
4c50: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  )p4);.        }e
4c60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d  lse{.          M
4c70: 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34  em *p = (Mem*)p4
4c80: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4c90: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  p->szMalloc ) sq
4ca0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4cb0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
4cc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
4cd0: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
4ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
4cf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4d00: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
4d10: 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28   : {.        if(
4d20: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4d30: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74  d==0 ) sqlite3Vt
4d40: 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65  abUnlock((VTable
4d50: 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20   *)p4);.        
4d60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4d70: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
4d80: 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63 65  * Free the space
4d90: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61   allocated for a
4da0: 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61  Op and any p4 va
4db0: 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  lues allocated f
4dc0: 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65  or the.** opcode
4dd0: 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  s contained with
4de0: 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f  in. If aOp is no
4df0: 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73  t NULL it is ass
4e00: 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
4e10: 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e  .** nOp entries.
4e20: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
4e30: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
4e40: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70  (sqlite3 *db, Op
4e50: 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b   *aOp, int nOp){
4e60: 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20  .  if( aOp ){.  
4e70: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66    Op *pOp;.    f
4e80: 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c  or(pOp=aOp; pOp<
4e90: 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b  &aOp[nOp]; pOp++
4ea0: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28  ){.      freeP4(
4eb0: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
4ec0: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
4ed0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4ee0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
4ef0: 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  TS.      sqlite3
4f00: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
4f10: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
4f20: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d  f     .    }.  }
4f30: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4f40: 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a  (db, aOp);.}../*
4f50: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62  .** Link the Sub
4f60: 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70  Program object p
4f70: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
4f80: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74  ond argument int
4f90: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20  o the linked.** 
4fa0: 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75  list at Vdbe.pSu
4fb0: 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c  bProgram. This l
4fc0: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64  ist is used to d
4fd0: 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72  elete all sub-pr
4fe0: 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73  ogram.** objects
4ff0: 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20   when the VM is 
5000: 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72  no longer requir
5010: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
5020: 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72  te3VdbeLinkSubPr
5030: 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62  ogram(Vdbe *pVdb
5040: 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  e, SubProgram *p
5050: 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  ){.  p->pNext = 
5060: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b  pVdbe->pProgram;
5070: 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72  .  pVdbe->pProgr
5080: 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  am = p;.}../*.**
5090: 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f   Change the opco
50a0: 64 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20  de at addr into 
50b0: 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20  OP_Noop.*/.void 
50c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
50d0: 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c  eToNoop(Vdbe *p,
50e0: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66   int addr){.  if
50f0: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b  ( addr<p->nOp ){
5100: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
5110: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
5120: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
5130: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66  b = p->db;.    f
5140: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
5150: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
5160: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f  );.    memset(pO
5170: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70  p, 0, sizeof(pOp
5180: 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  [0]));.    pOp->
5190: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
51a0: 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 3d 3d  ;.    if( addr==
51b0: 70 2d 3e 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f  p->nOp-1 ) p->nO
51c0: 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p--;.  }.}../*.*
51d0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6c 61 73  * Remove the las
51e0: 74 20 6f 70 63 6f 64 65 20 69 6e 73 65 72 74 65  t opcode inserte
51f0: 64 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  d.*/.int sqlite3
5200: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
5210: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
5220: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d  8 op){.  if( (p-
5230: 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72  >nOp-1)>(p->pPar
5240: 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26  se->iFixedOp) &&
5250: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5260: 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a  ].opcode==op ){.
5270: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5280: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70  hangeToNoop(p, p
5290: 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65  ->nOp-1);.    re
52a0: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
52b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
52c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
52d0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
52e0: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
52f0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
5300: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
5310: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5320: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
5330: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
5340: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
5350: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
5360: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5370: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
5380: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
5390: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
53a0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
53b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
53c0: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
53d0: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
53e0: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
53f0: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
5400: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
5410: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
5420: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
5430: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
5440: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
5450: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
5460: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
5470: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
5480: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
5490: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
54a0: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
54b0: 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  4..** .** Other 
54c0: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
54d0: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
54e0: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
54f0: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
5500: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
5510: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
5520: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
5530: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
5540: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
5550: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
5560: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
5570: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
5580: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
5590: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
55a0: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
55b0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
55c0: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
55d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
55e0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
55f0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
5600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
5610: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
5620: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
5630: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
5640: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
5650: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
5660: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5670: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
5680: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62   p->aOp==0 || db
5690: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
56a0: 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f  {.    if( n!=P4_
56b0: 56 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72  VTAB ){.      fr
56c0: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
56d0: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
56e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
56f0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
5700: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
5710: 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d   assert( addr<p-
5720: 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64  >nOp );.  if( ad
5730: 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72  dr<0 ){.    addr
5740: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
5750: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
5760: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65  Op[addr];.  asse
5770: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
5780: 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20  =P4_NOTUSED.    
5790: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
57a0: 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20  e==P4_INT32.    
57b0: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
57c0: 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b  e==P4_KEYINFO );
57d0: 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f  .  freeP4(db, pO
57e0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
57f0: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
5800: 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d  .p = 0;.  if( n=
5810: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
5820: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
5830: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
5840: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
5850: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
5860: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
5870: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
5880: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
5890: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
58a0: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
58b0: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
58c0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
58d0: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
58e0: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
58f0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
5900: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5910: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
5920: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
5930: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70  KEYINFO ){.    p
5940: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
5950: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
5960: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
5970: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
5980: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n==P4_VTAB ){. 
5990: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
59a0: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
59b0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
59c0: 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65  VTAB;.    sqlite
59d0: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
59e0: 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73  e *)zP4);.    as
59f0: 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a  sert( ((VTable *
5a00: 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62  )zP4)->db==p->db
5a10: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
5a20: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
5a30: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
5a40: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
5a50: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
5a60: 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r)n;.  }else{.  
5a70: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
5a80: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
5a90: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
5aa0: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
5ab0: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
5ac0: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
5ad0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
5ae0: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  AMIC;.  }.}../*.
5af0: 2a 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e  ** Set the P4 on
5b00: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5b10: 6c 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20  ly added opcode 
5b20: 74 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66  to the KeyInfo f
5b30: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  or the.** index 
5b40: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
5b50: 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b  qlite3VdbeSetP4K
5b60: 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
5b70: 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
5b80: 78 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  x){.  Vdbe *v = 
5b90: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
5ba0: 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
5bb0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21  .  assert( pIdx!
5bc0: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
5bd0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
5be0: 31 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  1, (char*)sqlite
5bf0: 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
5c00: 70 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20  pParse, pIdx),. 
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
5c30: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
5c40: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
5c50: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a  N_COMMENTS./*.**
5c60: 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d   Change the comm
5c70: 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  ent on the most 
5c80: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69  recently coded i
5c90: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a  nstruction.  Or.
5ca0: 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f  ** insert a No-o
5cb0: 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f  p and add the co
5cc0: 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65  mment to that ne
5cd0: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  w instruction.  
5ce0: 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68  This.** makes th
5cf0: 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f  e code easier to
5d00: 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62   read during deb
5d10: 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66  ugging.  None of
5d20: 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a   this happens.**
5d30: 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   in a production
5d40: 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69   build..*/.stati
5d50: 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d  c void vdbeVComm
5d60: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
5d70: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
5d80: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
5d90: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
5da0: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
5db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
5dc0: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
5dd0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
5de0: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
5df0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
5e00: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a    if( p->nOp ){.
5e10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
5e20: 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Op );.    sqlite
5e30: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
5e40: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
5e50: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70  zComment);.    p
5e60: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
5e70: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74  zComment = sqlit
5e80: 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62  e3VMPrintf(p->db
5e90: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
5ea0: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
5eb0: 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64  e3VdbeComment(Vd
5ec0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
5ed0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
5ee0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
5ef0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76    if( p ){.    v
5f00: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
5f10: 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43  mat);.    vdbeVC
5f20: 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61  omment(p, zForma
5f30: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
5f40: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  nd(ap);.  }.}.vo
5f50: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f  id sqlite3VdbeNo
5f60: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  opComment(Vdbe *
5f70: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
5f80: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
5f90: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
5fa0: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
5fb0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20  e3VdbeAddOp0(p, 
5fc0: 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61  OP_Noop);.    va
5fd0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
5fe0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
5ff0: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
6000: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
6010: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
6020: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
6030: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
6040: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f  _VDBE_COVERAGE./
6050: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
6060: 75 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69  ue if the iSrcLi
6070: 6e 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65  ne field for the
6080: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65   previously code
6090: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
60a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
60b0: 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28  beSetLineNumber(
60c0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69  Vdbe *v, int iLi
60d0: 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  ne){.  sqlite3Vd
60e0: 62 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69  beGetOp(v,-1)->i
60f0: 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b  SrcLine = iLine;
6100: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
6110: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
6120: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E */../*.** Retu
6130: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
6140: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
6150: 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65  s.  If the addre
6160: 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a  ss is -1, then.*
6170: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * return the mos
6180: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
6190: 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a  ted opcode..**.*
61a0: 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
61b0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68  location error h
61c0: 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f  as occurred prio
61d0: 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67  r to the calling
61e0: 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   of this.** rout
61f0: 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ine, then a poin
6200: 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56  ter to a dummy V
6210: 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65  dbeOp will be re
6220: 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70  turned.  That op
6230: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61  code.** is reada
6240: 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74  ble but not writ
6250: 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20  able, though it 
6260: 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69  is cast to a wri
6270: 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20  table value..** 
6280: 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20  The return of a 
6290: 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c  dummy opcode all
62a0: 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ows the call to 
62b0: 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f  continue functio
62c0: 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e  ning.** after an
62d0: 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f   OOM fault witho
62e0: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65  ut having to che
62f0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
6300: 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a   return from .**
6310: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6320: 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
6330: 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
6340: 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20  he dummy.opcode 
6350: 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77  is 0,.** dummy w
6360: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69  ill never be wri
6370: 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69  tten to.  This i
6380: 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f  s verified by co
6390: 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e  de inspection an
63a0: 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20  d.** by running 
63b0: 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a  with Valgrind..*
63c0: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
63d0: 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20  3VdbeGetOp(Vdbe 
63e0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
63f0: 20 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65   /* C89 specifie
6400: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74  s that the const
6410: 61 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c  ant "dummy" will
6420: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
6430: 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f  to all.  ** zero
6440: 73 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72  s, which is corr
6450: 65 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72  ect.  MSVC gener
6460: 61 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20  ates a warning, 
6470: 6e 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f  nevertheless. */
6480: 0a 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70  .  static VdbeOp
6490: 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f   dummy;  /* Igno
64a0: 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e  re the MSVC warn
64b0: 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69  ing about no ini
64c0: 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73  tializer */.  as
64d0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
64e0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
64f0: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
6500: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
6510: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
6520: 61 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30  assert( (addr>=0
6530: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29   && addr<p->nOp)
6540: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
6550: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
6560: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6570: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
6580: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d  rn (VdbeOp*)&dum
6590: 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  my;.  }else{.   
65a0: 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b   return &p->aOp[
65b0: 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  addr];.  }.}..#i
65c0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
65d0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
65e0: 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20  COMMENTS)./*.** 
65f0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
6600: 72 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20  r value for one 
6610: 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  of the parameter
6620: 73 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20  s to the opcode 
6630: 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  pOp.** determine
6640: 64 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63  d by character c
6650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6660: 74 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20  translateP(char 
6670: 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70  c, const Op *pOp
6680: 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20  ){.  if( c=='1' 
6690: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31  ) return pOp->p1
66a0: 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29  ;.  if( c=='2' )
66b0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b   return pOp->p2;
66c0: 0a 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20  .  if( c=='3' ) 
66d0: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a  return pOp->p3;.
66e0: 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72    if( c=='4' ) r
66f0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b  eturn pOp->p4.i;
6700: 0a 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70  .  return pOp->p
6710: 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  5;.}../*.** Comp
6720: 75 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72  ute a string for
6730: 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66   the "comment" f
6740: 69 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f  ield of a VDBE o
6750: 70 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a  pcode listing..*
6760: 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69  *.** The Synopsi
6770: 73 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d  s: field in comm
6780: 65 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65  ents in the vdbe
6790: 2e 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67  .c source file g
67a0: 65 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a  ets converted.**
67b0: 20 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72   to an extra str
67c0: 69 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65  ing that is appe
67d0: 6e 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69  nded to the sqli
67e0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e  te3OpcodeName().
67f0: 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65    In the.** abse
6800: 6e 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d  nce of other com
6810: 6d 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f  ments, this syno
6820: 70 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65  psis becomes the
6830: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
6840: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20  opcode..** Some 
6850: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75  translation occu
6860: 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rs:.**.**       
6870: 22 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72  "PX"      ->  "r
6880: 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50  [X]".**       "P
6890: 58 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58  X@PY"   ->  "r[X
68a0: 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72  ..X+Y-1]"  or "r
68b0: 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f  [x]" if y is 0 o
68c0: 72 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  r 1.**       "PX
68d0: 40 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e  @PY+1" ->  "r[X.
68e0: 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b  .X+Y]"    or "r[
68f0: 78 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a  x]" if y is 0.**
6900: 20 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20         "PY..PY" 
6910: 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20   ->  "r[X..Y]"  
6920: 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66      or "r[x]" if
6930: 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20   y<=x.*/.static 
6940: 69 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  int displayComme
6950: 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a  nt(.  const Op *
6960: 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pOp,     /* The 
6970: 6f 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d  opcode to be com
6980: 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  mented */.  cons
6990: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f  t char *zP4,   /
69a0: 2a 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74  * Previously obt
69b0: 61 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20  ained value for 
69c0: 50 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  P4 */.  char *zT
69d0: 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72  emp,       /* Wr
69e0: 69 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20  ite result here 
69f0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20  */.  int nTemp  
6a00: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
6a10: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54   available in zT
6a20: 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f  emp[] */.){.  co
6a30: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d  nst char *zOpNam
6a40: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
6a50: 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e  *zSynopsis;.  in
6a60: 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74  t nOpName;.  int
6a70: 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61   ii, jj;.  zOpNa
6a80: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  me = sqlite3Opco
6a90: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
6aa0: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d  de);.  nOpName =
6ab0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6ac0: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (zOpName);.  if(
6ad0: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65   zOpName[nOpName
6ae0: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  +1] ){.    int s
6af0: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  eenCom = 0;.    
6b00: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e  char c;.    zSyn
6b10: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20  opsis = zOpName 
6b20: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a  += nOpName + 1;.
6b30: 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b      for(ii=jj=0;
6b40: 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28   jj<nTemp-1 && (
6b50: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69  c = zSynopsis[ii
6b60: 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20  ])!=0; ii++){.  
6b70: 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29      if( c=='P' )
6b80: 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53  {.        c = zS
6b90: 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20  ynopsis[++ii];. 
6ba0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34         if( c=='4
6bb0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
6bc0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6bd0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
6be0: 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a  jj, "%s", zP4);.
6bf0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
6c00: 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20  ( c=='X' ){.    
6c10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6c20: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
6c30: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
6c40: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
6c50: 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43  .          seenC
6c60: 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  om = 1;.        
6c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6c80: 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c   int v1 = transl
6c90: 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20  ateP(c, pOp);.  
6ca0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a          int v2;.
6cb0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6cc0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6cd0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
6ce0: 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20  %d", v1);.      
6cf0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
6d00: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
6d10: 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20  "@P", 2)==0 ){. 
6d20: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
6d30: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   3;.            
6d40: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
6d50: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
6d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20  .            v2 
6d70: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79  = translateP(zSy
6d80: 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29  nopsis[ii], pOp)
6d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
6da0: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
6db0: 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29  sis+ii+1,"+1",2)
6dc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6dd0: 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20       ii += 2;.  
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b              v2++
6df0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6e10: 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  v2>1 ){.        
6e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6e30: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
6e40: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64   zTemp+jj, "..%d
6e50: 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20  ", v1+v2-1);.   
6e60: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6e70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
6e80: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
6e90: 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34  +ii+1, "..P3", 4
6ea0: 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )==0 && pOp->p3=
6eb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6ec0: 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20    ii += 4;.     
6ed0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6ee0: 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  .        jj += s
6ef0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6f00: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
6f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
6f20: 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a  Temp[jj++] = c;.
6f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6f40: 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26    if( !seenCom &
6f50: 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20  & jj<nTemp-5 && 
6f60: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
6f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6f80: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
6f90: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25  , zTemp+jj, "; %
6fa0: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
6fb0: 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20  t);.      jj += 
6fc0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6fd0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d  zTemp+jj);.    }
6fe0: 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d  .    if( jj<nTem
6ff0: 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20  p ) zTemp[jj] = 
7000: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
7010: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
7020: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7030: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7040: 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  p, "%s", pOp->zC
7050: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20  omment);.    jj 
7060: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7070: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73  0(zTemp);.  }els
7080: 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  e{.    zTemp[0] 
7090: 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b  = 0;.    jj = 0;
70a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a  .  }.  return jj
70b0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
70c0: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a  LITE_DEBUG */...
70d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
70e0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
70f0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44  ) || !defined(ND
7100: 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20  EBUG) \.     || 
7110: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
7120: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
7130: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
7140: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
7150: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
7160: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
7170: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
7180: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
7190: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
71a0: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
71b0: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
71c0: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
71d0: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
71e0: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
71f0: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
7200: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73  P4 = zTemp;.  as
7210: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
7220: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
7230: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
7240: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
7250: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
7260: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
7270: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70   *pKeyInfo = pOp
7280: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
7290: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
72a0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
72b0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r!=0 );.      sq
72c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
72d0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28  Temp, zTemp, "k(
72e0: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
72f0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20  Field);.      i 
7300: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7310: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  0(zTemp);.      
7320: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
7330: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
7340: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
7350: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
7360: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
7370: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
7380: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
7390: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
73a0: 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20   : "nil";.      
73b0: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
73c0: 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
73d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d  ;.        if( n=
73e0: 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f  =6 && memcmp(zCo
73f0: 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d  ll,"BINARY",6)==
7400: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
7410: 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20  Coll = "B";.    
7420: 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
7430: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
7440: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29  f( i+n>nTemp-6 )
7450: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
7460: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
7470: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
7480: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
7490: 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70   }.        zTemp
74a0: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
74b0: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
74c0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
74d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
74e0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
74f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7500: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
7510: 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b  i], zColl, n+1);
7520: 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b  .        i += n;
7530: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
7540: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b  Temp[i++] = ')';
7550: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20  .      zTemp[i] 
7560: 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
7570: 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20  t( i<nTemp );.  
7580: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7590: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c  .    case P4_COL
75a0: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
75b0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
75c0: 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20  Op->p4.pColl;.  
75d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
75e0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
75f0: 70 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43  p, "(%.20s)", pC
7600: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
7610: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7620: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
7630: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
7640: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
7650: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
7660: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7670: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7680: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
7690: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
76a0: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
76b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
76c0: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
76d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
76e0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
76f0: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
7700: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
7710: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7720: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
7730: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7740: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7750: 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70  zTemp, "%d", pOp
7760: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
7770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7780: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
7790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
77a0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
77b0: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  emp, "%.16g", *p
77c0: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
77d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
77e0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
77f0: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
7800: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
7810: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
7820: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
7830: 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  _Str ){.        
7840: 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20  zP4 = pMem->z;. 
7850: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
7860: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
7870: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  _Int ){.        
7880: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7890: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
78a0: 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69  %lld", pMem->u.i
78b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
78c0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
78d0: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
78e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
78f0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7900: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65  mp, "%.16g", pMe
7910: 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  m->u.r);.      }
7920: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
7930: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
7940: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7950: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7960: 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22  p, zTemp, "NULL"
7970: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7980: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7990: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
79a0: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
79b0: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
79c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
79d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
79e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
79f0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
7a00: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
7a10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7a20: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
7a30: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
7a40: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
7a50: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7a60: 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25  , zTemp, "vtab:%
7a70: 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56  p:%p", pVtab, pV
7a80: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20  tab->pModule);. 
7a90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7aa0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
7ab0: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b  e P4_INTARRAY: {
7ac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7ad0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7ae0: 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22  Temp, "intarray"
7af0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7b00: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7b10: 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a  4_SUBPROGRAM: {.
7b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7b30: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7b40: 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b  emp, "program");
7b50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7b60: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7b70: 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20  ADVANCE: {.     
7b80: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
7b90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7ba0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
7bb0: 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70  .      zP4 = pOp
7bc0: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66  ->p4.z;.      if
7bd0: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
7be0: 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b      zP4 = zTemp;
7bf0: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30  .        zTemp[0
7c00: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
7c10: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
7c20: 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72  t( zP4!=0 );.  r
7c30: 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e  eturn zP4;.}.#en
7c40: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  dif../*.** Decla
7c50: 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74  re to the Vdbe t
7c60: 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62  hat the BTree ob
7c70: 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b  ject at db->aDb[
7c80: 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a  i] is used..**.*
7c90: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
7ca0: 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74  tatements need t
7cb0: 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63  o know in advanc
7cc0: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  e the complete s
7cd0: 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65  et of.** attache
7ce0: 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  d databases that
7cf0: 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41   will be use.  A
7d00: 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64   mask of these d
7d10: 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d  atabases.** is m
7d20: 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e  aintained in p->
7d30: 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20  btreeMask.  The 
7d40: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75  p->lockMask valu
7d50: 65 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20  e is the subset 
7d60: 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61  of.** p->btreeMa
7d70: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  sk of databases 
7d80: 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72  that will requir
7d90: 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69  e a lock..*/.voi
7da0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
7db0: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
7dc0: 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74  int i){.  assert
7dd0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
7de0: 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74  b->nDb && i<(int
7df0: 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29  )sizeof(yDbMask)
7e00: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
7e10: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
7e20: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
7e30: 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e  .  DbMaskSet(p->
7e40: 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20  btreeMask, i);. 
7e50: 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c   if( i!=1 && sql
7e60: 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c  ite3BtreeSharabl
7e70: 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e  e(p->db->aDb[i].
7e80: 70 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61  pBt) ){.    DbMa
7e90: 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  skSet(p->lockMas
7ea0: 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  k, i);.  }.}..#i
7eb0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
7ec0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
7ed0: 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54  CHE) && SQLITE_T
7ee0: 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a  HREADSAFE>0./*.*
7ef0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63  * If SQLite is c
7f00: 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f  ompiled to suppo
7f10: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
7f20: 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74  mode and to be t
7f30: 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68  hreadsafe,.** th
7f40: 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69  is routine obtai
7f50: 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73  ns the mutex ass
7f60: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63  ociated with eac
7f70: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
7f80: 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79  ture.** that may
7f90: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20   be accessed by 
7fa0: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
7fb0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e   an argument. In
7fc0: 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73   doing so it als
7fd0: 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74  o.** sets the Bt
7fe0: 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72  Shared.db member
7ff0: 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20   of each of the 
8000: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
8010: 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a  res, ensuring.**
8020: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
8030: 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  t busy-handler c
8040: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
8050: 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  ed if required..
8060: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20  **.** If SQLite 
8070: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
8080: 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f  e but does suppo
8090: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
80a0: 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71  mode, then.** sq
80b0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
80c0: 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  ) is invoked to 
80d0: 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64  set the BtShared
80e0: 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  .db variables.**
80f0: 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61   of all of BtSha
8100: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61  red structures a
8110: 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68  ccessible via th
8120: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
8130: 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  e .** associated
8140: 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a   with the VM..**
8150: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
8160: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
8170: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  and does not sup
8180: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
8190: 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20  e mode, this.** 
81a0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
81b0: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
81c0: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c  ->btreeMask fiel
81d0: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  d is a bitmask o
81e0: 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61  f all btrees tha
81f0: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a  t the prepared .
8200: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77  ** statement p w
8210: 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c  ill ever use.  L
8220: 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62  et N be the numb
8230: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d  er of bits in p-
8240: 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f  >btreeMask.** co
8250: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62  rresponding to b
8260: 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73  trees that use s
8270: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
8280: 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f  en the runtime o
8290: 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  f.** this routin
82a0: 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61  e is N*N.  But a
82b0: 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f  s N is rarely mo
82c0: 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20  re than 1, this 
82d0: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65  should not.** be
82e0: 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
82f0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
8300: 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  nter(Vdbe *p){. 
8310: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
8320: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
8330: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
8340: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
8350: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
8360: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
8370: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
8380: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
8390: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
83a0: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
83b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b   for(i=0; i<nDb;
83c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
83d0: 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73  !=1 && DbMaskTes
83e0: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29  t(p->lockMask,i)
83f0: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
8400: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
8410: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
8420: 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29  nter(aDb[i].pBt)
8430: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
8440: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
8450: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
8460: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
8470: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
8480: 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  E>0./*.** Unlock
8490: 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65   all of the btre
84a0: 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  es previously lo
84b0: 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  cked by a call t
84c0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  o sqlite3VdbeEnt
84d0: 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  er()..*/.void sq
84e0: 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 56  lite3VdbeLeave(V
84f0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
8500: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
8510: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
8520: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d  t nDb;.  if( DbM
8530: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f  askAllZero(p->lo
8540: 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e  ckMask) ) return
8550: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
8560: 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20   case */.  db = 
8570: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
8580: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
8590: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
85a0: 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b  =0; i<nDb; i++){
85b0: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
85c0: 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c   DbMaskTest(p->l
85d0: 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c  ockMask,i) && AL
85e0: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
85f0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
8600: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61  ite3BtreeLeave(a
8610: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
8620: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
8630: 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45  #if defined(VDBE
8640: 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66  _PROFILE) || def
8650: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
8660: 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  G)./*.** Print a
8670: 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20   single opcode. 
8680: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8690: 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   used for debugg
86a0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  ing only..*/.voi
86b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
86c0: 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c  ntOp(FILE *pOut,
86d0: 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70   int pc, Op *pOp
86e0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a  ){.  char *zP4;.
86f0: 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b    char zPtr[50];
8700: 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30  .  char zCom[100
8710: 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ];.  static cons
8720: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31  t char *zFormat1
8730: 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34   = "%4d %-13s %4
8740: 64 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20  d %4d %4d %-13s 
8750: 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66  %.2X %s\n";.  if
8760: 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74  ( pOut==0 ) pOut
8770: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34   = stdout;.  zP4
8780: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
8790: 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a  , zPtr, sizeof(z
87a0: 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51  Ptr));.#ifdef SQ
87b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
87c0: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64  AIN_COMMENTS.  d
87d0: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
87e0: 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69  p, zP4, zCom, si
87f0: 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c  zeof(zCom));.#el
8800: 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30  se.  zCom[0] = 0
8810: 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42  ;.#endif.  /* NB
8820: 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70  :  The sqlite3Op
8830: 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74  codeName() funct
8840: 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
8850: 65 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74  ed by code creat
8860: 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d  ed.  ** by the m
8870: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64  kopcodeh.awk and
8880: 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73   mkopcodec.awk s
8890: 63 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74  cripts which ext
88a0: 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e  ract the.  ** in
88b0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
88c0: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
88d0: 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e   text */.  fprin
88e0: 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74  tf(pOut, zFormat
88f0: 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71  1, pc, .      sq
8900: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
8910: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f  pOp->opcode), pO
8920: 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20  p->p1, pOp->p2, 
8930: 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f  pOp->p3, zP4, pO
8940: 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f  p->p5,.      zCo
8950: 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28  m.  );.  fflush(
8960: 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pOut);.}.#endif.
8970: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
8980: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
8990: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   elements.*/.sta
89a0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
89b0: 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c  MemArray(Mem *p,
89c0: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
89d0: 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d   && N ){.    Mem
89e0: 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a   *pEnd = &p[N];.
89f0: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
8a00: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20  = p->db;.    u8 
8a10: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20  malloc_failed = 
8a20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8a30: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
8a40: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
8a50: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
8a60: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
8a70: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
8a80: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
8a90: 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28  .      }while( (
8aa0: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
8ab0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8ac0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61  .    do{.      a
8ad0: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
8ae0: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
8af0: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20  =p[1].db );.    
8b00: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8b10: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
8b20: 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20  ariants(p) );.. 
8b30: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
8b40: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
8b50: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
8b60: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
8b70: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
8b80: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
8b90: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
8ba0: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
8bb0: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
8bc0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
8bd0: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
8be0: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
8bf0: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
8c00: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
8c10: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
8c20: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
8c30: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
8c40: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
8c50: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
8c60: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
8c70: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
8c80: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
8c90: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
8ca0: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
8cb0: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
8cc0: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
8cd0: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
8ce0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
8cf0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
8d00: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
8d10: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
8d20: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
8d30: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
8d40: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
8d50: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
8d60: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
8d70: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
8d80: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
8d90: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
8da0: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
8db0: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
8dc0: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
8dd0: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
8de0: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
8df0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
8e00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73      */.      tes
8e10: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
8e20: 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20  & MEM_Agg );.   
8e30: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
8e40: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
8e50: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
8e60: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
8e70: 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20  M_Frame );.     
8e80: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
8e90: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
8ea0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
8eb0: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
8ec0: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d  MEM_Dyn|MEM_Fram
8ed0: 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b  e|MEM_RowSet) ){
8ee0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8ef0: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
8f00: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
8f10: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
8f20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8f30: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
8f40: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
8f50: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
8f60: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
8f70: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
8f80: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d  Undefined;.    }
8f90: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
8fa0: 64 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  d );.    db->mal
8fb0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
8fc0: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
8fd0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
8fe0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
8ff0: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
9000: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
9010: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
9020: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
9030: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
9040: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
9050: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
9060: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
9070: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
9080: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
9090: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
90a0: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
90b0: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
90c0: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
90d0: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
90e0: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
90f0: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
9100: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
9110: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
9120: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
9130: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
9140: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
9150: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
9160: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
9170: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
9180: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9190: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
91a0: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
91b0: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
91c0: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
91d0: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
91e0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
91f0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
9200: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
9210: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
9220: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
9230: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
9240: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
9250: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
9260: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
9270: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
9280: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
9290: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
92a0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
92b0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
92c0: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
92d0: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
92e0: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
92f0: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
9300: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
9310: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
9320: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
9330: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
9340: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
9350: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
9360: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
9370: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
9380: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
9390: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
93a0: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
93b0: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
93c0: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
93d0: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
93e0: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
93f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
9400: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9420: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
9430: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9460: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
9470: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
9480: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
9490: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
94a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
94b0: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
94c0: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
94d0: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
94e0: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
94f0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
9500: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
9510: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
9540: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
9550: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
9560: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9570: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
9580: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
9590: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
95a0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
95d0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
95e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
95f0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
9600: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
9610: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
9620: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
9630: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
9640: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
9650: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
9660: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
9670: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
9680: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
9690: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
96a0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
96b0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
96c0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
96d0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
96e0: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
96f0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
9700: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
9710: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
9720: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
9730: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
9740: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
9750: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
9760: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
9770: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
9780: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
9790: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
97a0: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
97b0: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
97c0: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
97d0: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
97e0: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
97f0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
9800: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
9810: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
9820: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
9830: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
9840: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
9850: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
9860: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
9870: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
9880: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
9890: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
98a0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
98b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
98c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
98d0: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
98e0: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
98f0: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
9900: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
9910: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
9920: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
9930: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
9940: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
9950: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
9960: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
9970: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
9980: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
9990: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
99a0: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
99b0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
99c0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
99d0: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
99e0: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
99f0: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
9a00: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
9a10: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
9a20: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
9a30: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
9a40: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
9a50: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
9a60: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
9a70: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
9a80: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
9a90: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
9aa0: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
9ab0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
9ac0: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
9ad0: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
9ae0: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
9af0: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
9b00: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
9b10: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
9b20: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
9b30: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
9b40: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
9b50: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
9b60: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
9b70: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
9b80: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
9b90: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
9ba0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
9bb0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
9bc0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
9bd0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
9be0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
9bf0: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
9c00: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
9c10: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
9c20: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
9c30: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
9c40: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
9c50: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
9c60: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
9c70: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
9c80: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
9c90: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
9ca0: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
9cb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
9cc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
9cd0: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
9ce0: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
9cf0: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
9d00: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
9d10: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
9d20: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
9d30: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
9d40: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
9d50: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
9d60: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
9d70: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
9d80: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
9d90: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
9da0: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
9db0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
9dc0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
9dd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
9de0: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
9df0: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
9e00: 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
9e10: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
9e20: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
9e30: 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20     char *zP4;.  
9e40: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69    Op *pOp;.    i
9e50: 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  f( i<p->nOp ){. 
9e60: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
9e70: 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  ut line number i
9e80: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74  s small enough t
9e90: 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c  hat we are still
9ea0: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
9eb0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a   main program. *
9ec0: 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70  /.      pOp = &p
9ed0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65  ->aOp[i];.    }e
9ee0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  lse{.      /* We
9ef0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c   are currently l
9f00: 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61  isting subprogra
9f10: 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20  ms.  Figure out 
9f20: 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20  which one and.  
9f30: 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74      ** pick up t
9f40: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f  he appropriate o
9f50: 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20  pcode. */.      
9f60: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d  int j;.      i -
9f70: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  = p->nOp;.      
9f80: 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75  for(j=0; i>=apSu
9f90: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b  b[j]->nOp; j++){
9fa0: 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70  .        i -= ap
9fb0: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[j]->nOp;.   
9fc0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d     }.      pOp =
9fd0: 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b   &apSub[j]->aOp[
9fe0: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i];.    }.    if
9ff0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
a000: 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
a010: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
a020: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
a030: 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  = i;            
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63      /* Program c
a060: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
a070: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20  pMem++;.  .     
a080: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a090: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
a0a0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
a0b0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
a0c0: 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  r*)sqlite3Opcode
a0d0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
a0e0: 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a  ); /* Opcode */.
a0f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
a100: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
a110: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
a120: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
a130: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
a140: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
a150: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
a160: 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  +;..      /* Whe
a170: 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20  n an OP_Program 
a180: 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e  opcode is encoun
a190: 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70  ter (the only op
a1a0: 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20  code that has.  
a1b0: 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50      ** a P4_SUBP
a1c0: 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29  ROGRAM argument)
a1d0: 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a  , expand the siz
a1e0: 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f  e of the array o
a1f0: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20  f subprograms.  
a200: 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70      ** kept in p
a210: 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68  ->aMem[9].z to h
a220: 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67  old the new prog
a230: 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74  ram - assuming t
a240: 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20  his subprogram. 
a250: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20       ** has not 
a260: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65  already been see
a270: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
a280: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
a290: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
a2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
a2b0: 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29  nByte = (nSub+1)
a2c0: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
a2d0: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  am*);.        in
a2e0: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
a2f0: 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b  (j=0; j<nSub; j+
a300: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
a310: 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d  ( apSub[j]==pOp-
a320: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
a330: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
a340: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
a350: 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  Sub && SQLITE_OK
a360: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ==sqlite3VdbeMem
a370: 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65  Grow(pSub, nByte
a380: 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20  , nSub!=0) ){.  
a390: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
a3a0: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
a3b0: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
a3c0: 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20    apSub[nSub++] 
a3d0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
a3e0: 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  am;.          pS
a3f0: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
a400: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  _Blob;.         
a410: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
a420: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
a430: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m*);.        }. 
a440: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a450: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
a460: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
a470: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
a480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
a4a0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
a4b0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
a4c0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
a4d0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
a4e0: 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p2;            
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a500: 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b   P2 */.    pMem+
a510: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
a520: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
a530: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
a540: 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20  Op->p3;         
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a560: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d   /* P3 */.    pM
a570: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73  em++;..    if( s
a580: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
a590: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
a5a0: 2c 20 33 32 29 20 29 7b 20 2f 2a 20 50 34 20 2a  , 32) ){ /* P4 *
a5b0: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
a5c0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
a5d0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
a5e0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
a5f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
a600: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
a610: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
a620: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
a630: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32  pOp, pMem->z, 32
a640: 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d  );.    if( zP4!=
a650: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  pMem->z ){.     
a660: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
a670: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c  etStr(pMem, zP4,
a680: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
a690: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
a6a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a6b0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
a6c0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
a6d0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
a6e0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
a6f0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
a700: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
a710: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
a720: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
a730: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
a740: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
a750: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34  ndResize(pMem, 4
a760: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
a770: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
a780: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
a790: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a7a0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
a7b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
a7c0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
a7d0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
a7e0: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
a7f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
a800: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
a810: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
a820: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
a830: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
a840: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
a850: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
a860: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
a870: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
a880: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a890: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
a8a0: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30  Resize(pMem, 500
a8b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
a8c0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
a8d0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
a8e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a8f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
a900: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
a910: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
a920: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
a930: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f  m->n = displayCo
a940: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
a950: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20  pMem->z, 500);. 
a960: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
a970: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
a980: 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  lse.      pMem->
a990: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
a9a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a9b0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
a9c0: 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  nt */.#endif.   
a9d0: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
a9e0: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
a9f0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
aa00: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
aa10: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20  = &p->aMem[1];. 
aa20: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
aa30: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
aa40: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
aa50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
aa60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
aa70: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
aa80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
aa90: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
aaa0: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
aab0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
aac0: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
aad0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
aae0: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
aaf0: 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20  be *p){.  const 
ab00: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69  char *z = 0;.  i
ab10: 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
ab20: 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20    z = p->zSql;. 
ab30: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f   }else if( p->nO
ab40: 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73  p>=1 ){.    cons
ab50: 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20  t VdbeOp *pOp = 
ab60: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20  &p->aOp[0];.    
ab70: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
ab80: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
ab90: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
aba0: 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b    z = pOp->p4.z;
abb0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71  .      while( sq
abc0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29  lite3Isspace(*z)
abd0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) z++;.    }.  
abe0: 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e  }.  if( z ) prin
abf0: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
ac00: 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  , z);.}.#endif..
ac10: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
ac20: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
ac30: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
ac40: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
ac50: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  )./*.** Print an
ac60: 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65   IOTRACE message
ac70: 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e   showing SQL con
ac80: 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tent..*/.void sq
ac90: 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65  lite3VdbeIOTrace
aca0: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
acb0: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
acc0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
acd0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f  .  if( sqlite3Io
ace0: 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Trace==0 ) retur
acf0: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  n;.  if( nOp<1 )
ad00: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
ad10: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
ad20: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
ad30: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
ad40: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
ad50: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
ad60: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
ad70: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ad80: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
ad90: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
ada0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
adb0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
adc0: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
add0: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
ade0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
adf0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
ae00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
ae10: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
ae20: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
ae30: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
ae40: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
ae50: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
ae60: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
ae70: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
ae80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
ae90: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
aea0: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
aeb0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
aec0: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
aed0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
aee0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
aef0: 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61  ate space from a
af00: 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66   fixed size buff
af10: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  er and return a 
af20: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
af30: 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e  at space.  If in
af40: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
af50: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
af60: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
af70: 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d  * The pBuf param
af80: 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74  eter is the init
af90: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70  ial value of a p
afa0: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c  ointer which wil
afb0: 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65  l.** receive the
afc0: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42   new memory.  pB
afd0: 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e  uf is normally N
afe0: 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73  ULL.  If pBuf is
aff0: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74   not.** NULL, it
b000: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f   means that memo
b010: 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72  ry space has alr
b020: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
b030: 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20  ted and that.** 
b040: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
b050: 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  uld not allocate
b060: 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   any new memory.
b070: 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e    When pBuf is n
b080: 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c  ot.** NULL simpl
b090: 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20  y return pBuf.  
b0a0: 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65  Only allocate ne
b0b0: 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77  w memory space w
b0c0: 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e  hen pBuf.** is N
b0d0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65  ULL..**.** nByte
b0e0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b0f0: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
b100: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a   needed..**.** *
b110: 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f  ppFrom points to
b120: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
b130: 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73   and pEnd points
b140: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
b150: 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  he.** available 
b160: 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61  space.  When spa
b170: 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  ce is allocated,
b180: 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61   *ppFrom is adva
b190: 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65  nced past.** the
b1a0: 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f   end of the allo
b1b0: 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a  cated space..**.
b1c0: 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20  ** *pnByte is a 
b1d0: 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e  counter of the n
b1e0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
b1f0: 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76  f space that hav
b200: 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61  e failed.** to a
b210: 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65  llocate.  If the
b220: 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65  re is insufficie
b230: 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46  nt space in *ppF
b240: 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74  rom to satisfy t
b250: 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74  he.** request, t
b260: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  hen increment *p
b270: 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f  nByte by the amo
b280: 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65  unt of the reque
b290: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
b2a0: 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a  id *allocSpace(.
b2b0: 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
b2c0: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
b2d0: 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77  return pointer w
b2e0: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f  ill be stored */
b2f0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
b300: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b310: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c  r of bytes to al
b320: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a  locate */.  u8 *
b330: 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  *ppFrom,        
b340: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f   /* IN/OUT: Allo
b350: 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f  cate from *ppFro
b360: 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c  m */.  u8 *pEnd,
b370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b380: 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65  ointer to 1 byte
b390: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
b3a0: 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20   *ppFrom buffer 
b3b0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65  */.  int *pnByte
b3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
b3d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f  allocation canno
b3e0: 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65  t be made, incre
b3f0: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a  ment *pnByte */.
b400: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
b410: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
b420: 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20  T(*ppFrom) );.  
b430: 69 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72  if( pBuf ) retur
b440: 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20  n pBuf;.  nByte 
b450: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
b460: 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d  .  if( &(*ppFrom
b470: 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64  )[nByte] <= pEnd
b480: 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28   ){.    pBuf = (
b490: 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20  void*)*ppFrom;. 
b4a0: 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42     *ppFrom += nB
b4b0: 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  yte;.  }else{.  
b4c0: 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79    *pnByte += nBy
b4d0: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
b4e0: 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pBuf;.}../*.** 
b4f0: 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20  Rewind the VDBE 
b500: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
b510: 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61  nning in prepara
b520: 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e  tion for.** runn
b530: 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ing it..*/.void 
b540: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
b550: 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20  d(Vdbe *p){.#if 
b560: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
b570: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
b580: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20  (VDBE_PROFILE). 
b590: 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20   int i;.#endif. 
b5a0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
b5b0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
b5c0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
b5d0: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
b5e0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
b5f0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
b600: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
b610: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
b620: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
b630: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
b640: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
b650: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
b660: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
b670: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23  BE_MAGIC_RUN;..#
b680: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
b690: 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  UG.  for(i=1; i<
b6a0: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20  p->nMem; i++){. 
b6b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d     assert( p->aM
b6c0: 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20  em[i].db==p->db 
b6d0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
b6e0: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
b6f0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
b700: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
b710: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
b720: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
b730: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
b740: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
b750: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
b760: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
b770: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
b780: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
b790: 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73   0;.  p->nFkCons
b7a0: 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64  traint = 0;.#ifd
b7b0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
b7c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
b7d0: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  nOp; i++){.    p
b7e0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
b7f0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  ;.    p->aOp[i].
b800: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a  cycles = 0;.  }.
b810: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
b820: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
b830: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
b840: 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ecution for the 
b850: 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72  first time after
b860: 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65  .** creating the
b870: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
b880: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
b890: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
b8a0: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65  as allocating re
b8b0: 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74  gisters and init
b8c0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
b8d0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
b8e0: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
b8f0: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
b900: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
b910: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
b920: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
b930: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
b940: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75    .**.** This fu
b950: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
b960: 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  lled exactly onc
b970: 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61  e on each virtua
b980: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66  l machine..** Af
b990: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
b9a0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56   is called the V
b9b0: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b  M has been "pack
b9c0: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61  aged" and is rea
b9d0: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41  dy.** to run.  A
b9e0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
b9f0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72  e is called, fur
ba00: 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a  ther calls to .*
ba10: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
ba20: 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  Op() functions a
ba30: 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20  re prohibited.  
ba40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73  This routine dis
ba50: 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20  connects.** the 
ba60: 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61  Vdbe from the Pa
ba70: 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  rse object that 
ba80: 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20  helped generate 
ba90: 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  it so that the.*
baa0: 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d  * the Vdbe becom
bab0: 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e  es an independen
bac0: 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65  t entity and the
bad0: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61   Parse object ca
bae0: 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65  n be.** destroye
baf0: 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  d..**.** Use the
bb00: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
bb10: 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74  nd() procedure t
bb20: 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74  o restore a virt
bb30: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b  ual machine back
bb40: 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69  .** to its initi
bb50: 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69  al state after i
bb60: 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a  t has been run..
bb70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
bb80: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20  dbeMakeReady(.  
bb90: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bbb0: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20  * The VDBE */.  
bbc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20  Parse *pParse   
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bbe0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
bbf0: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
bc00: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
bc10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
bc20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
bc30: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ion */.  int nVa
bc40: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
bc50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
bc60: 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20  r of parameters 
bc70: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20  */.  int nMem;  
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bca0: 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73   VM memory regis
bcb0: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ters */.  int nC
bcc0: 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ursor;          
bcd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bce0: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65  er of cursors re
bcf0: 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
bd00: 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  nArg;           
bd10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bd20: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
bd30: 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73  s in subprograms
bd40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b   */.  int nOnce;
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
bd70: 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75  f OP_Once instru
bd80: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
bd90: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
bda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
bdb0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
bdc0: 75 38 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20  u8 *zCsr;       
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bde0: 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62  * Memory availab
bdf0: 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f  le for allocatio
be00: 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b  n */.  u8 *zEnd;
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
be30: 79 74 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74  yte past allocat
be40: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
be50: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be70: 20 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20   How much extra 
be80: 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64  memory is needed
be90: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
bea0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
beb0: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
bec0: 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
bed0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
bee0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
bef0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
bf00: 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e  ert( pParse==p->
bf10: 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d  pParse );.  db =
bf20: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
bf30: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
bf40: 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20  ed==0 );.  nVar 
bf50: 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  = pParse->nVar;.
bf60: 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d    nMem = pParse-
bf70: 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72  >nMem;.  nCursor
bf80: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
bf90: 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65  .  nArg = pParse
bfa0: 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e  ->nMaxArg;.  nOn
bfb0: 63 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e  ce = pParse->nOn
bfc0: 63 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d  ce;.  if( nOnce=
bfd0: 3d 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20  =0 ) nOnce = 1; 
bfe0: 2f 2a 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61  /* Ensure at lea
bff0: 73 74 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70  st one byte in p
c000: 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f  ->aOnceFlag[] */
c010: 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  .  .  /* For eac
c020: 68 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65  h cursor require
c030: 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  d, also allocate
c040: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20   a memory cell. 
c050: 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c  Memory.  ** cell
c060: 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f  s (nMem+1-nCurso
c070: 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73  r)..nMem, inclus
c080: 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20  ive, will never 
c090: 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20  be used by.  ** 
c0a0: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
c0b0: 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61  . Instead they a
c0c0: 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  re used to alloc
c0d0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20  ate space for.  
c0e0: 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74  ** VdbeCursor/Bt
c0f0: 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65  Cursor structure
c100: 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d  s. The blob of m
c110: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
c120: 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73   with .  ** curs
c130: 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69  or 0 is stored i
c140: 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d  n memory cell nM
c150: 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20  em. Memory cell 
c160: 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74  (nMem-1).  ** st
c170: 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66  ores the blob of
c180: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
c190: 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31  ed with cursor 1
c1a0: 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  , etc..  **.  **
c1b0: 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63   See also: alloc
c1c0: 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a  ateCursor()..  *
c1d0: 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72  /.  nMem += nCur
c1e0: 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  sor;..  /* Alloc
c1f0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
c200: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20  mory registers, 
c210: 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56  SQL variables, V
c220: 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20  DBE cursors and 
c230: 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74  .  ** an array t
c240: 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75  o marshal SQL fu
c250: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
c260: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72   in..  */.  zCsr
c270: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b   = (u8*)&p->aOp[
c280: 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 20  p->nOp];        
c290: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76      /* Memory av
c2a0: 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  aliable for allo
c2b0: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64  cation */.  zEnd
c2c0: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b   = (u8*)&p->aOp[
c2d0: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
c2e0: 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74  ];  /* First byt
c2f0: 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43  e past end of zC
c300: 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c  sr[] */..  resol
c310: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e  veP2Values(p, &n
c320: 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53  Arg);.  p->usesS
c330: 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  tmtJournal = (u8
c340: 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74  )(pParse->isMult
c350: 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65  iWrite && pParse
c360: 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69  ->mayAbort);.  i
c370: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
c380: 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b  in && nMem<10 ){
c390: 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  .    nMem = 10;.
c3a0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73    }.  memset(zCs
c3b0: 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29  r, 0, zEnd-zCsr)
c3c0: 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73  ;.  zCsr += (zCs
c3d0: 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20  r - (u8*)0)&7;. 
c3e0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
c3f0: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43  YTE_ALIGNMENT(zC
c400: 73 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69  sr) );.  p->expi
c410: 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d  red = 0;..  /* M
c420: 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74  emory for regist
c430: 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c  ers, parameters,
c440: 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73   cursor, etc, is
c450: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77   allocated in tw
c460: 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20  o.  ** passes.  
c470: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73  On the first pas
c480: 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75  s, we try to reu
c490: 73 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  se unused space 
c4a0: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64  at the .  ** end
c4b0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
c4c0: 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65  rray.  If we are
c4d0: 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73   unable to satis
c4e0: 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20  fy all memory.  
c4f0: 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  ** requirements 
c500: 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f  by reusing the o
c510: 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c  pcode array tail
c520: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
c530: 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c  d.  ** pass will
c540: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73   fill in the res
c550: 74 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20  t using a fresh 
c560: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20  allocation.  .  
c570: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f  **.  ** This two
c580: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74  -pass approach t
c590: 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75  hat reuses as mu
c5a0: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
c5b0: 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20  sible from.  ** 
c5c0: 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61  the leftover spa
c5d0: 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
c5e0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
c5f0: 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e  y can significan
c600: 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20  tly.  ** reduce 
c610: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  the amount of me
c620: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70  mory held by a p
c630: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
c640: 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20  t..  */.  do {. 
c650: 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20     nByte = 0;.  
c660: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f    p->aMem = allo
c670: 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20  cSpace(p->aMem, 
c680: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
c690: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
c6a0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
c6b0: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
c6c0: 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73  (p->aVar, nVar*s
c6d0: 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73  izeof(Mem), &zCs
c6e0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
c6f0: 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d  ;.    p->apArg =
c700: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
c710: 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  pArg, nArg*sizeo
c720: 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20  f(Mem*), &zCsr, 
c730: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
c740: 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c     p->azVar = al
c750: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61  locSpace(p->azVa
c760: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63  r, nVar*sizeof(c
c770: 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  har*), &zCsr, zE
c780: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
c790: 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f   p->apCsr = allo
c7a0: 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c  cSpace(p->apCsr,
c7b0: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
c7c0: 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20  VdbeCursor*),.  
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a          &zCsr, z
c7f0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
c800: 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d    p->aOnceFlag =
c810: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
c820: 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c  OnceFlag, nOnce,
c830: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
c840: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Byte);.    if( n
c850: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  Byte ){.      p-
c860: 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >pFree = sqlite3
c870: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c880: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20   nByte);.    }. 
c890: 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72     zCsr = p->pFr
c8a0: 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26  ee;.    zEnd = &
c8b0: 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d  zCsr[nByte];.  }
c8c0: 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20  while( nByte && 
c8d0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
c8e0: 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73  d );..  p->nCurs
c8f0: 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
c900: 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e  p->nOnceFlag = n
c910: 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61  Once;.  if( p->a
c920: 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  Var ){.    p->nV
c930: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
c940: 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e  ;.    for(n=0; n
c950: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
c960: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
c970: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
c980: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
c990: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
c9a0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56    }.  if( p->azV
c9b0: 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56  ar ){.    p->nzV
c9c0: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56  ar = pParse->nzV
c9d0: 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ar;.    memcpy(p
c9e0: 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d  ->azVar, pParse-
c9f0: 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72  >azVar, p->nzVar
ca00: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72  *sizeof(p->azVar
ca10: 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  [0]));.    memse
ca20: 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  t(pParse->azVar,
ca30: 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61   0, pParse->nzVa
ca40: 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  r*sizeof(pParse-
ca50: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d  >azVar[0]));.  }
ca60: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
ca70: 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b  {.    p->aMem--;
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca90: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20        /* aMem[] 
caa0: 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65  goes from 1..nMe
cab0: 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  m */.    p->nMem
cac0: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20   = nMem;        
cad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20           /*     
cae0: 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d    not from 0..nM
caf0: 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28  em-1 */.    for(
cb00: 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b  n=1; n<=nMem; n+
cb10: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  +){.      p->aMe
cb20: 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  m[n].flags = MEM
cb30: 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20  _Undefined;.    
cb40: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20    p->aMem[n].db 
cb50: 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = db;.    }.  }.
cb60: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70    p->explain = p
cb70: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a  Parse->explain;.
cb80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77    sqlite3VdbeRew
cb90: 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ind(p);.}../*.**
cba0: 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
cbb0: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
cbc0: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
cbd0: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a  es that cursor .
cbe0: 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f  ** happens to ho
cbf0: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
cc00: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
cc10: 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
cc20: 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69  ursor *pCx){.  i
cc30: 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20  f( pCx==0 ){.   
cc40: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
cc50: 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
cc60: 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78  Close(p->db, pCx
cc70: 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42  );.  if( pCx->pB
cc80: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
cc90: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
cca0: 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  pBt);.    /* The
ccb0: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
ccc0: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
ccd0: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
cce0: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
ccf0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
cd00: 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  e. */.  }else if
cd10: 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29  ( pCx->pCursor )
cd20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
cd30: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
cd40: 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  x->pCursor);.  }
cd50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cd60: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
cd70: 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74  E.  if( pCx->pVt
cd80: 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  abCursor ){.    
cd90: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
cda0: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
cdb0: 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72   = pCx->pVtabCur
cdc0: 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  sor;.    const s
cdd0: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
cde0: 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 43 75  Module = pVtabCu
cdf0: 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f  rsor->pVtab->pMo
ce00: 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  dule;.    p->inV
ce10: 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
ce20: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
ce30: 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  se(pVtabCursor);
ce40: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
ce50: 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  thod = 0;.  }.#e
ce60: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ndif.}../*.** Co
ce70: 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  py the values st
ce80: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65  ored in the Vdbe
ce90: 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20  Frame structure 
cea0: 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69  to its Vdbe. Thi
ceb0: 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f  s.** is used, fo
cec0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
ced0: 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72  a trigger sub-pr
cee0: 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20  ogram is halted 
cef0: 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f  to restore.** co
cf00: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69  ntrol to the mai
cf10: 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e  n program..*/.in
cf20: 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  t sqlite3VdbeFra
cf30: 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72  meRestore(VdbeFr
cf40: 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20  ame *pFrame){.  
cf50: 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65  Vdbe *v = pFrame
cf60: 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65 46  ->v;.  v->aOnceF
cf70: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  lag = pFrame->aO
cf80: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f  nceFlag;.  v->nO
cf90: 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65  nceFlag = pFrame
cfa0: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76  ->nOnceFlag;.  v
cfb0: 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->aOp = pFrame->
cfc0: 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20  aOp;.  v->nOp = 
cfd0: 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76  pFrame->nOp;.  v
cfe0: 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->aMem = pFrame-
cff0: 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d  >aMem;.  v->nMem
d000: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b   = pFrame->nMem;
d010: 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46  .  v->apCsr = pF
d020: 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76  rame->apCsr;.  v
d030: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61  ->nCursor = pFra
d040: 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76  me->nCursor;.  v
d050: 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20  ->db->lastRowid 
d060: 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f  = pFrame->lastRo
d070: 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67  wid;.  v->nChang
d080: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61  e = pFrame->nCha
d090: 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  nge;.  return pF
d0a0: 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a  rame->pc;.}../*.
d0b0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
d0c0: 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  sors..**.** Also
d0d0: 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e   release any dyn
d0e0: 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64  amic memory held
d0f0: 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68   by the VM in th
d100: 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f  e Vdbe.aMem memo
d110: 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61  ry .** cell arra
d120: 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  y. This is neces
d130: 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f  sary as the memo
d140: 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61  ry cell array ma
d150: 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69  y contain.** poi
d160: 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61  nters to VdbeFra
d170: 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63  me objects, whic
d180: 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f  h may in turn co
d190: 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
d1a0: 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  o.** open cursor
d1b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
d1c0: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
d1d0: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  s(Vdbe *p){.  if
d1e0: 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
d1f0: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46     VdbeFrame *pF
d200: 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46  rame;.    for(pF
d210: 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
d220: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
d230: 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
d240: 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71  pParent);.    sq
d250: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
d260: 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
d270: 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d   }.  p->pFrame =
d280: 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20   0;.  p->nFrame 
d290: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61  = 0;..  if( p->a
d2a0: 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  pCsr ){.    int 
d2b0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
d2c0: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
d2d0: 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75  +){.      VdbeCu
d2e0: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
d2f0: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Csr[i];.      if
d300: 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pC ){.        
d310: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
d320: 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20  ursor(p, pC);.  
d330: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69        p->apCsr[i
d340: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
d350: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
d360: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  ->aMem ){.    re
d370: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70  leaseMemArray(&p
d380: 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d  ->aMem[1], p->nM
d390: 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  em);.  }.  while
d3a0: 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29  ( p->pDelFrame )
d3b0: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
d3c0: 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46  *pDel = p->pDelF
d3d0: 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65  rame;.    p->pDe
d3e0: 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70  lFrame = pDel->p
d3f0: 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
d400: 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
d410: 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20  te(pDel);.  }.. 
d420: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61   /* Delete any a
d430: 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f  uxdata allocatio
d440: 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 56  ns made by the V
d450: 4d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  M */.  sqlite3Vd
d460: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
d470: 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73  p, -1, 0);.  ass
d480: 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61  ert( p->pAuxData
d490: 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
d4a0: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
d4b0: 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 72  after a single r
d4c0: 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  un..*/.static vo
d4d0: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
d4e0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
d4f0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66  db = p->db;..#if
d500: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
d510: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73  .  /* Execute as
d520: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
d530: 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
d540: 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b   the Vdbe.apCsr[
d550: 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65  ] and .  ** Vdbe
d560: 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68  .aMem[] arrays h
d570: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
d580: 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f   cleaned up.  */
d590: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
d5a0: 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69  p->apCsr ) for(i
d5b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
d5c0: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
d5d0: 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
d5e0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
d5f0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  {.    for(i=1; i
d600: 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20  <=p->nMem; i++) 
d610: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
d620: 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e  i].flags==MEM_Un
d630: 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  defined );.  }.#
d640: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
d650: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
d660: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
d670: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
d680: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
d690: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
d6a0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
d6b0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
d6c0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
d6d0: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
d6e0: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
d6f0: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
d700: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
d710: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
d720: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
d730: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
d740: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
d750: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
d760: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
d770: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
d780: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
d790: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
d7a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
d7b0: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
d7c0: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
d7d0: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
d7e0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
d7f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
d800: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
d810: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
d820: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
d830: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
d840: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d850: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
d860: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
d870: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
d880: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
d890: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
d8a0: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
d8b0: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
d8c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
d8d0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  o(db, sizeof(Mem
d8e0: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
d8f0: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
d900: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
d910: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
d920: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
d930: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
d940: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
d950: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
d960: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
d970: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
d980: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
d990: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
d9a0: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
d9b0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
d9c0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
d9d0: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
d9e0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
d9f0: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
da00: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
da10: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
da20: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
da30: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
da40: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
da50: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
da60: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
da70: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
da80: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
da90: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
daa0: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
dab0: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
dac0: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
dad0: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
dae0: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
daf0: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
db00: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
db10: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
db20: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
db30: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
db60: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
db70: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
dba0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
dbb0: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
dbc0: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
dbf0: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
dc00: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
dc10: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
dc20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
dc30: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
dc40: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
dc50: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
dc60: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
dc70: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
dc80: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
dc90: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
dca0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
dcb0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
dcc0: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
dcd0: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
dce0: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
dcf0: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
dd00: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
dd10: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
dd20: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
dd30: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
dd40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
dd50: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
dd60: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
dd70: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
dd80: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
dd90: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
dda0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
ddb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
ddc0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
ddd0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
dde0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
ddf0: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
de00: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
de10: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
de20: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
de30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
de40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
de50: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
de60: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
de70: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
de80: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
de90: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
dea0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
deb0: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
dec0: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
ded0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
dee0: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
def0: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
df00: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
df10: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
df20: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
df30: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
df40: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
df50: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
df60: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
df70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
df80: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
df90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
dfa0: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
dfb0: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
dfc0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  action */.  int 
dfd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
dfe0: 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
dff0: 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  t = 0;..#ifdef S
e000: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
e010: 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74  ALTABLE.  /* Wit
e020: 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73  h this option, s
e030: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29  qlite3VtabSync()
e040: 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62   is defined to b
e050: 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53  e simply .  ** S
e060: 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73  QLITE_OK so p is
e070: 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f   not used. .  */
e080: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
e090: 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  TER(p);.#endif..
e0a0: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
e0b0: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
e0c0: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
e0d0: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
e0e0: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
e0f0: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
e100: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
e110: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
e120: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
e130: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
e140: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
e150: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e160: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
e170: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
e180: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
e190: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
e1a0: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
e1b0: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
e1c0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
e1d0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
e1e0: 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54  (db, p);..  /* T
e1f0: 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69  his loop determi
e200: 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63  nes (a) if the c
e210: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c  ommit hook shoul
e220: 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64  d be invoked and
e230: 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61  .  ** (b) how ma
e240: 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ny database file
e250: 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74  s have open writ
e260: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  e transactions, 
e270: 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  not .  ** includ
e280: 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74  ing the temp dat
e290: 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d  abase. (b) is im
e2a0: 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20  portant because 
e2b0: 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20  if more than .  
e2c0: 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  ** one database 
e2d0: 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e  file has an open
e2e0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
e2f0: 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  on, a master jou
e300: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e310: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
e320: 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e  n atomic commit.
e330: 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30  .  */ .  for(i=0
e340: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
e350: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
e360: 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a  +){ .    Btree *
e370: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
e380: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71  .pBt;.    if( sq
e390: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
e3a0: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
e3b0: 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
e3c0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d  1;.      if( i!=
e3d0: 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20  1 ) nTrans++;.  
e3e0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e3f0: 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Enter(pBt);.    
e400: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
e410: 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  gerExclusiveLock
e420: 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
e430: 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20  er(pBt));.      
e440: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
e450: 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
e460: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
e470: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
e480: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
e490: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
e4a0: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
e4b0: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
e4c0: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
e4d0: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
e4e0: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
e4f0: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
e500: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d   ){.    rc = db-
e510: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
e520: 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
e530: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
e540: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e550: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
e560: 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d  OMMITHOOK;.    }
e570: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
e580: 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
e590: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
e5a0: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
e5b0: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
e5c0: 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
e5d0: 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
e5e0: 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
e5f0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
e600: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
e610: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
e620: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
e630: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
e640: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
e650: 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
e660: 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
e670: 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
e680: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
e690: 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61  is :memory: or a
e6a0: 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20   temp file.  In 
e6b0: 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20  .  ** that case 
e6c0: 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
e6d0: 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
e6e0: 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
e6f0: 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69  use the .  ** si
e700: 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74  mple case then t
e710: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
e720: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
e730: 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  0(sqlite3BtreeGe
e740: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
e750: 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c  b[0].pBt)).   ||
e760: 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a   nTrans<=1.  ){.
e770: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
e780: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
e790: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
e7a0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
e7b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
e7c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
e7d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e7e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
e7f0: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
e800: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
e810: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
e820: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
e830: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
e840: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
e850: 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
e860: 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
e870: 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
e880: 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
e890: 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
e8a0: 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
e8b0: 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
e8c0: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
e8d0: 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
e8e0: 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
e8f0: 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
e900: 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
e910: 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
e920: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
e930: 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
e940: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
e950: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
e960: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
e970: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
e980: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e990: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e9a0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
e9b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e9c0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
e9d0: 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20  seTwo(pBt, 0);. 
e9e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e9f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ea00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
ea10: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
ea20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
ea30: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63  /* The complex c
ea40: 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61  ase - There is a
ea50: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74   multi-file writ
ea60: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
ea70: 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tive..  ** This 
ea80: 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65  requires a maste
ea90: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
eaa0: 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61  o ensure the tra
eab0: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
eac0: 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69   committed atomi
ead0: 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  cally..  */.#ifn
eae0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
eaf0: 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20  DISKIO.  else{. 
eb00: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
eb10: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
eb20: 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
eb30: 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  c = 0;.    char 
eb40: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
eb50: 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72  /* File-name for
eb60: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
eb70: 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  nal */.    char 
eb80: 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65  const *zMainFile
eb90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
eba0: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
ebb0: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
ebc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
ebd0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
ebe0: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
ebf0: 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
ec00: 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d  int retryCount =
ec10: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69   0;.    int nMai
ec20: 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  nFile;..    /* S
ec30: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
ec40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
ec50: 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c   */.    nMainFil
ec60: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
ec70: 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  n30(zMainFile);.
ec80: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71      zMaster = sq
ec90: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
eca0: 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58   "%s-mjXXXXXX9XX
ecb0: 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  z", zMainFile);.
ecc0: 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d      if( zMaster=
ecd0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
ece0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f  TE_NOMEM;.    do
ecf0: 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
ed00: 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  ndom;.      if( 
ed10: 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20  retryCount ){.  
ed20: 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
ed30: 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20  ount>100 ){.    
ed40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
ed50: 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
ed60: 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20  MJ delete: %s", 
ed70: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
ed80: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
ed90: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
eda0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
edb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
edc0: 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43  }else if( retryC
edd0: 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ount==1 ){.     
ede0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
edf0: 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
ee00: 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20  J collide: %s", 
ee10: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
ee20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ee30: 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a    retryCount++;.
ee40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61        sqlite3_ra
ee50: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
ee60: 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64  iRandom), &iRand
ee70: 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  om);.      sqlit
ee80: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20  e3_snprintf(13, 
ee90: 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69  &zMaster[nMainFi
eea0: 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30  le], "-mj%06X9%0
eeb0: 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2X",.           
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29      (iRandom>>8)
eee0: 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64  &0xffffff, iRand
eef0: 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20  om&0xff);.      
ef00: 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c  /* The antipenul
ef10: 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72  timate character
ef20: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
ef30: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
ef40: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22  .      ** be "9"
ef50: 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63   to avoid name c
ef60: 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75  ollisions when u
ef70: 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d  sing 8+3 filenam
ef80: 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  es. */.      ass
ef90: 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c  ert( zMaster[sql
efa0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
efb0: 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b  ster)-3]=='9' );
efc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69  .      sqlite3Fi
efd0: 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46  leSuffix3(zMainF
efe0: 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ile, zMaster);. 
eff0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f000: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
f010: 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
f020: 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
f030: 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  res);.    }while
f040: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f050: 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66  && res );.    if
f060: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f070: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ){.      /* Open
f080: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f090: 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  nal. */.      rc
f0a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
f0b0: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
f0c0: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
f0d0: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
f0e0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
f0f0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
f100: 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53  ATE|.          S
f110: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
f120: 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  SIVE|SQLITE_OPEN
f130: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c  _MASTER_JOURNAL,
f140: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
f150: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
f160: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f170: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f180: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
f190: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
f1a0: 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69    }. .    /* Wri
f1b0: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65  te the name of e
f1c0: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
f1d0: 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  e in the transac
f1e0: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65  tion into the ne
f1f0: 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  w.    ** master 
f200: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
f210: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
f220: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63   at this point c
f230: 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20  lose.    ** and 
f240: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
f250: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
f260: 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75  All the individu
f270: 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  al journal files
f280: 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61  .    ** still ha
f290: 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65  ve 'null' as the
f2a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f2b0: 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79  pointer, so they
f2c0: 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a   will roll.    *
f2d0: 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
f2e0: 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72  ntly if a failur
f2f0: 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f  e occurs..    */
f300: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f310: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
f320: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
f330: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f340: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
f350: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
f360: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
f370: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
f380: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
f390: 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
f3a0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
f3b0: 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  f( zFile==0 ){. 
f3c0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
f3d0: 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45  e;  /* Ignore TE
f3e0: 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20  MP and :memory: 
f3f0: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
f400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
f410: 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21  ssert( zFile[0]!
f420: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
f430: 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21  ( !needSync && !
f440: 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
f450: 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b  Disabled(pBt) ){
f460: 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
f470: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
f480: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
f490: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
f4a0: 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  Master, zFile, s
f4b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f4c0: 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
f4d0: 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
f4e0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
f4f0: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20  n30(zFile)+1;.  
f500: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
f510: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f520: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
f530: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
f540: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
f550: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
f560: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
f570: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f580: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
f590: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
f5a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
f5b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f5c0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
f5d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f5e0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
f5f0: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
f600: 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
f610: 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
f620: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
f630: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
f640: 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26  eedSync .     &&
f650: 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65   0==(sqlite3OsDe
f660: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
f670: 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c  ics(pMaster)&SQL
f680: 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
f690: 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51  TIAL).     && SQ
f6a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
f6b0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61  qlite3OsSync(pMa
f6c0: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e  ster, SQLITE_SYN
f6d0: 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29  C_NORMAL)).    )
f6e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
f6f0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
f700: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
f710: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
f720: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
f730: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f740: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
f750: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f760: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
f770: 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66  ync all the db f
f780: 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  iles involved in
f790: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f7a0: 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a  . The same call.
f7b0: 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20      ** sets the 
f7c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
f7d0: 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69  ointer in each i
f7e0: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
f7f0: 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20  l. If.    ** an 
f800: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72  error occurs her
f810: 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  e, do not delete
f820: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f830: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
f840: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65  .    ** If the e
f850: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
f860: 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ng the first cal
f870: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
f880: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
f890: 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74  aseOne(), then t
f8a0: 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65  here is a chance
f8b0: 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
f8c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f8d0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70  file will be orp
f8e0: 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61  haned. But we ca
f8f0: 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a  nnot delete it,.
f900: 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74      ** in case t
f910: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
f920: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20  l file name was 
f930: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
f940: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
f950: 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20  file before the 
f960: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
f970: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
f980: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
f990: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
f9a0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
f9b0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
f9c0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
f9d0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
f9e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f9f0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
fa00: 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65  eOne(pBt, zMaste
fa10: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
fa20: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
fa30: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
fa40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
fa50: 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
fa60: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
fa70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fa80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fa90: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
faa0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fab0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65    }..    /* Dele
fac0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
fad0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
fae0: 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61   commits the tra
faf0: 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a  nsaction. After.
fb00: 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69      ** doing thi
fb10: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
fb20: 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20  is synced again 
fb30: 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76  before any indiv
fb40: 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61  idual.    ** tra
fb50: 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61  nsaction files a
fb60: 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  re deleted..    
fb70: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
fb80: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
fb90: 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20  , zMaster, 1);. 
fba0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
fbb0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
fbc0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
fbd0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
fbe0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fbf0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c     }..    /* All
fc00: 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63   files and direc
fc10: 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65  tories have alre
fc20: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c  ady been synced,
fc30: 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   so the followin
fc40: 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  g.    ** calls t
fc50: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  o sqlite3BtreeCo
fc60: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
fc70: 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20  re only closing 
fc80: 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a  files and.    **
fc90: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
fca0: 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73  ncating journals
fcb0: 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  . If something g
fcc0: 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a  oes wrong while.
fcd0: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
fce0: 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27  appening we don'
fcf0: 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54  t really care. T
fd00: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20  he integrity of 
fd10: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
fd20: 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
fd30: 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75  y guaranteed, bu
fd40: 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f  t some stray 'co
fd50: 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20  ld' journals.   
fd60: 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67   ** may be lying
fd70: 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69   around. Returni
fd80: 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
fd90: 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74   won't help matt
fda0: 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ers..    */.    
fdb0: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
fdc0: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
fdd0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
fde0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
fdf0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
fe00: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
fe10: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
fe20: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
fe30: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
fe40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fe50: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
fe60: 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20  eTwo(pBt, 1);.  
fe70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
fe80: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
fe90: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e  Malloc();.    en
fea0: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
feb0: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
fec0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
fed0: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
fee0: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
fef0: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
ff00: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
ff10: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
ff20: 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e  nVdbeActive coun
ff30: 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  t variable.** ma
ff40: 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72  tches the number
ff50: 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68   of vdbe's in th
ff60: 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70  e list sqlite3.p
ff70: 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a  Vdbe that are.**
ff80: 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
ff90: 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  e. An assertion 
ffa0: 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f  fails if the two
ffb0: 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d   counts do not m
ffc0: 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73  atch..** This is
ffd0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c   an internal sel
ffe0: 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69  f-check only - i
fff0: 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65  t is not an esse
10000 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ntial processing
10010 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20  .** step..**.** 
10020 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
10030 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66  if NDEBUG is def
10040 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
10050 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76   NDEBUG.static v
10060 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56  oid checkActiveV
10070 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a  dbeCnt(sqlite3 *
10080 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
10090 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
100a0 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b   int nWrite = 0;
100b0 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30  .  int nRead = 0
100c0 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
100d0 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
100e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
100f0 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69  _stmt_busy((sqli
10100 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a  te3_stmt*)p) ){.
10110 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
10120 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e     if( p->readOn
10130 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b  ly==0 ) nWrite++
10140 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62  ;.      if( p->b
10150 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64  IsReader ) nRead
10160 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  ++;.    }.    p 
10170 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
10180 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64    assert( cnt==d
10190 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
101a0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69  ;.  assert( nWri
101b0 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  te==db->nVdbeWri
101c0 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
101d0 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65  nRead==db->nVdbe
101e0 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Read );.}.#else.
101f0 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74  #define checkAct
10200 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65  iveVdbeCnt(x).#e
10210 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
10220 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
10230 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
10240 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74  ment opened a st
10250 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
10260 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74  ion,.** close it
10270 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65   now. Argument e
10280 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  Op must be eithe
10290 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
102a0 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50  BACK or.** SAVEP
102b0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66  OINT_RELEASE. If
102c0 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
102d0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
102e0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
102f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10300 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20  rolled back. If 
10310 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54  eOp is SAVEPOINT
10320 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74  _RELEASE, then t
10330 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  he .** statement
10340 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10350 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
10360 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
10370 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54  occurs, an SQLIT
10380 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
10390 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
103a0 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
103b0 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
103c0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
103d0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64  loseStatement(Vd
103e0 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b  be *p, int eOp){
103f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73  .  sqlite3 *cons
10400 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  t db = p->db;.  
10410 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10420 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e  OK;..  /* If p->
10430 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72  iStatement is gr
10440 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
10450 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20   then this Vdbe 
10460 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73  opened a .  ** s
10470 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
10480 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64  tion that should
10490 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e   be closed here.
104a0 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74   The only except
104b0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74  ion.  ** is that
104c0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79   an IO error may
104d0 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20   have occurred, 
104e0 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67  causing an emerg
104f0 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20  ency rollback.. 
10500 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
10510 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74   (db->nStatement
10520 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20  ==0), and there 
10530 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  is nothing to do
10540 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
10550 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  >nStatement && p
10560 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  ->iStatement ){.
10570 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
10580 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f  onst int iSavepo
10590 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d  int = p->iStatem
105a0 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65  ent-1;..    asse
105b0 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  rt( eOp==SAVEPOI
105c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  NT_ROLLBACK || e
105d0 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  Op==SAVEPOINT_RE
105e0 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65  LEASE);.    asse
105f0 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  rt( db->nStateme
10600 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  nt>0 );.    asse
10610 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  rt( p->iStatemen
10620 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  t==(db->nStateme
10630 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  nt+db->nSavepoin
10640 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  t) );..    for(i
10650 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
10660 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
10670 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
10680 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
10690 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
106a0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
106b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
106c0 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
106d0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
106e0 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
106f0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
10700 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
10710 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
10720 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
10730 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
10740 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2==SQLITE_OK ){.
10750 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
10760 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
10770 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
10780 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
10790 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
107a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
107b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
107c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
107d0 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc2;.        }.
107e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
107f0 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
10800 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74  --;.    p->iStat
10810 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ement = 0;..    
10820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10830 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  K ){.      if( e
10840 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
10850 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
10860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
10870 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
10880 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10890 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
108a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
108b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
108c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
108d0 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
108e0 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
108f0 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
10900 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
10910 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
10920 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
10930 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10940 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
10950 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20  k, also restore 
10960 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
10970 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66  base handles def
10980 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
10990 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20   counter to the 
109a0 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65  value it had whe
109b0 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  n .    ** the st
109c0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
109d0 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
109e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d   */.    if( eOp=
109f0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
10a00 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  ACK ){.      db-
10a10 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
10a20 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73   p->nStmtDefCons
10a30 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66  ;.      db->nDef
10a40 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70  erredImmCons = p
10a50 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e  ->nStmtDefImmCon
10a60 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  s;.    }.  }.  r
10a70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10a80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
10a90 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
10aa0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  a transaction op
10ab0 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61  ened by the data
10ac0 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20  base .** handle 
10ad0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10ae0 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
10af0 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20   an argument is 
10b00 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20  about to be .** 
10b10 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68  committed. If th
10b20 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
10b30 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72  ing deferred for
10b40 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
10b50 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e  int.** violation
10b60 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
10b70 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73  _ERROR. Otherwis
10b80 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
10b90 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
10ba0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20   outstanding FK 
10bb0 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74  violations and t
10bc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
10bd0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
10be0 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72  ERROR, set the r
10bf0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20  esult of the VM 
10c00 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  to SQLITE_CONSTR
10c10 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a  AINT_FOREIGNKEY.
10c20 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20  ** and write an 
10c30 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
10c40 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e   it. Then return
10c50 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
10c60 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
10c70 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
10c80 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  Y.int sqlite3Vdb
10c90 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70  eCheckFk(Vdbe *p
10ca0 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b  , int deferred){
10cb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
10cc0 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64   p->db;.  if( (d
10cd0 65 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e  eferred && (db->
10ce0 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62  nDeferredCons+db
10cf0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
10d00 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21  ns)>0) .   || (!
10d10 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e  deferred && p->n
10d20 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20  FkConstraint>0) 
10d30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  .  ){.    p->rc 
10d40 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
10d50 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a  INT_FOREIGNKEY;.
10d60 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69      p->errorActi
10d70 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
10d80 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
10d90 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
10da0 20 64 62 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45   db, "FOREIGN KE
10db0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
10dc0 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
10dd0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
10de0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10df0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
10e00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10e10 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
10e20 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74  he when a VDBE t
10e30 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49  ries to halt.  I
10e40 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61  f the VDBE.** ha
10e50 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61  s made changes a
10e60 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  nd is in autocom
10e70 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63  mit mode, then c
10e80 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63  ommit those.** c
10e90 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f  hanges.  If a ro
10ea0 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64  llback is needed
10eb0 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f  , then do the ro
10ec0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
10ed0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
10ee0 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
10ef0 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
10f00 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c  a VM from.** SQL
10f10 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f  ITE_MAGIC_RUN to
10f20 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
10f30 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c  LT.  It is harml
10f40 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74  ess to.** call t
10f50 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74  his on a VM that
10f60 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54   is in the SQLIT
10f70 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61  E_MAGIC_HALT sta
10f80 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
10f90 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
10fa0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63   If the commit c
10fb0 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  ould not complet
10fc0 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20  e because of.** 
10fd0 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c  lock contention,
10fe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
10ff0 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  USY.  If SQLITE_
11000 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
11010 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
11020 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20  e close did not 
11030 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73  happen and needs
11040 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e   to be repeated.
11050 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11060 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29  dbeHalt(Vdbe *p)
11070 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11090 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73      /* Used to s
110a0 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72  tore transient r
110b0 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20  eturn codes */. 
110c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
110d0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  ->db;..  /* This
110e0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
110f0 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
11100 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
11110 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
11120 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
11130 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
11140 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
11150 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
11160 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
11170 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
11180 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
11190 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66  *.  ** If any of
111a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
111b0 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a  rrors occur:.  *
111c0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  *.  **     SQLIT
111d0 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20  E_NOMEM.  **    
111e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20   SQLITE_IOERR.  
111f0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55  **     SQLITE_FU
11200 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  LL.  **     SQLI
11210 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a  TE_INTERRUPT.  *
11220 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
11230 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d  internal cache m
11240 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c  ight have been l
11250 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
11260 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74  istent.  ** stat
11270 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  e.  We need to r
11280 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74  ollback the stat
11290 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
112a0 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  n, if there is. 
112b0 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20   ** one, or the 
112c0 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63  complete transac
112d0 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73  tion if there is
112e0 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
112f0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
11300 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
11310 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
11320 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
11330 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
11340 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29  ( p->aOnceFlag )
11350 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65   memset(p->aOnce
11360 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63  Flag, 0, p->nOnc
11370 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41  eFlag);.  closeA
11380 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
11390 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
113a0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
113b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
113c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63  E_OK;.  }.  chec
113d0 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
113e0 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
113f0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
11400 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
11410 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
11420 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20  ted or if the.  
11430 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
11440 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f   does not read o
11450 72 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61  r write a databa
11460 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69  se file.  */.  i
11470 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70  f( p->pc>=0 && p
11480 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20  ->bIsReader ){. 
11490 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
114a0 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
114b0 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
114c0 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  /.    int eState
114d0 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20  mentOp = 0;.    
114e0 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72  int isSpecialErr
114f0 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  or;            /
11500 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
11510 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72   a 'special' err
11520 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f  or */..    /* Lo
11530 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73  ck all btrees us
11540 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d  ed by the statem
11550 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ent */.    sqlit
11560 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a  e3VdbeEnter(p);.
11570 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
11580 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
11590 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
115a0 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
115b0 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
115c0 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
115d0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
115e0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
115f0 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
11600 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
11610 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
11620 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
11630 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
11640 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
11650 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
11660 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
11670 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f  nly and the erro
11680 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
11690 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20  _INTERRUPT, .   
116a0 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63     ** no rollbac
116b0 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
116c0 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65  Otherwise, at le
116d0 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ast a savepoint 
116e0 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
116f0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
11700 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
11710 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
11720 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a  e to a .      **
11730 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
11740 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
11750 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
11760 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
11770 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69  ad-only, it is i
11780 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66  mportant to perf
11790 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  orm.      ** a s
117a0 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
117b0 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
117c0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74   operation. If t
117d0 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20  he error .      
117e0 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  ** occurred whil
117f0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
11800 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f   journal, sub-jo
11810 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73  urnal or databas
11820 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  e.      ** file 
11830 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66  as part of an ef
11840 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20  fort to free up 
11850 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65  cache space (see
11860 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
11870 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29  ** pagerStress()
11880 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68   in pager.c), th
11890 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65  e rollback is re
118a0 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72  quired to restor
118b0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e .      ** the 
118c0 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69  pager to a consi
118d0 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
118e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
118f0 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
11900 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
11910 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
11920 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
11930 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
11940 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
11950 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
11960 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
11970 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
11980 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
11990 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
119a0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
119b0 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
119c0 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
119d0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
119e0 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
119f0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
11a00 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
11a10 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
11a20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
11a30 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
11a40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
11a50 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
11a60 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
11a70 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
11a80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
11a90 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
11aa0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
11ab0 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
11ac0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
11ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
11ae0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
11af0 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
11b00 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
11b10 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  s. */.    if( p-
11b20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
11b30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
11b40 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
11b50 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
11b60 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
11b70 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
11b80 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
11b90 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69   only active wri
11ba0 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20  ter .    ** VM, 
11bb0 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65  then we do eithe
11bc0 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
11bd0 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
11be0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
11bf0 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
11c00 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
11c10 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
11c20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
11c30 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
11c40 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
11c50 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20  has occurred. . 
11c60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73     */.    if( !s
11c70 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63  qlite3VtabInSync
11c80 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62  (db) .     && db
11c90 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20  ->autoCommit .  
11ca0 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57     && db->nVdbeW
11cb0 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  rite==(p->readOn
11cc0 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
11cd0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
11ce0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
11cf0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
11d00 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
11d10 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
11d20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11d30 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
11d40 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
11d50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11d60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
11d70 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  EVER(p->readOnly
11d80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
11d90 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
11da0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
11db0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11dc0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
11dd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
11de0 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
11df0 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a  INT_FOREIGNKEY;.
11e00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
11e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11e20 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
11e30 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
11e40 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
11e50 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
11e60 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
11e70 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
11e80 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
11e90 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
11ea0 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
11eb0 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
11ec0 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
11ed0 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
11ee0 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
11ef0 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
11f00 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
11f10 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
11f20 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
11f30 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
11f40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
11f50 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
11f60 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
11f70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11f80 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
11f90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
11fa0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
11fb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
11fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11fd0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
11fe0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
11ff0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
12000 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
12010 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12020 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
12030 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
12040 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
12050 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
12060 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
12070 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
12080 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20  LITE_DeferFKs;. 
12090 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
120a0 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
120b0 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
120c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
120d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
120e0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
120f0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20   SQLITE_OK);.   
12100 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e     }.      db->n
12110 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
12120 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
12130 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a  atementOp==0 ){.
12140 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
12150 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
12160 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
12170 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
12180 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
12190 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
121a0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
121b0 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
121c0 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
121d0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
121e0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
121f0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
12200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
12210 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
12220 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
12230 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
12240 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
12250 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
12260 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
12270 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
12280 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
12290 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
122a0 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
122b0 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
122c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
122d0 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
122e0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
122f0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
12300 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
12310 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
12320 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
12330 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
12340 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
12350 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
12360 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
12370 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
12380 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
12390 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
123a0 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
123b0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
123c0 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
123d0 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
123e0 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
123f0 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
12400 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
12410 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
12420 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
12430 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12440 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
12450 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
12460 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->rc&0xff)==SQLI
12470 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
12480 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
12490 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
124a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
124b0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
124c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72            p->zEr
124d0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
124e0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
124f0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
12500 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
12510 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
12520 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
12530 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
12540 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
12550 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
12560 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
12570 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
12580 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
12590 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e   or DELETE and n
125a0 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
125b0 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  saction.    ** h
125c0 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  as been rolled b
125d0 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20  ack, update the 
125e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
125f0 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ion change-count
12600 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
12610 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
12620 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
12630 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41  eStatementOp!=SA
12640 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12650 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12660 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
12670 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
12680 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12690 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
126a0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
126b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
126c0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
126d0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
126e0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
126f0 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
12700 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
12710 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76    }..  /* We hav
12720 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68  e successfully h
12730 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  alted and closed
12740 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64   the VM.  Record
12750 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
12760 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
12770 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63  .    db->nVdbeAc
12780 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tive--;.    if( 
12790 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64  !p->readOnly ) d
127a0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b  b->nVdbeWrite--;
127b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52  .    if( p->bIsR
127c0 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62  eader ) db->nVdb
127d0 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73  eRead--;.    ass
127e0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
127f0 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52  tive>=db->nVdbeR
12800 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ead );.    asser
12810 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  t( db->nVdbeRead
12820 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  >=db->nVdbeWrite
12830 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12840 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d  db->nVdbeWrite>=
12850 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  0 );.  }.  p->ma
12860 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
12870 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63  _HALT;.  checkAc
12880 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
12890 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
128a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
128b0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
128c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
128d0 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
128e0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
128f0 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61   to true, then a
12900 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65  ny locks that we
12910 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20  re held.  ** by 
12920 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61  connection db ha
12930 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65  ve now been rele
12940 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74  ased. Call sqlit
12950 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
12960 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20  cked() .  ** to 
12970 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69  invoke any requi
12980 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  red unlock-notif
12990 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
129a0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  /.  if( db->auto
129b0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  Commit ){.    sq
129c0 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
129d0 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d  nlocked(db);.  }
129e0 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
129f0 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c  nVdbeActive>0 ||
12a00 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
12a10 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65  =0 || db->nState
12a20 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ment==0 );.  ret
12a30 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
12a40 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45  TE_BUSY ? SQLITE
12a50 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f  _BUSY : SQLITE_O
12a60 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  K);.}.../*.** Ea
12a70 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
12a80 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
12a90 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
12aa0 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
12ab0 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
12ac0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
12ad0 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
12ae0 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
12af0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
12b00 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
12b10 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
12b20 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
12b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
12b40 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
12b50 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
12b60 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
12b70 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20   VDBE passed.** 
12b80 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
12b90 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74  ument to its dat
12ba0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f  abase handle (so
12bb0 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20   that they will 
12bc0 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  be .** returned 
12bd0 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  by calls to sqli
12be0 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e  te3_errcode() an
12bf0 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  d sqlite3_errmsg
12c00 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ())..**.** This 
12c10 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
12c20 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45  t clear the VDBE
12c30 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d   error code or m
12c40 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20  essage, just.** 
12c50 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74  copies them to t
12c60 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
12c70 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
12c80 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
12c90 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ror(Vdbe *p){.  
12ca0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
12cb0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
12cc0 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e  p->rc;.  if( p->
12cd0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75  zErrMsg ){.    u
12ce0 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  8 mallocFailed =
12cf0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12d00 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  d;.    sqlite3Be
12d10 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
12d20 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70  );.    if( db->p
12d30 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72  Err==0 ) db->pEr
12d40 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  r = sqlite3Value
12d50 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  New(db);.    sql
12d60 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
12d70 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d  db->pErr, -1, p-
12d80 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45  >zErrMsg, SQLITE
12d90 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52  _UTF8, SQLITE_TR
12da0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
12db0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
12dc0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e  lloc();.    db->
12dd0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d  mallocFailed = m
12de0 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
12df0 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72   db->errCode = r
12e00 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
12e10 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
12e20 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   rc);.  }.  retu
12e30 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
12e40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
12e50 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61  QLLOG./*.** If a
12e60 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
12e70 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72  SQLLOG hook is r
12e80 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68  egistered and th
12e90 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75  e VM has been ru
12ea0 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74  n, .** invoke it
12eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12ec0 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
12ed0 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66  g(Vdbe *v){.  if
12ee0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
12ef0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26  onfig.xSqllog &&
12f00 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   v->rc==SQLITE_O
12f10 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20  K && v->zSql && 
12f20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  v->pc>=0 ){.    
12f30 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20  char *zExpanded 
12f40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
12f50 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71  andSql(v, v->zSq
12f60 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
12f70 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  v->db->init.busy
12f80 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ==0 );.    if( z
12f90 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20  Expanded ){.    
12fa0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
12fb0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20  onfig.xSqllog(. 
12fc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12fd0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
12fe0 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20  llogArg, v->db, 
12ff0 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20  zExpanded, 1.   
13000 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
13010 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
13020 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20   zExpanded);.   
13030 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
13040 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f   define vdbeInvo
13050 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64  keSqllog(x).#end
13060 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  if../*.** Clean 
13070 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
13080 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
13090 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
130a0 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
130b0 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
130c0 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
130d0 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
130e0 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
130f0 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
13100 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13110 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
13120 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
13130 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
13140 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
13150 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
13160 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
13170 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
13180 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
13190 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
131a0 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
131b0 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
131c0 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
131d0 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
131e0 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
131f0 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
13200 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
13210 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
13220 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
13230 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
13240 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
13250 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
13260 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
13270 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
13280 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
13290 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
132a0 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
132b0 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  w..  */.  sqlite
132c0 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20  3VdbeHalt(p);.. 
132d0 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
132e0 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20  has be run even 
132f0 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20  partially, then 
13300 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72  transfer the err
13310 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  or code.  ** and
13320 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
13330 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74  rom the VDBE int
13340 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
13350 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ase structure.  
13360 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  But.  ** if the 
13370 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65  VDBE has just be
13380 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75  en set to run bu
13390 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  t has not actual
133a0 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a  ly executed any.
133b0 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
133c0 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65  s yet, leave the
133d0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
133e0 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
133f0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
13400 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
13410 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b  ){.    vdbeInvok
13420 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20  eSqllog(p);.    
13430 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
13440 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20  ferError(p);.   
13450 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13460 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
13470 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
13480 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   0;.    if( p->r
13490 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e  unOnlyOnce ) p->
134a0 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
134b0 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
134c0 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
134d0 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
134e0 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
134f0 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
13500 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
13510 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
13520 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
13530 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
13540 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
13550 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
13560 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
13570 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
13580 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
13590 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
135a0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
135b0 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e  g(db, p->rc, p->
135c0 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
135d0 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b   0, p->zErrMsg);
135e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
135f0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
13600 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
13610 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  sg = 0;.  }..  /
13620 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
13630 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65  mory used by the
13640 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65   VDBE.  */.  Cle
13650 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53  anup(p);..  /* S
13660 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
13670 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
13680 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
13690 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  */.#ifdef VDBE_P
136a0 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46  ROFILE.  {.    F
136b0 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e  ILE *out = fopen
136c0 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f  ("vdbe_profile.o
136d0 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69  ut", "a");.    i
136e0 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  f( out ){.      
136f0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72  int i;.      fpr
13700 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20  intf(out, "---- 
13710 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
13720 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
13730 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
13740 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20  tf(out, "%02x", 
13750 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
13760 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13770 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
13780 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n");.      if( p
13790 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  ->zSql ){.      
137a0 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30    char c, pc = 0
137b0 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
137c0 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20  f(out, "-- ");. 
137d0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
137e0 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29  (c = p->zSql[i])
137f0 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
13800 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e       if( pc=='\n
13810 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ' ) fprintf(out,
13820 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20   "-- ");.       
13830 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b     putc(c, out);
13840 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
13850 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13860 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e       if( pc!='\n
13870 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ' ) fprintf(out,
13880 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a   "\n");.      }.
13890 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
138a0 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
138b0 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72         char zHdr
138c0 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73  [100];.        s
138d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
138e0 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48  sizeof(zHdr), zH
138f0 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20  dr, "%6u %12llu 
13900 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20  %8llu ",.       
13910 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
13920 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
13930 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
13940 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
13950 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
13960 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
13970 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
13980 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
13990 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
139a0 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20  "%s", zHdr);.   
139b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
139c0 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20  PrintOp(out, i, 
139d0 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
139e0 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73     }.      fclos
139f0 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(out);.    }.  
13a00 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43  }.#endif.  p->iC
13a10 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a  urrentTime = 0;.
13a20 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
13a30 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20  E_MAGIC_INIT;.  
13a40 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
13a50 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
13a60 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
13a70 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
13a80 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
13a90 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
13aa0 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
13ab0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
13ac0 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
13ad0 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
13ae0 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
13af0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
13b00 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
13b10 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
13b20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
13b30 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
13b40 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
13b50 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
13b60 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
13b70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
13b80 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
13b90 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
13ba0 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
13bb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
13bc0 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
13bd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13be0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
13bf0 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e  iOp is less than
13c00 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f   zero, then invo
13c10 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
13c20 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78  r for.** all aux
13c30 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
13c40 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63  ters currently c
13c50 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20  ached by the VM 
13c60 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65  passed as.** the
13c70 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
13c80 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f  .**.** Or, if iO
13c90 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
13ca0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
13cb0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73  ro, then the des
13cc0 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e  tructor is.** on
13cd0 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74  ly invoked for t
13ce0 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64  hose auxiliary d
13cf0 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65  ata pointers cre
13d00 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ated by the user
13d10 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e   .** function in
13d20 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f  voked by the OP_
13d30 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  Function opcode 
13d40 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  at instruction i
13d50 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64  Op of .** VM pVd
13d60 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  be, and only the
13d70 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  n if:.**.**    *
13d80 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
13d90 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
13da0 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f  er is the 32nd o
13db0 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e  r later (countin
13dc0 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c  g.**      from l
13dd0 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f  eft to right), o
13de0 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  r.**.**    * the
13df0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
13e00 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d  it in argument m
13e10 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68  ask is clear (wh
13e20 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ere the first.**
13e30 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70        function p
13e40 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70  arameter corresp
13e50 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
13e60 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
13e70 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
13e80 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62  xData(Vdbe *pVdb
13e90 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  e, int iOp, int 
13ea0 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61  mask){.  AuxData
13eb0 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e   **pp = &pVdbe->
13ec0 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c  pAuxData;.  whil
13ed0 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75  e( *pp ){.    Au
13ee0 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70  xData *pAux = *p
13ef0 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c  p;.    if( (iOp<
13f00 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78  0).     || (pAux
13f10 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70  ->iOp==iOp && (p
13f20 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20  Aux->iArg>31 || 
13f30 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54  !(mask & MASKBIT
13f40 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29  32(pAux->iArg)))
13f50 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ).    ){.      t
13f60 65 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69  estcase( pAux->i
13f70 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Arg==31 );.     
13f80 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
13f90 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
13fa0 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
13fb0 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
13fc0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75  .      *pp = pAu
13fd0 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
13fe0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56  sqlite3DbFree(pV
13ff0 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a  dbe->db, pAux);.
14000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14010 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78   pp= &pAux->pNex
14020 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
14030 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
14040 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
14050 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
14060 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
14070 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
14080 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65   except for obje
14090 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68  ct itself, which
140a0 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a   is preserved..*
140b0 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
140c0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
140d0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71   function and sq
140e0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
140f0 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62  ) is that.** Vdb
14100 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75  eDelete() also u
14110 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20  nlinks the Vdbe 
14120 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
14130 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20   VMs associated 
14140 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  with.** the data
14150 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14160 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62  and frees the ob
14170 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  ject itself..*/.
14180 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
14190 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69  ClearObject(sqli
141a0 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
141b0 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  ){.  SubProgram 
141c0 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pSub, *pNext;. 
141d0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
141e0 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d  ( p->db==0 || p-
141f0 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c  >db==db );.  rel
14200 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
14210 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
14220 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
14230 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
14240 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
14250 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70  NAME_N);.  for(p
14260 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b  Sub=p->pProgram;
14270 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78   pSub; pSub=pNex
14280 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
14290 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSub->pNext;.   
142a0 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
142b0 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20  (db, pSub->aOp, 
142c0 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  pSub->nOp);.    
142d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
142e0 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66  , pSub);.  }.  f
142f0 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b  or(i=p->nzVar-1;
14300 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69   i>=0; i--) sqli
14310 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14320 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64  >azVar[i]);.  vd
14330 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
14340 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  , p->aOp, p->nOp
14350 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
14360 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
14370 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
14380 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
14390 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
143a0 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29  ee(db, p->pFree)
143b0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
143c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
143d0 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69  _EXPLAIN).  sqli
143e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
143f0 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71  >zExplain);.  sq
14400 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14410 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65  p->pExplain);.#e
14420 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
14430 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
14440 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
14450 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
14460 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
14470 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e  e3 *db;..  if( N
14480 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
14490 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  urn;.  db = p->d
144a0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
144b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
144c0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
144d0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
144e0 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20  Object(db, p);. 
144f0 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
14500 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
14510 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
14520 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14530 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d  sert( db->pVdbe=
14540 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56  =p );.    db->pV
14550 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
14560 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
14570 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
14580 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
14590 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  Prev;.  }.  p->m
145a0 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
145b0 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20  C_DEAD;.  p->db 
145c0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
145d0 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
145e0 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  /*.** The cursor
145f0 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69   "p" has a pendi
14600 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ng seek operatio
14610 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  n that has not y
14620 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69  et been.** carri
14630 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68  ed out.  Seek th
14640 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49  e cursor now.  I
14650 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14660 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  s, return.** the
14670 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
14680 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
14690 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
146a0 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66  INLINE handleDef
146b0 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65  erredMoveto(Vdbe
146c0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
146d0 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
146e0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
146f0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
14700 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
14710 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
14720 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
14730 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eto );.  assert(
14740 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
14750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
14760 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
14770 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
14780 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
14790 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
147a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
147b0 0a 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20  .  p->lastRowid 
147c0 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  = p->movetoTarge
147d0 74 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20  t;.  if( res!=0 
147e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
147f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
14800 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  p->rowidIsValid 
14810 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
14820 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
14830 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
14840 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65  ;.#endif.  p->de
14850 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
14860 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
14870 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
14880 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14890 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
148a0 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76  omething has mov
148b0 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75  ed cursor "p" ou
148c0 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79  t of place.  May
148d0 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77 61  be the row it wa
148e0 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20  s.** pointed to 
148f0 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
14900 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20  from under it.  
14910 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74 72  Or maybe the btr
14920 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61  ee was.** rebala
14930 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72 20  nced.  Whatever 
14940 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20 74  the cause, try t
14950 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f  o restore "p" to
14960 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a   the place it.**
14970 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
14980 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66  be pointing.  If
14990 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c   the row was del
149a0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
149b0 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  der the.** curso
149c0 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  r, set the curso
149d0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  r to point to a 
149e0 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  NULL row..*/.sta
149f0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
14a00 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f  OINLINE handleMo
14a10 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43 75  vedCursor(VdbeCu
14a20 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
14a30 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20  isDifferentRow, 
14a40 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rc;.  assert( p-
14a50 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
14a60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14a70 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
14a80 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20  ved(p->pCursor) 
14a90 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
14aa0 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
14ab0 6f 72 65 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ore(p->pCursor, 
14ac0 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 29  &isDifferentRow)
14ad0 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
14ae0 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
14af0 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65 72  ;.  if( isDiffer
14b00 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c  entRow ) p->null
14b10 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Row = 1;.  retur
14b20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
14b30 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
14b40 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74  sor p is ready t
14b50 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
14b60 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68  the row to which
14b70 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
14b80 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74  positioned.  Ret
14b90 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
14ba0 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  e if an OOM faul
14bb0 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a  t or I/O error.*
14bc0 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  * prevents us fr
14bd0 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74  om positioning t
14be0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73  he cursor to its
14bf0 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f   correct positio
14c00 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f  n..**.** If a Mo
14c10 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69  veTo operation i
14c20 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  s pending on the
14c30 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74   given cursor, t
14c40 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d  hen do that.** M
14c50 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e  oveTo now.  If n
14c60 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e  o move is pendin
14c70 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  g, check to see 
14c80 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62  if the row has b
14c90 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f  een.** deleted o
14ca0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
14cb0 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20  e cursor and if 
14cc0 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65  it has, mark the
14cd0 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c   row as.** a NUL
14ce0 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  L row..**.** If 
14cf0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
14d00 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
14d10 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f  o the correct ro
14d20 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68  w and that row h
14d30 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64  as.** not been d
14d40 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
14d50 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
14d60 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
14d70 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
14d80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
14d90 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56  beCursorMoveto(V
14da0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
14db0 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64   if( p->deferred
14dc0 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 72 65  Moveto ){.    re
14dd0 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72  turn handleDefer
14de0 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20  redMoveto(p);.  
14df0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42  }.  if( sqlite3B
14e00 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
14e10 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  ed(p->pCursor) )
14e20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  {.    return han
14e30 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70  dleMovedCursor(p
14e40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14e50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14e60 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
14e70 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
14e80 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
14e90 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71  rialType().** sq
14ea0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
14eb0 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ypeLen().** sqli
14ec0 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
14ed0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
14ee0 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20  eSerialPut().** 
14ef0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14f00 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  lGet().**.** enc
14f10 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
14f20 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
14f30 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
14f40 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
14f50 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
14f60 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
14f70 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
14f80 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
14f90 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
14fa0 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
14fb0 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
14fc0 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
14fd0 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
14fe0 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
14ff0 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
15000 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
15010 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
15020 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
15030 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
15040 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
15050 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
15060 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
15070 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
15080 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
15090 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
150a0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
150b0 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
150c0 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
150d0 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
150e0 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
150f0 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
15100 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
15110 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
15120 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
15130 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e  blob separately.
15140 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
15150 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
15160 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
15170 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
15180 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
15190 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
151a0 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
151b0 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
151c0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
151d0 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
151e0 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
151f0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
15200 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
15210 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
15220 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
15230 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
15240 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
15250 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
15260 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
15290 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
152a0 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
152b0 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
152c0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
152d0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
15300 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
15310 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
15330 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
15340 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
15350 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
15360 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
15370 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
15380 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
153b0 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
153c0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
153d0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
153e0 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
153f0 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
15400 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
15410 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
15420 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
15430 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
15440 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
15470 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
15480 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
15490 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
154a0 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
154b0 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
154c0 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
154d0 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
154e0 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
154f0 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
15500 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
15510 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
15520 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
15530 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
15540 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
15550 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
15560 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
15570 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
15580 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
15590 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
155a0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
155b0 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
155c0 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
155d0 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
155e0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
155f0 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c  u32 n;..  if( fl
15600 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
15610 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15620 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
15630 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
15640 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
15650 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
15660 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
15670 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
15680 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
15690 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
156a0 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
156b0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
156c0 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69  u64 u;.    if( i
156d0 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
156e0 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29  i<(-MAX_6BYTE) )
156f0 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20   return 6;.     
15700 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73   /* Previous tes
15710 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d  t prevents:  u =
15720 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35   -(-922337203685
15730 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20  4775808) */.    
15740 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65    u = -i;.    }e
15750 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
15760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15770 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
15780 72 65 74 75 72 6e 20 28 28 69 26 31 29 3d 3d 69  return ((i&1)==i
15790 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e   && file_format>
157a0 3d 34 29 20 3f 20 38 2b 28 75 33 32 29 75 20 3a  =4) ? 8+(u32)u :
157b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
157c0 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74  ( u<=32767 ) ret
157d0 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75  urn 2;.    if( u
157e0 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75  <=8388607 ) retu
157f0 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 3;.    if( u<
15800 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65  =2147483647 ) re
15810 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20  turn 4;.    if( 
15820 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72  u<=MAX_6BYTE ) r
15830 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74  eturn 5;.    ret
15840 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
15850 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
15860 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  ){.    return 7;
15870 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
15880 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  Mem->db->mallocF
15890 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28  ailed || flags&(
158a0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
158b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
158c0 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e  Mem->n>=0 );.  n
158d0 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b   = (u32)pMem->n;
158e0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
158f0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
15900 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
15910 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
15920 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
15930 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
15940 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  0));.}../*.** Re
15950 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
15960 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
15970 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
15980 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
15990 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
159a0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
159b0 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
159c0 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
159d0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
159e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
159f0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
15a00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
15a10 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
15a20 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20  ize[] = { 0, 1, 
15a30 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38  2, 3, 4, 6, 8, 8
15a40 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
15a50 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65      return aSize
15a60 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
15a70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   }.}../*.** If w
15a80 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
15a90 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
15aa0 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
15ab0 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
15ac0 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
15ad0 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
15ae0 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
15af0 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
15b00 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
15b10 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
15b20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
15b30 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
15b40 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
15b50 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
15b60 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
15b70 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
15b80 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
15b90 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
15ba0 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
15bb0 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
15bc0 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
15bd0 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
15be0 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
15bf0 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
15c00 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
15c10 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
15c20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
15c30 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
15c40 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
15c50 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
15c60 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
15c70 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
15c80 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
15c90 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
15ca0 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
15cb0 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
15cc0 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
15cd0 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
15ce0 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
15cf0 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
15d00 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
15d10 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
15d20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
15d30 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
15d40 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
15d50 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
15d60 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
15d70 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
15d80 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
15d90 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
15da0 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
15db0 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
15dc0 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
15dd0 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
15de0 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
15df0 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
15e00 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
15e10 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
15e20 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33  **.** (2007-08-3
15e30 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75  0)  Frank van Vu
15e40 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74  gt has studied t
15e50 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73  his problem clos
15e60 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73  ely.** and has s
15e70 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73  end his findings
15e80 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
15e90 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e  evelopers.  Fran
15ea0 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74  k.** writes that
15eb0 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e   some Linux kern
15ec0 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69  els offer floati
15ed0 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72  ng point hardwar
15ee0 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74  e.** emulation t
15ef0 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32  hat uses only 32
15f00 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69  -bit mantissas i
15f10 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  nstead of a full
15f20 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20   .** 48-bits as 
15f30 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
15f40 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20  IEEE standard.  
15f50 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20  (This is the.** 
15f60 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46  CONFIG_FPE_FASTF
15f70 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20  PE option.)  On 
15f80 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c  such systems, fl
15f90 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
15fa0 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65  byte swapping be
15fb0 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c  comes very compl
15fc0 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69  icated.  To avoi
15fd0 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74  d problems,.** t
15fe0 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74  he necessary byt
15ff0 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61  e swapping is ca
16000 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20  rried out using 
16010 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
16020 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
16030 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20  a 64-bit float. 
16040 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75   Frank assures u
16050 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  s that the code 
16060 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f  here.** works fo
16070 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20  r him.  We, the 
16080 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65  developers, have
16090 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70   no way to indep
160a0 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69  endently.** veri
160b0 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61  fy this, but Fra
160c0 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77  nk seems to know
160d0 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b   what he is talk
160e0 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20  ing about.** so 
160f0 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f  we trust him..*/
16100 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
16110 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
16120 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75  T_FLOAT.static u
16130 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34  64 floatSwap(u64
16140 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
16150 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75      u64 r;.    u
16160 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a  32 i[2];.  } u;.
16170 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20    u32 t;..  u.r 
16180 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b  = in;.  t = u.i[
16190 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75  0];.  u.i[0] = u
161a0 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20  .i[1];.  u.i[1] 
161b0 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e  = t;.  return u.
161c0 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77  r;.}.# define sw
161d0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
161e0 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74  at(X)  X = float
161f0 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20  Swap(X).#else.# 
16200 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
16210 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23  EndianFloat(X).#
16220 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
16230 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
16240 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
16250 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
16260 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
16270 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
16280 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
16290 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
162a0 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
162b0 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
162c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
162d0 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  es written..**.*
162e0 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d  * nBuf is the am
162f0 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65  ount of space le
16300 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68  ft in buf[].  Th
16310 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
16320 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61  onsible.** for a
16330 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68  llocating enough
16340 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20   space to buf[] 
16350 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
16360 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73  re field, exclus
16370 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d  ive.** of the pM
16380 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65  em->u.nZero byte
16390 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f  s for a MEM_Zero
163a0 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   value..**.** Re
163b0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
163c0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
163d0 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
163e0 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
163f0 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
16400 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
16410 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
16420 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
16430 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
16440 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
16450 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
16460 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  ]..*/ .u32 sqlit
16470 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
16480 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d  u8 *buf, Mem *pM
16490 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74  em, u32 serial_t
164a0 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b  ype){.  u32 len;
164b0 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61  ..  /* Integer a
164c0 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
164d0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
164e0 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30  && serial_type>0
164f0 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20   ){.    u64 v;. 
16500 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66     u32 i;.    if
16510 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
16520 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
16530 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a  ( sizeof(v)==siz
16540 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29  eof(pMem->u.r) )
16550 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
16560 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73  v, &pMem->u.r, s
16570 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
16580 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
16590 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
165a0 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
165b0 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
165c0 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
165d0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
165e0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
165f0 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe);.    assert(
16600 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a   i>0 );.    do{.
16610 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d        buf[--i] =
16620 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
16630 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
16640 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20    }while( i );. 
16650 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
16660 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
16670 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
16680 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
16690 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
166a0 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
166b0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
166c0 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72  ro)?pMem->u.nZer
166d0 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  o:0).           
166e0 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65    == (int)sqlite
166f0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
16700 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
16710 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65  );.    len = pMe
16720 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  m->n;.    memcpy
16730 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
16740 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  en);.    return 
16750 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  len;.  }..  /* N
16760 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73  ULL or constants
16770 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74   0 or 1 */.  ret
16780 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70  urn 0;.}../* Inp
16790 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75  ut "x" is a sequ
167a0 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64  ence of unsigned
167b0 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74   characters that
167c0 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20   represent a.** 
167d0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
167e0 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
167f0 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76  equivalent nativ
16800 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65  e integer.*/.#de
16810 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  fine ONE_BYTE_IN
16820 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29  T(x)    ((i8)(x)
16830 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f  [0]).#define TWO
16840 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20  _BYTE_INT(x)    
16850 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  (256*(i8)((x)[0]
16860 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e  )|(x)[1]).#defin
16870 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  e THREE_BYTE_INT
16880 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29  (x)  (65536*(i8)
16890 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d  ((x)[0])|((x)[1]
168a0 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65  <<8)|(x)[2]).#de
168b0 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55  fine FOUR_BYTE_U
168c0 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28  INT(x)  (((u32)(
168d0 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b  x)[0]<<24)|((x)[
168e0 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
168f0 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66  <8)|(x)[3]).#def
16900 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e  ine FOUR_BYTE_IN
16910 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28  T(x) (16777216*(
16920 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29  i8)((x)[0])|((x)
16930 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
16940 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a  <<8)|(x)[3])../*
16950 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
16960 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
16970 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
16980 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
16990 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
169a0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
169b0 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
169c0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
169d0 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a  f bytes read..**
169e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
169f0 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
16a00 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65   as two separate
16a10 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65   routines for pe
16a20 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
16a30 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74  e few cases that
16a40 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76   require local v
16a50 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f  ariables are bro
16a60 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73  ken out into a s
16a70 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69  eparate.** routi
16a80 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f  ne so that in mo
16a90 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65  st cases the ove
16aa0 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20  rhead of moving 
16ab0 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65  the stack pointe
16ac0 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e  r.** is avoided.
16ad0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20  .*/ .static u32 
16ae0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
16af0 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  serialGet(.  con
16b00 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
16b10 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
16b20 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
16b30 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
16b40 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
16b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16b60 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
16b70 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
16b80 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
16b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16ba0 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
16bb0 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
16bc0 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20  */.){.  u64 x = 
16bd0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
16be0 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46  uf);.  u32 y = F
16bf0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
16c00 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c  f+4);.  x = (x<<
16c10 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73  32) + y;.  if( s
16c20 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
16c30 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
16c40 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
16c50 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
16c60 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63  M_Int;.    testc
16c70 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
16c80 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66   );.  }else{.#if
16c90 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
16ca0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
16cb0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
16cc0 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a  NG_POINT).    /*
16cd0 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
16ce0 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
16cf0 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
16d00 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
16d10 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
16d20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
16d30 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
16d40 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
16d50 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
16d60 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
16d70 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
16d80 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
16d90 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e  d.    ** endian.
16da0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
16db0 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20  ic const u64 t1 
16dc0 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30  = ((u64)0x3ff000
16dd0 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61  00)<<32;.    sta
16de0 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65  tic const double
16df0 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75   r1 = 1.0;.    u
16e00 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20  64 t2 = t1;.    
16e10 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
16e20 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73  loat(t2);.    as
16e30 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
16e40 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
16e50 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
16e60 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
16e70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  );.#endif.    as
16e80 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
16e90 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
16ea0 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20  m->u.r)==8 );.  
16eb0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
16ec0 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d  nFloat(x);.    m
16ed0 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72  emcpy(&pMem->u.r
16ee0 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
16ef0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
16f00 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
16f10 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45  (pMem->u.r) ? ME
16f20 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61  M_Null : MEM_Rea
16f30 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  l;.  }.  return 
16f40 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  8;.}.u32 sqlite3
16f50 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
16f60 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
16f70 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
16f80 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
16f90 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
16fa0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
16fb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16fc0 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
16fd0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
16fe0 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17000 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
17010 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
17020 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
17030 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
17040 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
17050 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
17060 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
17070 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
17080 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
17090 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
170a0 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
170b0 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ULL */.      pMe
170c0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
170d0 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
170e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
170f0 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
17100 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
17110 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
17120 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  i = ONE_BYTE_INT
17130 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
17140 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
17150 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
17160 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
17170 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17180 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
17190 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
171a0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
171b0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
171c0 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e  .i = TWO_BYTE_IN
171d0 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
171e0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
171f0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
17200 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
17210 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
17220 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
17230 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
17240 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
17250 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
17260 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45  u.i = THREE_BYTE
17270 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
17280 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
17290 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
172a0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
172b0 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
172c0 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
172d0 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
172e0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
172f0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
17300 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
17310 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
17320 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
17330 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
17340 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
17350 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
17360 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20  eturn 4;.    }. 
17370 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
17380 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
17390 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
173a0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f  Mem->u.i = FOUR_
173b0 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29  BYTE_UINT(buf+2)
173c0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
173d0 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  )*TWO_BYTE_INT(b
173e0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
173f0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
17400 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
17410 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
17420 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
17430 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17440 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
17450 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
17460 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
17470 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
17480 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  point */.      /
17490 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61  * These use loca
174a0 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20  l variables, so 
174b0 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70  do them in a sep
174c0 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20  arate routine.  
174d0 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
174e0 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74  having to move t
174f0 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72  he frame pointer
17500 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
17510 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ase */.      ret
17520 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75  urn serialGet(bu
17530 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d  f,serial_type,pM
17540 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  em);.    }.    c
17550 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74  ase 8:    /* Int
17560 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61  eger 0 */.    ca
17570 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65  se 9: {  /* Inte
17580 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70  ger 1 */.      p
17590 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
175a0 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
175b0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
175c0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
175d0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
175e0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
175f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
17600 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d  16 aFlag[] = { M
17610 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65  EM_Blob|MEM_Ephe
17620 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45  m, MEM_Str|MEM_E
17630 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d  phem };.      pM
17640 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
17650 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
17660 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  >n = (serial_typ
17670 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
17680 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c  Mem->flags = aFl
17690 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31  ag[serial_type&1
176a0 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ];.      return 
176b0 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20  pMem->n;.    }. 
176c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
176d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
176e0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61  ine is used to a
176f0 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65  llocate sufficie
17700 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20  nt space for an 
17710 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
17720 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67  * structure larg
17730 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75  e enough to be u
17740 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
17750 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
17760 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72  () if.** the fir
17770 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
17780 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49   pointer to KeyI
17790 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b  nfo structure pK
177a0 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  eyInfo..**.** Th
177b0 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65  e space is eithe
177c0 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  r allocated usin
177d0 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  g sqlite3DbMallo
177e0 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77  cRaw() or from w
177f0 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61  ithin.** the una
17800 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61  ligned buffer pa
17810 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63  ssed via the sec
17820 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72  ond and third ar
17830 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61  guments (presuma
17840 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61  bly.** stack spa
17850 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d  ce). If the form
17860 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65  er, then *ppFree
17870 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69   is set to a poi
17880 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  nter that should
17890 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  .** be eventuall
178a0 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  y freed by the c
178b0 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
178c0 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c  te3DbFree(). Or,
178d0 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   if the .** allo
178e0 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f  cation comes fro
178f0 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53  m the pSpace/szS
17900 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70  pace buffer, *pp
17910 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Free is set to N
17920 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  ULL.** before re
17930 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
17940 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
17950 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
17960 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61  eturned..*/.Unpa
17970 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
17980 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
17990 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65  ckedRecord(.  Ke
179a0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
179c0 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
179d0 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
179e0 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20  char *pSpace,   
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61  /* Unaligned spa
17a10 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ce available */.
17a20 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20    int szSpace,  
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a40 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
17a50 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
17a60 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65  /.  char **ppFre
17a70 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
17a80 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c      /* OUT: Call
17a90 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74  er should free t
17aa0 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29  his pointer */.)
17ab0 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  {.  UnpackedReco
17ac0 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  rd *p;          
17ad0 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
17ae0 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e  record to return
17af0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20   */.  int nOff; 
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
17b20 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66  nt pSpace by nOf
17b30 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f  f to align it */
17b40 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17b70 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
17b80 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57  or *p */..  /* W
17b90 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20  e want to shift 
17ba0 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61  the pointer pSpa
17bb0 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20  ce up such that 
17bc0 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69  it is 8-byte ali
17bd0 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c  gned..  ** Thus,
17be0 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63   we need to calc
17bf0 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e  ulate a value, n
17c00 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61  Off, between 0 a
17c10 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a  nd 7, to shift .
17c20 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20    ** it by.  If 
17c30 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64  pSpace is alread
17c40 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  y 8-byte aligned
17c50 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65  , nOff should be
17c60 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f   zero..  */.  nO
17c70 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54  ff = (8 - (SQLIT
17c80 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70  E_PTR_TO_INT(pSp
17c90 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a  ace) & 7)) & 7;.
17ca0 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
17cb0 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
17cc0 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
17cd0 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
17ce0 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69  ->nField+1);.  i
17cf0 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65  f( nByte>szSpace
17d00 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d  +nOff ){.    p =
17d10 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
17d20 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
17d30 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
17d40 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
17d50 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20  *ppFree = (char 
17d60 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20  *)p;.    if( !p 
17d70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65  ) return 0;.  }e
17d80 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  lse{.    p = (Un
17d90 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70  packedRecord*)&p
17da0 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20  Space[nOff];.   
17db0 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20   *ppFree = 0;.  
17dc0 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28  }..  p->aMem = (
17dd0 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29  Mem*)&((char*)p)
17de0 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55  [ROUND8(sizeof(U
17df0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d  npackedRecord))]
17e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
17e10 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
17e20 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79  !=0 );.  p->pKey
17e30 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
17e40 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
17e50 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
17e60 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
17e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
17e80 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
17e90 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
17ea0 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
17eb0 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
17ec0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
17ed0 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
17ee0 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
17ef0 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
17f00 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
17f10 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
17f20 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
17f30 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
17f40 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
17f50 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
17f60 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
17f70 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
17f80 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
17f90 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
17fa0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
17fb0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
17fc0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
17fd0 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
17fe0 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
17ff0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
18000 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
18010 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
18020 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
18030 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
18040 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
18050 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
18060 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
18070 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74  ar *)pKey;.  int
18080 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
180b0 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
180c0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
180d0 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
180f0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
18100 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
18110 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
18120 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
18130 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20  p->default_rc = 
18140 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  0;.  assert( EIG
18150 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
18160 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
18170 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
18180 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
18190 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
181a0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
181b0 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79  szHdr && d<=nKey
181c0 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
181d0 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
181e0 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
181f0 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
18200 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
18210 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
18220 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
18230 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
18240 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
18250 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
18260 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
18270 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
18280 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
18290 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  .    pMem->szMal
182a0 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65  loc = 0;.    pMe
182b0 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20  m->z = 0;.    d 
182c0 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
182d0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d  rialGet(&aKey[d]
182e0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70  , serial_type, p
182f0 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  Mem);.    pMem++
18300 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e  ;.    if( (++u)>
18310 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65  =p->nField ) bre
18320 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ak;.  }.  assert
18330 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
18340 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70  Field + 1 );.  p
18350 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a  ->nField = u;.}.
18360 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
18370 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
18380 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
18390 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  wo index or tabl
183a0 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e  e record keys in
183b0 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a   the same way.**
183c0 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56   as the sqlite3V
183d0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
183e0 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69  () routine. Unli
183f0 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  ke VdbeRecordCom
18400 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20  pare(),.** this 
18410 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
18420 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72  lizes and compar
18430 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20  es values using 
18440 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  the.** sqlite3Vd
18450 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e  beSerialGet() an
18460 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  d sqlite3MemComp
18470 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  are() functions.
18480 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69   It is used.** i
18490 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
184a0 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20  ments to ensure 
184b0 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
184c0 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71  ed code in.** sq
184d0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
184e0 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73  ompare() returns
184f0 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68   results with th
18500 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76  ese two primitiv
18510 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
18520 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73   true if the res
18530 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
18540 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  n is equivalent 
18550 74 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  to desiredResult
18560 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
18570 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  e if there is a 
18580 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f  disagreement..*/
18590 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
185a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
185b0 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ug(.  int nKey1,
185c0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
185d0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
185e0 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63  */.  const Unpac
185f0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
18600 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20  2, /* Right key 
18610 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64  */.  int desired
18620 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
18630 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e     /* Correct an
18640 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  swer */.){.  u32
18650 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
18660 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
18670 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
18680 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
18690 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
186a0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
186b0 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
186c0 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
186d0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
186e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
186f0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
18700 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
18710 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
18720 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
18730 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
18740 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
18750 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
18760 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18770 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  nfo;.  Mem mem1;
18780 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ..  pKeyInfo = p
18790 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
187a0 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  .  if( pKeyInfo-
187b0 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  >db==0 ) return 
187c0 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20  1;.  mem1.enc = 
187d0 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
187e0 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
187f0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65  nfo->db;.  /* me
18800 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f  m1.flags = 0;  /
18810 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  / Will be initia
18820 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lized by sqlite3
18830 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
18840 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  */.  VVA_ONLY( m
18850 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
18860 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
18870 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
18880 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20  tatements */..  
18890 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79  /* Compilers may
188a0 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d   complain that m
188b0 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e  em1.u.i is poten
188c0 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c  tially uninitial
188d0 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f  ized..  ** We co
188e0 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  uld initialize i
188f0 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65  t, as shown here
18900 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f  , to silence tho
18910 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20  se complaints.. 
18920 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c   ** But in fact,
18930 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e   mem1.u.i will n
18940 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65  ever actually be
18950 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69   used uninitiali
18960 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a  zed, and doing .
18970 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73    ** the unneces
18980 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  sary initializat
18990 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72  ion has a measur
189a0 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65  able negative pe
189b0 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69  rformance.  ** i
189c0 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69  mpact, since thi
189d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
189e0 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e  ery high runner.
189f0 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f    And so, we cho
18a00 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f  ose.  ** to igno
18a10 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  re the compiler 
18a20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61  warnings and lea
18a30 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ve this variable
18a40 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
18a50 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e    */.  /*  mem1.
18a60 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74  u.i = 0;  // not
18a70 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f   needed, here to
18a80 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65   silence compile
18a90 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a  r warning */.  .
18aa0 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
18ab0 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
18ac0 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
18ad0 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  r1;.  assert( pK
18ae0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
18af0 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
18b00 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  >=pPKey2->nField
18b10 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
18b20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
18b30 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
18b40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
18b50 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
18b60 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
18b70 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c   idx1<=szHdr1 ||
18b80 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
18b90 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72   do{.    u32 ser
18ba0 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20  ial_type1;..    
18bb0 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
18bc0 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
18bd0 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
18be0 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
18bf0 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72    idx1 += getVar
18c00 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78  int32( aKey1+idx
18c10 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20  1, serial_type1 
18c20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
18c30 79 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  y that there is 
18c40 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65  enough key space
18c50 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76   remaining to av
18c60 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66  oid.    ** a buf
18c70 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54  fer overread.  T
18c80 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79  he "d1+serial_ty
18c90 70 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73  pe1+2" subexpres
18ca0 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  sion will.    **
18cb0 20 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74   always be great
18cc0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
18cd0 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   to the amount o
18ce0 66 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73  f required key s
18cf0 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65  pace..    ** Use
18d00 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74   that approximat
18d10 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65  ion to avoid the
18d20 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20   more expensive 
18d30 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
18d40 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18d50 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65  TypeLen() in the
18d60 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
18d70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b    */.    if( d1+
18d80 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28  serial_type1+2>(
18d90 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26  u32)nKey1.     &
18da0 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65  & d1+sqlite3Vdbe
18db0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
18dc0 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32  rial_type1)>(u32
18dd0 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20  )nKey1 .    ){. 
18de0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18df0 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
18e00 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
18e10 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
18e20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
18e30 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
18e40 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
18e50 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
18e60 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
18e70 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
18e80 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
18e90 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
18ea0 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
18eb0 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e  >aMem[i], pKeyIn
18ec0 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20  fo->aColl[i]);. 
18ed0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
18ee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
18ef0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
18f00 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
18f10 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
18f20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
18f30 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
18f40 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
18f50 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65  ;  /* Invert the
18f60 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43   result for DESC
18f70 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a   sort order. */.
18f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
18f90 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45  to debugCompareE
18fa0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  nd;.    }.    i+
18fb0 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  +;.  }while( idx
18fc0 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  1<szHdr1 && i<pP
18fd0 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a  Key2->nField );.
18fe0 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
18ff0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
19000 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
19010 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
19020 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
19030 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
19040 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
19050 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
19060 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
19070 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
19080 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
19090 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
190a0 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20  (&mem1)..  */.  
190b0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
190c0 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
190d0 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
190e0 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
190f0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
19100 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
19110 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
19120 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
19130 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
19140 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
19150 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
19160 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65    */.  rc = pPKe
19170 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
19180 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64  .debugCompareEnd
19190 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  :.  if( desiredR
191a0 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d  esult==0 && rc==
191b0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
191c0 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
191d0 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65  t<0 && rc<0 ) re
191e0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
191f0 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26  siredResult>0 &&
19200 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31   rc>0 ) return 1
19210 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ;.  if( CORRUPT_
19220 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  DB ) return 1;. 
19230 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
19240 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19250 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
19260 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
19270 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d  ../*.** Both *pM
19280 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63  em1 and *pMem2 c
19290 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61  ontain string va
192a0 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68  lues. Compare th
192b0 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
192c0 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
192d0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ion sequence pCo
192e0 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65  ll. As usual, re
192f0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
19300 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
19310 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a  itive value if *
19320 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
19330 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
19340 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
19350 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74   *pMem2, respect
19360 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69  ively. Similar i
19370 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20  n spirit to "rc 
19380 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70  = (*pMem1) - (*p
19390 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74  Mem2);"..*/.stat
193a0 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61  ic int vdbeCompa
193b0 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63  reMemString(.  c
193c0 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
193d0 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
193e0 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  em2,.  const Col
193f0 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75  lSeq *pColl,.  u
19400 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20  8 *prcErr       
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19420 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  * If an OOM occu
19430 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54  rs, set to SQLIT
19440 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20  E_NOMEM */.){.  
19450 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  if( pMem1->enc==
19460 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
19470 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73    /* The strings
19480 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
19490 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f  the correct enco
194a0 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a  ding.  Call the.
194b0 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
194c0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65  on function dire
194d0 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  ctly */.    retu
194e0 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70  rn pColl->xCmp(p
194f0 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d  Coll->pUser,pMem
19500 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d  1->n,pMem1->z,pM
19510 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29  em2->n,pMem2->z)
19520 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19530 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74  nt rc;.    const
19540 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a   void *v1, *v2;.
19550 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a      int n1, n2;.
19560 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20      Mem c1;.    
19570 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69  Mem c2;.    sqli
19580 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
19590 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c1, pMem1->db, M
195a0 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
195b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
195c0 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c  (&c2, pMem1->db,
195d0 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
195e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
195f0 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70  allowCopy(&c1, p
19600 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem1, MEM_Ephem)
19610 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19620 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
19630 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f  &c2, pMem2, MEM_
19640 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d  Ephem);.    v1 =
19650 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
19660 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
19670 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c1, pColl->en
19680 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d  c);.    n1 = v1=
19690 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20  =0 ? 0 : c1.n;. 
196a0 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56     v2 = sqlite3V
196b0 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
196c0 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43  3_value*)&c2, pC
196d0 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e  oll->enc);.    n
196e0 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20  2 = v2==0 ? 0 : 
196f0 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70  c2.n;.    rc = p
19700 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
19710 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c  ->pUser, n1, v1,
19720 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73 71   n2, v2);.    sq
19730 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
19740 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71  ase(&c1);.    sq
19750 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
19760 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 69 66  ase(&c2);.    if
19770 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d  ( (v1==0 || v2==
19780 30 29 20 26 26 20 70 72 63 45 72 72 20 29 20 2a  0) && prcErr ) *
19790 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f  prcErr = SQLITE_
197a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72  NOMEM;.    retur
197b0 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  n rc;.  }.}../*.
197c0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62  ** Compare two b
197d0 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  lobs.  Return ne
197e0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
197f0 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
19800 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73   first.** is les
19810 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
19820 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
19830 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65  n the second, re
19840 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49  spectively..** I
19850 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20  f one blob is a 
19860 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74  prefix of the ot
19870 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68  her, then the sh
19880 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73  orter is the les
19890 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  sor..*/.static S
198a0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
198b0 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  nt sqlite3BlobCo
198c0 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
198d0 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  *pB1, const Mem 
198e0 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 20 3d  *pB2){.  int c =
198f0 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20   memcmp(pB1->z, 
19900 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70  pB2->z, pB1->n>p
19910 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a  B2->n ? pB2->n :
19920 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20   pB1->n);.  if( 
19930 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20  c ) return c;.  
19940 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d 20  return pB1->n - 
19950 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pB2->n;.}.../*.*
19960 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61  * Compare the va
19970 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62  lues contained b
19980 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79  y the two memory
19990 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e   cells, returnin
199a0 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a  g.** negative, z
199b0 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ero or positive 
199c0 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  if pMem1 is less
199d0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
199e0 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74   or greater.** t
199f0 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69  han pMem2. Sorti
19a00 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c  ng order is NULL
19a10 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77  's first, follow
19a20 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69  ed by numbers (i
19a30 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72  ntegers.** and r
19a40 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d  eals) sorted num
19a50 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77  erically, follow
19a60 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72  ed by text order
19a70 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74  ed by the collat
19a80 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
19a90 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c  pColl and finall
19aa0 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64  y blob's ordered
19ab0 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a   by memcmp()..**
19ac0 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c  .** Two NULL val
19ad0 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
19ae0 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73  ed equal by this
19af0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
19b00 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  t sqlite3MemComp
19b10 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
19b20 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  Mem1, const Mem 
19b30 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f  *pMem2, const Co
19b40 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
19b50 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69   int f1, f2;.  i
19b60 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  nt combined_flag
19b70 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31  s;..  f1 = pMem1
19b80 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20  ->flags;.  f2 = 
19b90 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20  pMem2->flags;.  
19ba0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d  combined_flags =
19bb0 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74   f1|f2;.  assert
19bc0 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  ( (combined_flag
19bd0 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d  s & MEM_RowSet)=
19be0 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20  =0 );. .  /* If 
19bf0 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c  one value is NUL
19c00 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  L, it is less th
19c10 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66  an the other. If
19c20 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a   both values.  *
19c30 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75  * are NULL, retu
19c40 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rn 0..  */.  if(
19c50 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
19c60 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
19c70 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e  return (f2&MEM_N
19c80 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e  ull) - (f1&MEM_N
19c90 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ull);.  }..  /* 
19ca0 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
19cb0 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  a number and the
19cc0 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20 74   other is not, t
19cd0 68 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  he number is les
19ce0 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20  s..  ** If both 
19cf0 61 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d  are numbers, com
19d00 70 61 72 65 20 61 73 20 72 65 61 6c 73 20 69 66  pare as reals if
19d10 20 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c 20   one is a real, 
19d20 6f 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a 20  or as integers. 
19d30 20 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c 75   ** if both valu
19d40 65 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e  es are integers.
19d50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
19d60 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f  ined_flags&(MEM_
19d70 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b  Int|MEM_Real) ){
19d80 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20  .    double r1, 
19d90 72 32 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20  r2;.    if( (f1 
19da0 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21  & f2 & MEM_Int)!
19db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
19dc0 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65  pMem1->u.i < pMe
19dd0 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
19de0 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
19df0 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d  Mem1->u.i > pMem
19e00 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
19e10 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
19e20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
19e30 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f1&MEM_Real)!=
19e40 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 ){.      r1 = 
19e50 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a 20 20 20 20  pMem1->u.r;.    
19e60 7d 65 6c 73 65 20 69 66 28 20 28 66 31 26 4d 45  }else if( (f1&ME
19e70 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
19e80 20 20 20 72 31 20 3d 20 28 64 6f 75 62 6c 65 29     r1 = (double)
19e90 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20 20  pMem1->u.i;.    
19ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
19eb0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
19ec0 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61   if( (f2&MEM_Rea
19ed0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  l)!=0 ){.      r
19ee0 32 20 3d 20 70 4d 65 6d 32 2d 3e 75 2e 72 3b 0a  2 = pMem2->u.r;.
19ef0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
19f00 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  2&MEM_Int)!=0 ){
19f10 0a 20 20 20 20 20 20 72 32 20 3d 20 28 64 6f 75  .      r2 = (dou
19f20 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b 0a  ble)pMem2->u.i;.
19f30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19f40 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
19f50 7d 0a 20 20 20 20 69 66 28 20 72 31 3c 72 32 20  }.    if( r1<r2 
19f60 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
19f70 20 69 66 28 20 72 31 3e 72 32 20 29 20 72 65 74   if( r1>r2 ) ret
19f80 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72  urn 1;.    retur
19f90 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
19fa0 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
19fb0 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
19fc0 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c  other is a blob,
19fd0 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c   the string is l
19fe0 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74  ess..  ** If bot
19ff0 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63  h are strings, c
1a000 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65  ompare using the
1a010 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
1a020 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1a030 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1a040 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
1a050 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72  f( (f1 & MEM_Str
1a060 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1a070 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1a080 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f    if( (f2 & MEM_
1a090 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1a0a0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1a0b0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1a0c0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32  Mem1->enc==pMem2
1a0d0 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  ->enc );.    ass
1a0e0 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1a0f0 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  =SQLITE_UTF8 || 
1a100 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65  .            pMe
1a110 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1a120 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31  UTF16LE || pMem1
1a130 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1a140 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  F16BE );..    /*
1a150 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
1a160 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20  equence must be 
1a170 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20  defined at this 
1a180 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20  point, even if. 
1a190 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64     ** the user d
1a1a0 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61  eletes the colla
1a1b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66  tion sequence af
1a1c0 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f  ter the vdbe pro
1a1d0 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63  gram is.    ** c
1a1e0 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61  ompiled (this wa
1a1f0 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65  s not always the
1a200 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   case)..    */. 
1a210 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c     assert( !pCol
1a220 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l || pColl->xCmp
1a230 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f   );..    if( pCo
1a240 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
1a250 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65  rn vdbeCompareMe
1a260 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70  mString(pMem1, p
1a270 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b  Mem2, pColl, 0);
1a280 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66  .    }.    /* If
1a290 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
1a2a0 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68  was passed as th
1a2b0 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69  e collate functi
1a2c0 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  on, fall through
1a2d0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62  .    ** to the b
1a2e0 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65  lob case and use
1a2f0 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20   memcmp().  */. 
1a300 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76   }. .  /* Both v
1a310 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c  alues must be bl
1a320 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73  obs.  Compare us
1a330 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  ing memcmp().  *
1a340 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
1a350 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d  e3BlobCompare(pM
1a360 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a  em1, pMem2);.}..
1a370 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
1a380 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1a390 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1a3a0 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79  n is a serial-ty
1a3b0 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65  pe that.** corre
1a3c0 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74  sponds to an int
1a3d0 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65  eger - all value
1a3e0 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
1a3f0 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20  9 inclusive .** 
1a400 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65  except 7. The se
1a410 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61  cond points to a
1a420 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1a430 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ng an integer va
1a440 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65  lue.** serialize
1a450 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73  d according to s
1a460 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73  erial_type. This
1a470 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
1a480 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65  alizes.** and re
1a490 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e  turns the value.
1a4a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76  .*/.static i64 v
1a4b0 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
1a4c0 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  nt(u32 serial_ty
1a4d0 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  pe, const u8 *aK
1a4e0 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20  ey){.  u32 y;.  
1a4f0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1a500 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  DB || (serial_ty
1a510 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f  pe>=1 && serial_
1a520 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61  type<=9 && seria
1a530 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20  l_type!=7) );.  
1a540 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
1a550 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
1a560 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20  0:.    case 1:. 
1a570 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1a580 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1a590 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f       return ONE_
1a5a0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1a5b0 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20      case 2:.    
1a5c0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1a5d0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1a5e0 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54    return TWO_BYT
1a5f0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1a600 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74   case 3:.      t
1a610 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1a620 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1a630 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45  eturn THREE_BYTE
1a640 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1a650 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20  case 4: {.      
1a660 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1a670 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1a680 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1a690 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1a6a0 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e  return (i64)*(in
1a6b0 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20  t*)&y;.    }.   
1a6c0 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20   case 5: {.     
1a6d0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1a6e0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1a6f0 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54   return FOUR_BYT
1a700 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1a710 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1a720 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1a730 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  y);.    }.    ca
1a740 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36  se 6: {.      u6
1a750 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
1a760 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1a770 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1a780 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1a790 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1a7a0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1a7b0 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65  Key+4);.      re
1a7c0 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a  turn (i64)*(i64*
1a7d0 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  )&x;.    }.  }..
1a7e0 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
1a7f0 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f  _type - 8);.}../
1a800 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a810 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  on compares the 
1a820 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f  two table rows o
1a830 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  r index records.
1a840 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
1a850 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
1a860 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72  nd pPKey2.  It r
1a870 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76  eturns a negativ
1a880 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
1a890 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
1a8a0 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  f key1 is less t
1a8b0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1a8c0 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
1a8d0 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b  n key2.  The {nK
1a8e0 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20  ey1, pKey1} key 
1a8f0 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a  must be a blob.*
1a900 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
1a910 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1a920 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
1a930 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
1a940 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
1a950 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
1a960 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
1a970 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
1a980 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
1a990 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53  * If argument bS
1a9a0 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
1a9b0 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1a9c0 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
1a9d0 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65  as already.** de
1a9e0 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1a9f0 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1aa00 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  f the keys are e
1aa10 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31  qual..**.** Key1
1aa20 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74   and Key2 do not
1aa30 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e   have to contain
1aa40 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1aa50 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61   of fields. If a
1aa60 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68  ll .** fields th
1aa70 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74  at appear in bot
1aa80 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  h keys are equal
1aa90 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64  , then pPKey2->d
1aaa0 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a  efault_rc is .**
1aab0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1aac0 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   If database cor
1aad0 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f  ruption is disco
1aae0 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79  vered, set pPKey
1aaf0 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a  2->errCode to .*
1ab00 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
1ab10 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49   and return 0. I
1ab20 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
1ab30 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a  s encountered, .
1ab40 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  ** pPKey2->errCo
1ab50 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  de is set to SQL
1ab60 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69  ITE_NOMEM and, i
1ab70 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
1ab80 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d  , the.** malloc-
1ab90 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20  failed flag set 
1aba0 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
1abb0 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79  le (pPKey2->pKey
1abc0 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 73 74  Info->db)..*/.st
1abd0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1abe0 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1abf0 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ip(.  int nKey1,
1ac00 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1ac10 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1ac20 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1ac30 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20  ecord *pPKey2,  
1ac40 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1ac50 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b  key */.  int bSk
1ac60 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ip              
1ac70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1ac80 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69  rue, skip the fi
1ac90 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  rst field */.){.
1aca0 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acc0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1acd0 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1ace0 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1acf0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad10 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
1ad20 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70  xt field to comp
1ad30 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  are */.  u32 szH
1ad40 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
1ad50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1ad60 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65   of record heade
1ad70 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
1ad80 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ada0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
1adb0 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65  st type in heade
1adc0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
1add0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ade0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1adf0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20   value */.  Mem 
1ae00 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e  *pRhs = pPKey2->
1ae10 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e  aMem;       /* N
1ae20 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  ext field of pPK
1ae30 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  ey2 to compare *
1ae40 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1ae50 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
1ae60 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73  pKeyInfo;.  cons
1ae70 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1ae80 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1ae90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1aea0 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d  pKey1;.  Mem mem
1aeb0 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69  1;..  /* If bSki
1aec0 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  p is true, then 
1aed0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1aee0 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65  lready determine
1aef0 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1af00 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e  .  ** two elemen
1af10 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61  ts in the keys a
1af20 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68  re equal. Fix th
1af30 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20  e various stack 
1af40 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a  variables so.  *
1af50 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  * that this rout
1af60 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61  ine begins compa
1af70 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f  ring at the seco
1af80 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69  nd field. */.  i
1af90 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( bSkip ){.    
1afa0 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31  u32 s1;.    idx1
1afb0 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74   = 1 + getVarint
1afc0 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31  32(&aKey1[1], s1
1afd0 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20  );.    szHdr1 = 
1afe0 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31  aKey1[0];.    d1
1aff0 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69   = szHdr1 + sqli
1b000 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1b010 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20  eLen(s1);.    i 
1b020 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  = 1;.    pRhs++;
1b030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
1b040 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
1b050 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
1b060 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1b070 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e  ;.    if( d1>(un
1b080 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20  signed)nKey1 ){ 
1b090 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
1b0a0 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1b0b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1b0c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1b0d0 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e  ;  /* Corruption
1b0e0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20   */.    }.    i 
1b0f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f  = 0;.  }..  VVA_
1b100 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1b110 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1b120 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1b130 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b140 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1b150 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1b160 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70  nField+pPKey2->p
1b170 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1b180 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  >=pPKey2->nField
1b190 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52   .       || CORR
1b1a0 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
1b1b0 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1b1c0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1b1d0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1b1e0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1b1f0 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20  o->nField>0 );. 
1b200 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
1b210 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
1b220 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
1b230 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1b240 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  ;..    /* RHS is
1b250 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20   an integer */. 
1b260 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61     if( pRhs->fla
1b270 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
1b280 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1b290 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1b2a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b2b0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1b2c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1b2d0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
1b2e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1b2f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1b300 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
1b310 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b320 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1b330 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1b340 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==7 ){.        d
1b350 6f 75 62 6c 65 20 72 68 73 20 3d 20 28 64 6f 75  ouble rhs = (dou
1b360 62 6c 65 29 70 52 68 73 2d 3e 75 2e 69 3b 0a 20  ble)pRhs->u.i;. 
1b370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1b380 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1b390 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1b3a0 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  ype, &mem1);.   
1b3b0 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e       if( mem1.u.
1b3c0 72 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  r<rhs ){.       
1b3d0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1b3e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65      }else if( me
1b3f0 6d 31 2e 75 2e 72 3e 72 68 73 20 29 7b 0a 20 20  m1.u.r>rhs ){.  
1b400 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1b410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b430 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65  i64 lhs = vdbeRe
1b440 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65  cordDecodeInt(se
1b450 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79  rial_type, &aKey
1b460 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  1[d1]);.        
1b470 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  i64 rhs = pRhs->
1b480 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  u.i;.        if(
1b490 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
1b4a0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1b4b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1b4c0 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
1b4d0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1b4e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b4f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1b500 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20  HS is real */.  
1b510 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1b520 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
1b530 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  l ){.      seria
1b540 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1b550 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  dx1];.      if( 
1b560 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
1b570 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b580 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1b590 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1b5a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1b5b0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1b5c0 73 65 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62  se{.        doub
1b5d0 6c 65 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75  le rhs = pRhs->u
1b5e0 2e 72 3b 0a 20 20 20 20 20 20 20 20 64 6f 75 62  .r;.        doub
1b5f0 6c 65 20 6c 68 73 3b 0a 20 20 20 20 20 20 20 20  le lhs;.        
1b600 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b610 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1b620 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1b630 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  em1);.        if
1b640 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
1b650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68   ){.          lh
1b660 73 20 3d 20 6d 65 6d 31 2e 75 2e 72 3b 0a 20 20  s = mem1.u.r;.  
1b670 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b680 20 20 20 20 20 20 20 6c 68 73 20 3d 20 28 64 6f         lhs = (do
1b690 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20  uble)mem1.u.i;. 
1b6a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b6b0 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
1b6c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1b6d0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1b6e0 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
1b6f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
1b700 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1b710 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1b720 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69  /* RHS is a stri
1b730 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ng */.    else i
1b740 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1b750 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20   MEM_Str ){.    
1b760 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1b770 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
1b780 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
1b790 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1b7a0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1b7b0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1b7c0 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20  pe<12 ){.       
1b7d0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1b7e0 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
1b7f0 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1b800 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b810 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1b820 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20  .        mem1.n 
1b830 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
1b840 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
1b850 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1b860 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e  mem1.n)==(unsign
1b870 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1b880 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1b890 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e  1+mem1.n+1)==(un
1b8a0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1b8b0 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1b8c0 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67  mem1.n) > (unsig
1b8d0 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1b8e0 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1b8f0 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1b900 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1b910 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1b920 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1b930 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1b940 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1b950 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  lse if( pKeyInfo
1b960 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  ->aColl[i] ){.  
1b970 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63          mem1.enc
1b980 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
1b990 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1b9a0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1b9b0 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  db;.          me
1b9c0 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m1.flags = MEM_S
1b9d0 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  tr;.          me
1b9e0 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61  m1.z = (char*)&a
1b9f0 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20  Key1[d1];.      
1ba00 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
1ba10 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65               &me
1ba30 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e  m1, pRhs, pKeyIn
1ba40 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70  fo->aColl[i], &p
1ba50 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20  PKey2->errCode. 
1ba60 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
1ba70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ba80 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1ba90 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73  MIN(mem1.n, pRhs
1baa0 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1bab0 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1bac0 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1bad0 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1bae0 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1baf0 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73   = mem1.n - pRhs
1bb00 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  ->n; .        }.
1bb10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1bb20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62     /* RHS is a b
1bb30 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  lob */.    else 
1bb40 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1bb50 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  & MEM_Blob ){.  
1bb60 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1bb70 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1bb80 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1bb90 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1bba0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1bbb0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1bbc0 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69  type<12 || (seri
1bbd0 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
1bbe0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1bbf0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1bc00 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74  .        int nSt
1bc10 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1bc20 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1bc30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1bc40 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e  1+nStr)==(unsign
1bc50 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1bc60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1bc70 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69  1+nStr+1)==(unsi
1bc80 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1bc90 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53        if( (d1+nS
1bca0 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  tr) > (unsigned)
1bcb0 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1bcc0 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1bcd0 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1bce0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1bcf0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1bd00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bd10 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1bd20 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1bd30 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1bd40 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20  Cmp = MIN(nStr, 
1bd50 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1bd60 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1bd70 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1bd80 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1bd90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1bda0 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52  ) rc = nStr - pR
1bdb0 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d  hs->n;.        }
1bdc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1bdd0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75      /* RHS is nu
1bde0 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a  ll */.    else{.
1bdf0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1be00 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1be10 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72  .      rc = (ser
1be20 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20  ial_type!=0);.  
1be30 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21    }..    if( rc!
1be40 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1be50 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1be60 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1be70 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20     rc = -rc;.   
1be80 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1be90 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1bea0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1beb0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1bec0 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rc) );.      ass
1bed0 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1bee0 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1bef0 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1bf00 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  /.      return r
1bf10 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b  c;.    }..    i+
1bf20 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  +;.    pRhs++;. 
1bf30 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1bf40 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1bf50 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
1bf60 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69      idx1 += sqli
1bf70 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72  te3VarintLen(ser
1bf80 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68  ial_type);.  }wh
1bf90 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67  ile( idx1<(unsig
1bfa0 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c  ned)szHdr1 && i<
1bfb0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26  pPKey2->nField &
1bfc0 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29  & d1<=(unsigned)
1bfd0 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e  nKey1 );..  /* N
1bfe0 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1bff0 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1c000 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1c010 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1c020 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1c030 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1c040 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1c050 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1c060 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1c070 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1c080 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1c090 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1c0a0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c0b0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1c0c0 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1c0d0 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1c0e0 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74  one or both of t
1c0f0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
1c100 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
1c110 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
1c120 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
1c130 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
1c140 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
1c150 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1c160 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43    */.  assert( C
1c170 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20  ORRUPT_DB .     
1c180 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43    || vdbeRecordC
1c190 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1c1a0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1c1b0 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  , pPKey2->defaul
1c1c0 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c  t_rc) .       ||
1c1d0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1c1e0 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
1c1f0 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32  .  return pPKey2
1c200 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a  ->default_rc;.}.
1c210 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
1c220 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
1c230 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1c240 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
1c250 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1c260 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c270 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 20  *pPKey2         
1c280 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1c290 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 64 62  .){.  return vdb
1c2a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
1c2b0 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
1c2c0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b  ey1, pPKey2, 0);
1c2d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1c2e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
1c2f0 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
1c300 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
1c310 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
1c320 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
1c330 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
1c340 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65  PKey2 is an inte
1c350 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65  ger, and (b) the
1c360 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61   .** size-of-hea
1c370 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68  der varint at th
1c380 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
1c390 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
1c3a0 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74   a single.** byt
1c3b0 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20  e (i.e. is less 
1c3c0 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a  than 128)..**.**
1c3d0 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72   To avoid concer
1c3e0 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20  ns about buffer 
1c3f0 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20  overreads, this 
1c400 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
1c410 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d  used.** on schem
1c420 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78  as where the max
1c430 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65  imum valid heade
1c440 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74  r size is 63 byt
1c450 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73  es or less..*/.s
1c460 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1c470 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a  cordCompareInt(.
1c480 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1c490 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1c4a0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1c4b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c4c0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
1c4d0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
1c4e0 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
1c4f0 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38  ey = &((const u8
1c500 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74  *)pKey1)[*(const
1c510 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33   u8*)pKey1 & 0x3
1c520 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  F];.  int serial
1c530 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20  _type = ((const 
1c540 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20  u8*)pKey1)[1];. 
1c550 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20   int res;.  u32 
1c560 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36  y;.  u64 x;.  i6
1c570 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d  4 v = pPKey2->aM
1c580 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34  em[0].u.i;.  i64
1c590 20 6c 68 73 3b 0a 0a 20 20 61 73 73 65 72 74 28   lhs;..  assert(
1c5a0 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d   (*(u8*)pKey1)<=
1c5b0 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f  0x3F || CORRUPT_
1c5c0 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  DB );.  switch( 
1c5d0 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1c5e0 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
1c5f0 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
1c600 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
1c610 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  hs = ONE_BYTE_IN
1c620 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1c630 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1c640 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c650 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
1c660 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
1c670 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1c680 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42       lhs = TWO_B
1c690 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1c6a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1c6b0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1c6c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c6d0 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
1c6e0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c6f0 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1c700 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1c710 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1c720 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1c730 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c740 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
1c750 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
1c760 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1c770 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1c780 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1c790 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28     lhs = (i64)*(
1c7a0 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74  int*)&y;.      t
1c7b0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1c7c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c7d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1c7e0 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
1c7f0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1c800 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f       lhs = FOUR_
1c810 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1c820 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1c830 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1c840 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1c850 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1c860 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c870 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
1c880 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
1c890 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1c8a0 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45     x = FOUR_BYTE
1c8b0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1c8c0 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1c8d0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1c8e0 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c  aKey+4);.      l
1c8f0 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  hs = *(i64*)&x;.
1c900 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c910 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1c920 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c930 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c  case 8: .      l
1c940 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  hs = 0;.      br
1c950 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a  eak;.    case 9:
1c960 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a  .      lhs = 1;.
1c970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
1c980 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63    /* This case c
1c990 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20  ould be removed 
1c9a0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
1c9b0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1c9c0 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  running.    ** t
1c9d0 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64  his code. Includ
1c9e0 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63  ing it causes gc
1c9f0 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  c to generate a 
1ca00 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20  faster switch . 
1ca10 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
1ca20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65  (since the range
1ca30 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65   of switch targe
1ca40 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74  ts now starts at
1ca50 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a   zero and.    **
1ca60 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20   is contiguous) 
1ca70 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  but does not cau
1ca80 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65  se any duplicate
1ca90 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65   code to be gene
1caa0 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73  rated.    ** (as
1cab0 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65   gcc is clever e
1cac0 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65  nough to combine
1cad0 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61   the two like ca
1cae0 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20  ses). Other .   
1caf0 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69   ** compilers mi
1cb00 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20  ght be similar. 
1cb10 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a   */ .    case 0:
1cb20 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72   case 7:.      r
1cb30 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1cb40 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1cb50 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1cb60 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  ey2);..    defau
1cb70 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
1cb80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1cb90 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1cba0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
1cbb0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68  .  }..  if( v>lh
1cbc0 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
1cbd0 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c  PKey2->r1;.  }el
1cbe0 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a  se if( v<lhs ){.
1cbf0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1cc00 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r2;.  }else if
1cc10 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
1cc20 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >1 ){.    /* The
1cc30 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1cc40 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
1cc50 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65  e equal. Compare
1cc60 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20   the trailing . 
1cc70 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a     ** fields.  *
1cc80 2f 0a 20 20 20 20 72 65 73 20 3d 20 76 64 62 65  /.    res = vdbe
1cc90 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1cca0 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
1ccb0 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
1ccc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ccd0 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
1cce0 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
1ccf0 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74   are equal and t
1cd00 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69  here are no trai
1cd10 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ling.    ** fiel
1cd20 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79  ds. Return pPKey
1cd30 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e  2->default_rc in
1cd40 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
1cd50 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1cd60 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 7d  >default_rc;.  }
1cd70 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
1cd80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1cd90 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1cda0 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b   pPKey2, res) );
1cdb0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
1cdc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1cdd0 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1cde0 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1cdf0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1ce00 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1ce10 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1ce20 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
1ce30 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  y2 is a string, 
1ce40 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72  that (b) the fir
1ce50 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73  st field.** uses
1ce60 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1ce70 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61  equence BINARY a
1ce80 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20  nd (c) that the 
1ce90 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1cea0 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65  arint .** at the
1ceb0 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
1cec0 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
1ced0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
1cee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1cef0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1cf00 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ring(.  int nKey
1cf10 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1cf20 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1cf30 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1cf40 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
1cf50 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1cf60 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
1cf70 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  u8 *aKey1 = (con
1cf80 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20  st u8*)pKey1;.  
1cf90 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  int serial_type;
1cfa0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 67  .  int res;..  g
1cfb0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1cfc0 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  1[1], serial_typ
1cfd0 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e);.  if( serial
1cfe0 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
1cff0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
1d000 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
1d010 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d  /nKey1) is a num
1d020 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f  ber or a null */
1d030 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73  .  }else if( !(s
1d040 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1d050 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d  1) ){ .    res =
1d060 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20   pPKey2->r2;    
1d070 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
1d080 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  1) is a blob */.
1d090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1d0a0 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e   nCmp;.    int n
1d0b0 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48  Str;.    int szH
1d0c0 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a  dr = aKey1[0];..
1d0d0 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69      nStr = (seri
1d0e0 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b  al_type-12) / 2;
1d0f0 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20  .    if( (szHdr 
1d100 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20  + nStr) > nKey1 
1d110 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d  ){.      pPKey2-
1d120 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1d130 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1d140 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
1d150 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70   0;    /* Corrup
1d160 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
1d170 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50    nCmp = MIN( pP
1d180 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c  Key2->aMem[0].n,
1d190 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73   nStr );.    res
1d1a0 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1d1b0 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d  [szHdr], pPKey2-
1d1c0 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70  >aMem[0].z, nCmp
1d1d0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d  );..    if( res=
1d1e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  =0 ){.      res 
1d1f0 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d  = nStr - pPKey2-
1d200 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20  >aMem[0].n;.    
1d210 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
1d220 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65          if( pPKe
1d230 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
1d240 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
1d250 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1d260 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
1d270 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1d280 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
1d290 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  e{.          res
1d2a0 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1d2b0 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  lt_rc;.        }
1d2c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d2d0 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
1d2e0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1d2f0 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r2;.      }else{
1d300 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
1d310 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20  PKey2->r1;.     
1d320 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
1d330 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
1d340 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
1d350 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d360 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1d370 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  >r1;.    }.  }..
1d380 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
1d390 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1d3a0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1d3b0 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20  PKey2, res).    
1d3c0 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
1d3d0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79  .       || pPKey
1d3e0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  2->pKeyInfo->db-
1d3f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
1d400 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
1d410 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d420 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
1d430 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1d440 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70  rdCompare() comp
1d450 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a  atible function.
1d460 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ** suitable for 
1d470 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c  comparing serial
1d480 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20  ized records to 
1d490 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63  the unpacked rec
1d4a0 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ord passed.** as
1d4b0 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
1d4c0 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d  nt..*/.RecordCom
1d4d0 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65  pare sqlite3Vdbe
1d4e0 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61  FindCompare(Unpa
1d4f0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a  ckedRecord *p){.
1d500 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72    /* varintRecor
1d510 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
1d520 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  d varintRecordCo
1d530 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f  mpareString() bo
1d540 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74  th assume.  ** t
1d550 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d  hat the size-of-
1d560 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68  header varint th
1d570 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
1d580 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72   start of each r
1d590 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20  ecord.  ** fits 
1d5a0 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
1d5b0 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72   (i.e. is 127 or
1d5c0 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65   less). varintRe
1d5d0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
1d5e0 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d  .  ** also assum
1d5f0 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61  es that it is sa
1d600 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61  fe to overread a
1d610 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65   buffer by at le
1d620 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61  ast the .  ** ma
1d630 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c  ximum possible l
1d640 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  egal header size
1d650 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42   plus 8 bytes. B
1d660 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a  ecause there is.
1d670 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
1d680 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37  to be at least 7
1d690 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20  4 (but not 136) 
1d6a0 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
1d6b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a   following each.
1d6c0 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73    ** buffer pass
1d6d0 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f  ed to varintReco
1d6e0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74  rdCompareInt() t
1d6f0 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e  his makes it con
1d700 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20  venient to.  ** 
1d710 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f  limit the size o
1d720 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20  f the header to 
1d730 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65  64 bytes in case
1d740 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73  s where the firs
1d750 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20  t field.  ** is 
1d760 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a  an integer..  **
1d770 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73  .  ** The easies
1d780 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65  t way to enforce
1d790 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74   this limit is t
1d7a0 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20  o consider only 
1d7b0 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a  records with.  *
1d7c0 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c  * 13 fields or l
1d7d0 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73  ess. If the firs
1d7e0 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e  t field is an in
1d7f0 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d  teger, the maxim
1d800 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65  um legal.  ** he
1d810 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32  ader size is (12
1d820 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65  *5 + 1 + 1) byte
1d830 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  s.  */.  if( (p-
1d840 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1d850 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  d + p->pKeyInfo-
1d860 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b  >nXField)<=13 ){
1d870 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
1d880 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67   p->aMem[0].flag
1d890 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b  s;.    if( p->pK
1d8a0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1d8b0 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70  er[0] ){.      p
1d8c0 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20  ->r1 = 1;.      
1d8d0 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r2 = -1;.    
1d8e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
1d8f0 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  r1 = -1;.      p
1d900 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ->r2 = 1;.    }.
1d910 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
1d920 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20   MEM_Int) ){.   
1d930 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
1d940 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a  cordCompareInt;.
1d950 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
1d960 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
1d970 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  Real );.    test
1d980 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
1d990 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65  M_Null );.    te
1d9a0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
1d9b0 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
1d9c0 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45  if( (flags & (ME
1d9d0 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c  M_Real|MEM_Null|
1d9e0 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26  MEM_Blob))==0 &&
1d9f0 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43   p->pKeyInfo->aC
1da00 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20  oll[0]==0 ){.   
1da10 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
1da20 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20   & MEM_Str );.  
1da30 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
1da40 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1da50 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ng;.    }.  }.. 
1da60 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1da70 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1da80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20  ;.}../*.** pCur 
1da90 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64  points at an ind
1daa0 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64  ex entry created
1dab0 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61   using the OP_Ma
1dac0 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
1dad0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77  .** Read the row
1dae0 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65  id (the last fie
1daf0 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  ld in the record
1db00 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69  ) and store it i
1db10 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74  n *rowid..** Ret
1db20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
1db30 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
1db40 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  s, or an error c
1db50 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1db60 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20  *.** pCur might 
1db70 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  be pointing to t
1db80 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ext obtained fro
1db90 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
1dba0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f  base file..** So
1dbb0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e   the content can
1dbc0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
1dbd0 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   Do appropriate 
1dbe0 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f  checks on the co
1dbf0 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ntent..*/.int sq
1dc00 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69  lite3VdbeIdxRowi
1dc10 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42  d(sqlite3 *db, B
1dc20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1dc30 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
1dc40 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
1dc50 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
1dc60 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
1dc70 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
1dc80 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
1dc90 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
1dca0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
1dcb0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
1dcc0 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
1dcd0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
1dce0 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
1dcf0 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
1dd00 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
1dd10 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69  x entry.  Only i
1dd20 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f  ndices entries o
1dd30 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  f less.  ** than
1dd40 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72   2GiB are suppor
1dd50 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72  t - anything lar
1dd60 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62  ge must be datab
1dd70 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1dd80 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74    ** Any corrupt
1dd90 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
1dda0 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  in sqlite3BtreeP
1ddb0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74  arseCellPtr(), t
1ddc0 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74  hough, so.  ** t
1ddd0 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66  his code can saf
1dde0 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20  ely assume that 
1ddf0 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62  nCellKey is 32-b
1de00 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73  its  .  */.  ass
1de10 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1de20 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
1de30 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e  Cur) );.  VVA_ON
1de40 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33  LY(rc =) sqlite3
1de50 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
1de60 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
1de70 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1de80 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a  ITE_OK );     /*
1de90 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
1dea0 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
1deb0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
1dec0 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c    assert( (nCell
1ded0 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58  Key & SQLITE_MAX
1dee0 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c  _U32)==(u64)nCel
1def0 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  lKey );..  /* Re
1df00 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65  ad in the comple
1df10 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  te content of th
1df20 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f  e index entry */
1df30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
1df40 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
1df50 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1df60 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
1df70 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
1df80 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
1df90 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1dfa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1dfb0 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
1dfc0 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
1dfd0 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
1dfe0 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
1dff0 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
1e000 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
1e010 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
1e020 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
1e030 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
1e040 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a   if( unlikely(sz
1e050 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a  Hdr<3 || (int)sz
1e060 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20  Hdr>m.n) ){.    
1e070 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
1e080 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
1e090 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69    /* The last fi
1e0a0 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  eld of the index
1e0b0 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
1e0c0 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49  teger - the ROWI
1e0d0 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  D..  ** Verify t
1e0e0 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  hat the last ent
1e0f0 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  ry really is an 
1e100 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76  integer. */.  (v
1e110 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
1e120 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
1e130 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
1e140 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1e150 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65  Rowid==1 );.  te
1e160 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1e170 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61  d==2 );.  testca
1e180 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33  se( typeRowid==3
1e190 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1e1a0 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a  typeRowid==4 );.
1e1b0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1e1c0 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65  Rowid==5 );.  te
1e1d0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1e1e0 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61  d==6 );.  testca
1e1f0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38  se( typeRowid==8
1e200 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1e210 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a  typeRowid==9 );.
1e220 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74    if( unlikely(t
1e230 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79  ypeRowid<1 || ty
1e240 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70  peRowid>9 || typ
1e250 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20  eRowid==7) ){.  
1e260 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
1e270 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
1e280 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
1e290 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1e2a0 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
1e2b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
1e2c0 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
1e2d0 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
1e2e0 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
1e2f0 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
1e300 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
1e310 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1e320 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
1e330 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
1e340 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
1e350 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
1e360 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1e370 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
1e380 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
1e390 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
1e3a0 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
1e3b0 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
1e3c0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1e3d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1e3e0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
1e3f0 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
1e400 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1e410 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
1e420 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
1e430 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
1e440 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
1e450 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1e460 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
1e470 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
1e480 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
1e490 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  szMalloc!=0 );. 
1e4a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1e4b0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
1e4c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e4d0 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
1e4e0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
1e4f0 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
1e500 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
1e510 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
1e520 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
1e530 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
1e540 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
1e550 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
1e560 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
1e570 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
1e580 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1e590 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
1e5a0 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
1e5b0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
1e5c0 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
1e5d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1e5e0 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
1e5f0 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
1e600 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
1e610 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
1e620 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
1e630 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
1e640 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
1e650 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
1e660 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1e670 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
1e680 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
1e690 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
1e6a0 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
1e6b0 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
1e6c0 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
1e6d0 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
1e6e0 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
1e6f0 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
1e700 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e710 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
1e720 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1e730 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e740 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1e750 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1e760 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1e770 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e780 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1e790 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
1e7a0 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
1e7b0 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
1e7c0 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70  ed,       /* Unp
1e7d0 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
1e7e0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72   key */.  int *r
1e7f0 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
1e800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1e810 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
1e820 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
1e830 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
1e840 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
1e850 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
1e860 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
1e870 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
1e880 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1e890 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
1e8a0 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f  (pCur) );.  VVA_
1e8b0 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
1e8c0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
1e8d0 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
1e8e0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
1e8f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f  QLITE_OK );    /
1e900 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73  * pCur is always
1e910 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a   valid so KeySiz
1e920 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  e cannot fail */
1e930 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77  .  /* nCellKey w
1e940 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65  ill always be be
1e950 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66  tween 0 and 0xff
1e960 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f  ffffff because o
1e970 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74  f the way.  ** t
1e980 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65  hat btreeParseCe
1e990 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69  llPtr() and sqli
1e9a0 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
1e9b0 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
1e9c0 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b   */.  if( nCellK
1e9d0 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
1e9e0 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  y>0x7fffffff ){.
1e9f0 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
1ea00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ea10 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ea20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  }.  sqlite3VdbeM
1ea30 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
1ea40 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1ea50 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
1ea60 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
1ea70 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
1ea80 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
1ea90 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1eaa0 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
1eab0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1eac0 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
1ead0 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
1eae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1eaf0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
1eb00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1eb10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1eb20 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
1eb30 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
1eb40 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
1eb50 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
1eb60 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
1eb70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1eb80 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
1eb90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
1eba0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
1ebb0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
1ebc0 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
1ebd0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1ebe0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
1ebf0 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
1ec00 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
1ec10 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
1ec20 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
1ec30 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
1ec40 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
1ec50 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
1ec60 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
1ec70 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
1ec80 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
1ec90 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
1eca0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
1ecb0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
1ecc0 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
1ecd0 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
1ece0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1ecf0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ed00 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
1ed10 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
1ed20 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
1ed30 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
1ed40 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
1ed50 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
1ed60 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
1ed70 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
1ed80 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
1ed90 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
1eda0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
1edb0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
1edc0 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
1edd0 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
1ede0 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
1edf0 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
1ee00 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
1ee10 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
1ee20 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
1ee30 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
1ee40 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
1ee50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
1ee60 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
1ee70 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
1ee80 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
1ee90 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
1eea0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
1eeb0 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
1eec0 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
1eed0 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
1eee0 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
1eef0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1ef00 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
1ef10 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
1ef20 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
1ef30 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
1ef40 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
1ef50 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
1ef60 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1ef70 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
1ef80 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
1ef90 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
1efa0 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
1efb0 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
1efc0 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
1efd0 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
1efe0 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
1eff0 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
1f000 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
1f010 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
1f020 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
1f030 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
1f040 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
1f050 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
1f060 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
1f070 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
1f080 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
1f090 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1f0a0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
1f0b0 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
1f0c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
1f0d0 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
1f0e0 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
1f0f0 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
1f100 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
1f110 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
1f120 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
1f130 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
1f140 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
1f150 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
1f160 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
1f170 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1f180 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
1f190 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
1f1a0 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
1f1b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f1c0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
1f1d0 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
1f1e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f1f0 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
1f200 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
1f210 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
1f220 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1f230 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
1f240 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1f250 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1f260 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
1f270 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
1f280 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
1f290 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
1f2a0 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
1f2b0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
1f2c0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
1f2d0 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
1f2e0 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
1f2f0 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
1f300 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1f310 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
1f320 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
1f330 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
1f340 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
1f350 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
1f360 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
1f370 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
1f380 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
1f390 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
1f3a0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
1f3b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1f3c0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
1f3d0 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
1f3e0 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
1f3f0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
1f400 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
1f410 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
1f420 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1f430 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
1f440 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
1f450 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
1f460 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
1f470 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1f480 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
1f490 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
1f4a0 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
1f4b0 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
1f4c0 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
1f4d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1f4e0 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
1f4f0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
1f500 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
1f510 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
1f520 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
1f530 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1f540 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
1f550 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
1f560 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
1f570 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1f580 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1f590 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
1f5a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
1f5b0 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a  EUPDATE_HOOK../*
1f5c0 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
1f5d0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
1f5e0 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20  t NULL, release 
1f5f0 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  any allocations 
1f600 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77  associated .** w
1f610 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ith the memory c
1f620 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61  ells in the p->a
1f630 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73  Mem[] array. Als
1f640 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63  o free the Unpac
1f650 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
1f660 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75  ucture itself, u
1f670 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
1f680 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ee()..**.** This
1f690 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1f6a0 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b  d to free Unpack
1f6b0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
1f6c0 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  res allocated by
1f6d0 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61  .** the vdbeUnpa
1f6e0 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74  ckRecord() funct
1f6f0 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62  ion found in vdb
1f700 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69  eapi.c..*/.stati
1f710 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55  c void vdbeFreeU
1f720 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20  npacked(sqlite3 
1f730 2a 64 62 2c 20 55 6e 70 61 63 6b 65 64 52 65 63  *db, UnpackedRec
1f740 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ord *p){.  if( p
1f750 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1f760 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
1f770 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nField; i++){. 
1f780 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
1f790 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20   &p->aMem[i];.  
1f7a0 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d      if( pMem->zM
1f7b0 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56  alloc ) sqlite3V
1f7c0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
1f7d0 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  em);.    }.    s
1f7e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f7f0 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
1f800 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65  * Invoke the pre
1f810 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66  -update hook. If
1f820 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41   this is an UPDA
1f830 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65  TE or DELETE pre
1f840 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a  -update call,.**
1f850 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73   then cursor pas
1f860 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1f870 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  d argument shoul
1f880 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  d point to the r
1f890 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62  ow about.** to b
1f8a0 65 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65  e update or dele
1f8b0 74 65 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c  ted. If the appl
1f8c0 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71  ication calls sq
1f8d0 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f  lite3_preupdate_
1f8e0 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65  old(),.** the re
1f8f0 71 75 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c  quired value wil
1f900 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
1f910 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f  he row the curso
1f920 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a  r points to..*/.
1f930 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1f940 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20  PreUpdateHook(. 
1f950 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f970 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64   /* Vdbe pre-upd
1f980 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f  ate hook is invo
1f990 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65  ked by */.  Vdbe
1f9a0 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20  Cursor *pCsr,   
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1f9c0 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c  ursor to grab ol
1f9d0 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  d.* values from 
1f9e0 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49       /* SQLITE_I
1fa10 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
1fa20 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e   DELETE */.  con
1fa30 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa50 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f  Database name */
1fa60 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74     /* Modified t
1fa90 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b  able */.  i64 iK
1faa0 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey1,            
1fab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
1fac0 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a  tial key value *
1fad0 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20  /.  int iReg    
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faf0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
1fb00 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64  for new.* record
1fb10 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
1fb20 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20   *db = v->db;.  
1fb30 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65  i64 iKey2;.  Pre
1fb40 55 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65  Update preupdate
1fb50 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1fb60 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  zTbl = pTab->zNa
1fb70 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  me;.  static con
1fb80 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72  st u8 fakeSortOr
1fb90 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  der = 0;..  asse
1fba0 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61  rt( db->pPreUpda
1fbb0 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65  te==0 );.  memse
1fbc0 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c  t(&preupdate, 0,
1fbd0 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74   sizeof(PreUpdat
1fbe0 65 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53  e));.  if( op==S
1fbf0 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a  QLITE_UPDATE ){.
1fc00 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61      iKey2 = v->a
1fc10 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20  Mem[iReg].u.i;. 
1fc20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79   }else{.    iKey
1fc30 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a  2 = iKey1;.  }..
1fc40 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
1fc50 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43  nField==pTab->nC
1fc60 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ol .       || (p
1fc70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61  Csr->nField==pTa
1fc80 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d  b->nCol+1 && op=
1fc90 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26  =SQLITE_DELETE &
1fca0 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b  & iReg==-1).  );
1fcb0 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76 20  ..  preupdate.v 
1fcc0 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65  = v;.  preupdate
1fcd0 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20  .pCsr = pCsr;.  
1fce0 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f  preupdate.op = o
1fcf0 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  p;.  preupdate.i
1fd00 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20  NewReg = iReg;. 
1fd10 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
1fd20 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72  fo.db = db;.  pr
1fd30 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
1fd40 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
1fd50 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
1fd60 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54 61 62  fo.nField = pTab
1fd70 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64  ->nCol;.  preupd
1fd80 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72  ate.keyinfo.aSor
1fd90 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66  tOrder = (u8*)&f
1fda0 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  akeSortOrder;.  
1fdb0 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20  preupdate.iKey1 
1fdc0 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70  = iKey1;.  preup
1fdd0 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65  date.iKey2 = iKe
1fde0 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  y2;.  preupdate.
1fdf0 69 50 4b 65 79 20 3d 20 70 54 61 62 2d 3e 69 50  iPKey = pTab->iP
1fe00 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65  Key;..  db->pPre
1fe10 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64  Update = &preupd
1fe20 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55  ate;.  db->xPreU
1fe30 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62  pdateCallback(db
1fe40 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c  ->pPreUpdateArg,
1fe50 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54   db, op, zDb, zT
1fe60 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32  bl, iKey1, iKey2
1fe70 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  );.  db->pPreUpd
1fe80 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ate = 0;.  sqlit
1fe90 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65  e3DbFree(db, pre
1fea0 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b  update.aRecord);
1feb0 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
1fec0 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
1fed0 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  e.pUnpacked);.  
1fee0 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64  vdbeFreeUnpacked
1fef0 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70  (db, preupdate.p
1ff00 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  NewUnpacked);.  
1ff10 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e  if( preupdate.aN
1ff20 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ew ){.    int i;
1ff30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1ff40 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b  pCsr->nField; i+
1ff50 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1ff60 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1ff70 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b  &preupdate.aNew[
1ff80 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  i]);.    }.    s
1ff90 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ffa0 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29   preupdate.aNew)
1ffb0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
1ffc0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1ffd0 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
1ffe0 2f 0a                                            /.