/ Hex Artifact Content
Login

Artifact bf85a5975ade7da58fb31473a713c2f63ac86697:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   );.  return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
0420: 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  r the SQL string
0430: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 20   for a prepared 
0440: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
0450: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
0460: 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f  tSql(Vdbe *p, co
0470: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
0480: 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70 61 72   n, int isPrepar
0490: 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74 28 20  eV2){.  assert( 
04a0: 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31 20 7c  isPrepareV2==1 |
04b0: 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 30  | isPrepareV2==0
04c0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
04d0: 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64 65 66   return;.#if def
04e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
04f0: 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
0500: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
0510: 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66 28 20  E_SQLLOG).  if( 
0520: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0530: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0540: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0550: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0560: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0570: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0580: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0590: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
05a0: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
05b0: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
05c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
05f0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
0600: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
0610: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0620: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0630: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0640: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0650: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0660: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0670: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0680: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0690: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06a0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06b0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06c0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
06d0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
06e0: 0a 20 20 61 73 73 65 72 74 28 20 70 41 2d 3e 64  .  assert( pA->d
06f0: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74  b==pB->db );.  t
0700: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0710: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0720: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0730: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0740: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0750: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0760: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0770: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0780: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0790: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
07a0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
07b0: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
07c0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
07d0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
07e0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
07f0: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
0800: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pareV2;.}../*.**
0810: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
0820: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
0830: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
0840: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
0850: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
0860: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
0870: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0880: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
0890: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
08a0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
08b0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
08c0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
08d0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
08e0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
08f0: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0900: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0910: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
0920: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
0930: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0940: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0950: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0960: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0970: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0980: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0990: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
09a0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
09b0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
09c0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
09d0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
09e0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
09f0: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0a00: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0a10: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0a20: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0a30: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0a40: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0a50: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0a60: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0a70: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0a80: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0a90: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0aa0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0ab0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0ac0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0ad0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0ae0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0af0: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0b00: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0b10: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0b20: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0b30: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0b40: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0b50: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0b60: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0b70: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0b80: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0b90: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0ba0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0bb0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0bc0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0bd0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0be0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0bf0: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0c00: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0c10: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0c20: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0c30: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0c40: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0c50: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0c60: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0c70: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0c80: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0c90: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0ca0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0cb0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0cc0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0cd0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0ce0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
0cf0: 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73  rt( nOp<=(1024/s
0d00: 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20  izeof(Op)) );.  
0d10: 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70  assert( nNew>=(p
0d20: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20  ->nOpAlloc+nOp) 
0d30: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
0d40: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e  te3DbRealloc(p->
0d50: 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77  db, v->aOp, nNew
0d60: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
0d70: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0d80: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71  p->nOpAlloc = sq
0d90: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
0da0: 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73  e(p->db, pNew)/s
0db0: 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76  izeof(Op);.    v
0dc0: 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20  ->aOp = pNew;.  
0dd0: 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77  }.  return (pNew
0de0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
0df0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a  QLITE_NOMEM);.}.
0e00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0e10: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72 6f 75  EBUG./* This rou
0e20: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 20 63  tine is just a c
0e30: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
0e40: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
0e50: 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a  int that will.**
0e60: 20 66 69 72 65 20 61 66 74 65 72 20 65 61 63 68   fire after each
0e70: 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73 65 72   opcode is inser
0e80: 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61 79 65  ted and displaye
0e90: 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52 41 47  d using.** "PRAG
0ea0: 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61  MA vdbe_addoptra
0eb0: 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69  ce=on"..*/.stati
0ec0: 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64 64 6f  c void test_addo
0ed0: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69  p_breakpoint(voi
0ee0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  d){.  static int
0ef0: 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d   n = 0;.  n++;.}
0f00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0f10: 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63  dd a new instruc
0f20: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74  tion to the list
0f30: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   of instructions
0f40: 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a   current in the.
0f50: 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e  ** VDBE.  Return
0f60: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
0f70: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74  the new instruct
0f80: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ion..**.** Param
0f90: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eters:.**.**    
0fa0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
0fb0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  Pointer to the V
0fc0: 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20  DBE.**.**    op 
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
0fe0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73   opcode for this
0ff0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a   instruction.**.
1000: 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33  **    p1, p2, p3
1010: 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a        Operands.*
1020: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
1030: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1040: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
1050: 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73  to fix an addres
1060: 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c  s and.** the sql
1070: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1080: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
1090: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
10a0: 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65  of the P4.** ope
10b0: 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rand..*/.int sql
10c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56  ite3VdbeAddOp3(V
10d0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
10e0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
10f0: 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69  int p3){.  int i
1100: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
1110: 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  ..  i = p->nOp;.
1120: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
1130: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
1140: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
1150: 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78 66 66   op>0 && op<0xff
1160: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 61   );.  if( p->pPa
1170: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69  rse->nOpAlloc<=i
1180: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77   ){.    if( grow
1190: 4f 70 41 72 72 61 79 28 70 2c 20 31 29 20 29 7b  OpArray(p, 1) ){
11a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
11b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
11c0: 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp++;.  pOp = &
11d0: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70  p->aOp[i];.  pOp
11e0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f  ->opcode = (u8)o
11f0: 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30  p;.  pOp->p5 = 0
1200: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31  ;.  pOp->p1 = p1
1210: 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32  ;.  pOp->p2 = p2
1220: 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33  ;.  pOp->p3 = p3
1230: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
1240: 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  0;.  pOp->p4type
1250: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23   = P4_NOTUSED;.#
1260: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1270: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
1280: 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d  ENTS.  pOp->zCom
1290: 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ment = 0;.#endif
12a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
12b0: 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 64 62  EBUG.  if( p->db
12c0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
12d0: 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
12e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c 20 6b  ){.    int jj, k
12f0: 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50  k;.    Parse *pP
1300: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
1310: 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d  ;.    for(jj=kk=
1320: 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43  0; jj<SQLITE_N_C
1330: 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a  OLCACHE; jj++){.
1340: 20 20 20 20 20 20 73 74 72 75 63 74 20 79 43 6f        struct yCo
1350: 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50 61 72  lCache *x = pPar
1360: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20 2b 20  se->aColCache + 
1370: 6a 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 78 2d  jj;.      if( x-
1380: 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  >iLevel>pParse->
1390: 69 43 61 63 68 65 4c 65 76 65 6c 20 7c 7c 20 78  iCacheLevel || x
13a0: 2d 3e 69 52 65 67 3d 3d 30 20 29 20 63 6f 6e 74  ->iReg==0 ) cont
13b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 72 69 6e  inue;.      prin
13c0: 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25  tf(" r[%d]={%d:%
13d0: 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d  d}", x->iReg, x-
13e0: 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c  >iTable, x->iCol
13f0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b  umn);.      kk++
1400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1410: 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22  kk ) printf("\n"
1420: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1430: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
1440: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
1450: 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61   test_addop_brea
1460: 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65  kpoint();.  }.#e
1470: 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45  ndif.#ifdef VDBE
1480: 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e  _PROFILE.  pOp->
1490: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f  cycles = 0;.  pO
14a0: 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  p->cnt = 0;.#end
14b0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
14c0: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
14d0: 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d   pOp->iSrcLine =
14e0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
14f0: 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c  urn i;.}.int sql
1500: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56  ite3VdbeAddOp0(V
1510: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b  dbe *p, int op){
1520: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1530: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1540: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  p, 0, 0, 0);.}.i
1550: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1560: 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp1(Vdbe *p, in
1570: 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20  t op, int p1){. 
1580: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1590: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
15a0: 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e   p1, 0, 0);.}.in
15b0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
15c0: 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op2(Vdbe *p, int
15d0: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
15e0: 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p2){.  return s
15f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1600: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1610: 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  0);.}.../*.** Ad
1620: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
1630: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
1640: 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e   value as a poin
1650: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1660: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
1670: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
1680: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1690: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
16a0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
16b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16c0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
16d0: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
16e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
16f0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1700: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1710: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1720: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1740: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1750: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1760: 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34  P4,    /* The P4
1770: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1780: 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20  t p4type        
1790: 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20    /* P4 operand 
17a0: 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  type */.){.  int
17b0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
17c0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
17d0: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
17e0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
17f0: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34  eP4(p, addr, zP4
1800: 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74  , p4type);.  ret
1810: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
1820: 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72  ** Add an OP_Par
1830: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e  seSchema opcode.
1840: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
1850: 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f  s broken out fro
1860: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
1870: 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69  AddOp4() since i
1880: 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20  t needs to also 
1890: 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c  needs to mark al
18a0: 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68  l btrees.** as h
18b0: 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e  aving been used.
18c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72  .**.** The zWher
18d0: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61  e string must ha
18e0: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
18f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
1900: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20  lloc()..** This 
1910: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b  routine will tak
1920: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
1930: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
1940: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ory..*/.void sql
1950: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
1960: 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70  SchemaOp(Vdbe *p
1970: 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20  , int iDb, char 
1980: 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *zWhere){.  int 
1990: 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  j;.  int addr = 
19a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b0: 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(p, OP_ParseSch
19c0: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 29 3b  ema, iDb, 0, 0);
19d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
19e0: 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20  angeP4(p, addr, 
19f0: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
1a00: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
1a10: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
1a20: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
1a30: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
1a40: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
1a50: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
1a60: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
1a70: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
1a80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1a90: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
1aa0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
1ab0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
1ac0: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
1ad0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
1ae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1af0: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
1b00: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
1b10: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
1b20: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1b30: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
1b40: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
1b50: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
1b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b70: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
1b80: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
1b90: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
1ba0: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
1bb0: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
1bc0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1bd0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1be0: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1bf0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1c00: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51 4c  eP4(p, addr, SQL
1c10: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70  ITE_INT_TO_PTR(p
1c20: 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  4), P4_INT32);. 
1c30: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1c40: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1c50: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
1c60: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
1c70: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
1c80: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
1c90: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
1ca0: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
1cb0: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
1cc0: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
1cd0: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
1ce0: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
1cf0: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
1d00: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
1d10: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
1d20: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
1d30: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
1d40: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
1d50: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
1d60: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
1d70: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
1d80: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
1d90: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
1da0: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
1db0: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
1dc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
1dd0: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
1de0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
1df0: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
1e00: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
1e10: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
1e20: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
1e30: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
1e40: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
1e50: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
1e60: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
1e70: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
1e80: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a  e resolved..**.*
1e90: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
1ea0: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ed if a malloc()
1eb0: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73   fails..*/.int s
1ec0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1ed0: 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  bel(Vdbe *v){.  
1ee0: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50  Parse *p = v->pP
1ef0: 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20  arse;.  int i = 
1f00: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
1f10: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
1f20: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1f30: 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28   );.  if( (i & (
1f40: 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i-1))==0 ){.    
1f50: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69  p->aLabel = sqli
1f60: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
1f70: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
1f80: 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  bel, .          
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 2a               (i*
1fb0: 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  2+1)*sizeof(p->a
1fc0: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a  Label[0]));.  }.
1fd0: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
1fe0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1ff0: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  [i] = -1;.  }.  
2000: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a  return -1-i;.}..
2010: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
2020: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
2030: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
2040: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2050: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
2060: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
2070: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
2080: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
2090: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
20a0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
20b0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
20c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
20d0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
20e0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b  Vdbe *v, int x){
20f0: 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d  .  Parse *p = v-
2100: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a  >pParse;.  int j
2110: 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72   = -1-x;.  asser
2120: 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( v->magic==VDB
2130: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2140: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e    assert( j<p->n
2150: 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 41  Label );.  if( A
2160: 4c 57 41 59 53 28 6a 3e 3d 30 29 20 26 26 20 70  LWAYS(j>=0) && p
2170: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
2180: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76  p->aLabel[j] = v
2190: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ->nOp;.  }.  p->
21a0: 69 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f  iFixedOp = v->nO
21b0: 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p - 1;.}../*.** 
21c0: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73  Mark the VDBE as
21d0: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e   one that can on
21e0: 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69  ly be run one ti
21f0: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
2200: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e  te3VdbeRunOnlyOn
2210: 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  ce(Vdbe *p){.  p
2220: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
2230: 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  1;.}..#ifdef SQL
2240: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
2250: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
2260: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
2270: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2280: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
2290: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
22a0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
22b0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
22c0: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
22d0: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
22e0: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
22f0: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
2300: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
2310: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
2320: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
2330: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
2340: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
2350: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
2360: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
2370: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
2380: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
2390: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
23a0: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
23d0: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
23e0: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
23f0: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
2400: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
2410: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
2420: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
2430: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2440: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
2450: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
2460: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
2470: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
2480: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
2490: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
24a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24b0: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
24c0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
24d0: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
24e0: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
24f0: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
2500: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
2510: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
2520: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
2530: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2540: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
2550: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
2560: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
2570: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2580: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
2590: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
25a0: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25c0: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
25d0: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
25e0: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
25f0: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
2600: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
2610: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
2620: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
2630: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
2640: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
2650: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
2660: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
2670: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
2680: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
2690: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
26a0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
26b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
26c0: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
26d0: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
26e0: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
26f0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
2700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2710: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
2720: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
2730: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
2740: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
2750: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
2760: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
2770: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
2780: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
2790: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
27a0: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
27b0: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
27c0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
27d0: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
27e0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
27f0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2800: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2810: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
2820: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
2830: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
2840: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
2850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2860: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
2870: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
2880: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
2890: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
28a0: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
28b0: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
28c0: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
28d0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
28e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
28f0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
2900: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
2910: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
2920: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
2930: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2940: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
2950: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
2960: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
2970: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
2980: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2990: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
29a0: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
29b0: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
29c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
29d0: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
29e0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
29f0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
2a00: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
2a10: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
2a20: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
2a30: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
2a40: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
2a50: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
2a60: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
2a70: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
2a80: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
2a90: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
2aa0: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
2ab0: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
2ac0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
2ad0: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
2ae0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
2af0: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
2b00: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
2b10: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
2b20: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
2b30: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
2b40: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
2b50: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a  constraint).**.*
2b60: 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61  * Then check tha
2b70: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  t the value of P
2b80: 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73  arse.mayAbort is
2b90: 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41   true if an.** A
2ba0: 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f  BORT may be thro
2bb0: 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  wn, or false oth
2bc0: 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74  erwise. Return t
2bd0: 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a  rue if it does.*
2be0: 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73  * match, or fals
2bf0: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69  e otherwise. Thi
2c00: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
2c10: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
2c20: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
2c30: 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  an assert statem
2c40: 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69  ent in the compi
2c50: 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a  ler. Similar to:
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28  .**.**   assert(
2c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
2c80: 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  rtMayAbort(pPars
2c90: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
2ca0: 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a  ->mayAbort) );.*
2cb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2cc0: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
2cd0: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79  Vdbe *v, int may
2ce0: 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61  Abort){.  int ha
2cf0: 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e  sAbort = 0;.  in
2d00: 74 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d  t hasFkCounter =
2d10: 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20   0;.  Op *pOp;. 
2d20: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
2d30: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74  r;.  memset(&sIt
2d40: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
2d50: 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76  ter));.  sIter.v
2d60: 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = v;..  while( 
2d70: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
2d80: 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b  t(&sIter))!=0 ){
2d90: 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20  .    int opcode 
2da0: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
2db0: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
2dc0: 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63  P_Destroy || opc
2dd0: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
2de0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
2df0: 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28  ename .     || (
2e00: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
2e10: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
2e20: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
2e30: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30    && ((pOp->p1&0
2e40: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
2e50: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
2e60: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20  p2==OE_Abort)). 
2e70: 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41     ){.      hasA
2e80: 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  bort = 1;.      
2e90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
2ea0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2eb0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
2ec0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2ed0: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
2ee0: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
2ef0: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
2f00: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
2f10: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2f20: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
2f30: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
2f40: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
2f50: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
2f60: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
2f70: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
2f80: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
2f90: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
2fa0: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
2fb0: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
2fc0: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
2fd0: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
2fe0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
2ff0: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
3000: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
3010: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
3020: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
3030: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
3040: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
3050: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
3060: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
3070: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
3080: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
3090: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
30a0: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
30b0: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20  || hasFkCounter 
30c0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
30d0: 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68  QLITE_DEBUG - th
30e0: 65 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  e sqlite3AssertM
30f0: 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69  ayAbort() functi
3100: 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  on */../*.** Loo
3110: 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72  p through the pr
3120: 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ogram looking fo
3130: 72 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74  r P2 values that
3140: 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a   are negative.**
3150: 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   on jump instruc
3160: 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63  tions.  Each suc
3170: 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  h value is a lab
3180: 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65  el.  Resolve the
3190: 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74  .** label by set
31a0: 74 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75  ting the P2 valu
31b0: 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  e to its correct
31c0: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e   non-zero value.
31d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
31e0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
31f0: 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63  ce after all opc
3200: 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  odes have been i
3210: 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56  nserted..**.** V
3220: 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e  ariable *pMaxFun
3230: 63 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20  cArgs is set to 
3240: 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  the maximum valu
3250: 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75  e of any P2 argu
3260: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f  ment .** to an O
3270: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41  P_Function, OP_A
3280: 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69  ggStep or OP_VFi
3290: 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69  lter opcode. Thi
32a0: 73 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a  s is used by .**
32b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
32c0: 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20  Ready() to size 
32d0: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
32e0: 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   array..**.** Th
32f0: 65 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65  e Op.opflags fie
3300: 6c 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c  ld is set on all
3310: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61   opcodes..*/.sta
3320: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
3330: 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70  P2Values(Vdbe *p
3340: 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41  , int *pMaxFuncA
3350: 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rgs){.  int i;. 
3360: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
3370: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20  *pMaxFuncArgs;. 
3380: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73   Op *pOp;.  Pars
3390: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
33a0: 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c  Parse;.  int *aL
33b0: 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61  abel = pParse->a
33c0: 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64  Label;.  p->read
33d0: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62  Only = 1;.  p->b
33e0: 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  IsReader = 0;.  
33f0: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
3400: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
3410: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
3420: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
3430: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
3440: 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72   /* NOTE: Be sur
3450: 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70  e to update mkop
3460: 63 6f 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61  codeh.awk when a
3470: 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e  dding or removin
3480: 67 0a 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66  g.    ** cases f
3490: 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21  rom this switch!
34a0: 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20   */.    switch( 
34b0: 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  opcode ){.      
34c0: 63 61 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  case OP_Function
34d0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  :.      case OP_
34e0: 41 67 67 53 74 65 70 3a 20 7b 0a 20 20 20 20 20  AggStep: {.     
34f0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e     if( pOp->p5>n
3500: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
3510: 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20  gs = pOp->p5;.  
3520: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3530: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3540: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20  OP_Transaction: 
3550: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
3560: 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65  p->p2!=0 ) p->re
3570: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
3580: 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75      /* fall thru
3590: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
35a0: 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f    case OP_AutoCo
35b0: 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65  mmit:.      case
35c0: 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b   OP_Savepoint: {
35d0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52  .        p->bIsR
35e0: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
35f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3600: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
3610: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20  _OMIT_WAL.      
3620: 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69  case OP_Checkpoi
3630: 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  nt:.#endif.     
3640: 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a   case OP_Vacuum:
3650: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a  .      case OP_J
3660: 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20  ournalMode: {.  
3670: 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c        p->readOnl
3680: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  y = 0;.        p
3690: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
36a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
36b0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
36c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
36d0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63  UALTABLE.      c
36e0: 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20  ase OP_VUpdate: 
36f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
3700: 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29  p->p2>nMaxArgs )
3710: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
3720: 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65  >p2;.        bre
3730: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3740: 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65    case OP_VFilte
3750: 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r: {.        int
3760: 20 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   n;.        asse
3770: 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e  rt( p->nOp - i >
3780: 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61  = 3 );.        a
3790: 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f  ssert( pOp[-1].o
37a0: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65  pcode==OP_Intege
37b0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d  r );.        n =
37c0: 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20   pOp[-1].p1;.   
37d0: 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41       if( n>nMaxA
37e0: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
37f0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   n;.        brea
3800: 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
3810: 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  f.      case OP_
3820: 4e 65 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65  Next:.      case
3830: 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a   OP_NextIfOpen:.
3840: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f        case OP_So
3850: 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20  rterNext: {.    
3860: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
3870: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
3880: 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  reeNext;.       
3890: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
38a0: 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20  4_ADVANCE;.     
38b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
38c0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
38d0: 50 72 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65  Prev:.      case
38e0: 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20   OP_PrevIfOpen: 
38f0: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  {.        pOp->p
3900: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
3910: 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
3920: 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  s;.        pOp->
3930: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
3940: 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  NCE;.        bre
3950: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3960: 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c  }..    pOp->opfl
3970: 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63  ags = sqlite3Opc
3980: 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f  odeProperty[opco
3990: 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f  de];.    if( (pO
39a0: 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46  p->opflags & OPF
39b0: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70  LG_JUMP)!=0 && p
39c0: 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20  Op->p2<0 ){.    
39d0: 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70    assert( -1-pOp
39e0: 2d 3e 70 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61  ->p2<pParse->nLa
39f0: 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70  bel );.      pOp
3a00: 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31  ->p2 = aLabel[-1
3a10: 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d  -pOp->p2];.    }
3a20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
3a30: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72  Free(p->db, pPar
3a40: 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70  se->aLabel);.  p
3a50: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20  Parse->aLabel = 
3a60: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61  0;.  pParse->nLa
3a70: 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78  bel = 0;.  *pMax
3a80: 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41  FuncArgs = nMaxA
3a90: 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rgs;.  assert( p
3aa0: 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c  ->bIsReader!=0 |
3ab0: 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  | DbMaskAllZero(
3ac0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
3ad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3ae0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
3af0: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
3b00: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72  tion to be inser
3b10: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
3b20: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
3b30: 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61  dr(Vdbe *p){.  a
3b40: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
3b50: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
3b60: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
3b70: 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nOp;.}../*.** Th
3b80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
3b90: 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
3ba0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70   the array of op
3bb0: 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64  codes associated
3bc0: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62   with.** the Vdb
3bd0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
3be0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
3bf0: 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72  It is the caller
3c00: 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  s responsibility
3c10: 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66  .** to arrange f
3c20: 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  or the returned 
3c30: 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e  array to be even
3c40: 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69  tually freed usi
3c50: 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46  ng the .** vdbeF
3c60: 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e  reeOpArray() fun
3c70: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66  ction..**.** Bef
3c80: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a  ore returning, *
3c90: 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74  pnOp is set to t
3ca0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
3cb0: 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75  ries in the retu
3cc0: 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41  rned.** array. A
3cd0: 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69  lso, *pnMaxArg i
3ce0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72  s set to the lar
3cf0: 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65  ger of its curre
3d00: 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a  nt value and .**
3d10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
3d20: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64  ntries in the Vd
3d30: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79  be.apArg[] array
3d40: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65   required to exe
3d50: 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74  cute the .** ret
3d60: 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a  urned program..*
3d70: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
3d80: 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79  3VdbeTakeOpArray
3d90: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
3da0: 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41  nOp, int *pnMaxA
3db0: 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61  rg){.  VdbeOp *a
3dc0: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61  Op = p->aOp;.  a
3dd0: 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70  ssert( aOp && !p
3de0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3df0: 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ed );..  /* Chec
3e00: 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64  k that sqlite3Vd
3e10: 62 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61  beUsesBtree() wa
3e20: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20  s not called on 
3e30: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73  this VM */.  ass
3e40: 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65  ert( DbMaskAllZe
3e50: 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  ro(p->btreeMask)
3e60: 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   );..  resolveP2
3e70: 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41  Values(p, pnMaxA
3e80: 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70  rg);.  *pnOp = p
3e90: 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20  ->nOp;.  p->aOp 
3ea0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f  = 0;.  return aO
3eb0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
3ec0: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
3ed0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
3ee0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
3ef0: 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  k.  Return the.*
3f00: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
3f10: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
3f20: 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73   added..*/.int s
3f30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
3f40: 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ist(Vdbe *p, int
3f50: 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74   nOp, VdbeOpList
3f60: 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74   const *aOp, int
3f70: 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74   iLineno){.  int
3f80: 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28   addr;.  assert(
3f90: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3fa0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3fb0: 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70  if( p->nOp + nOp
3fc0: 20 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f   > p->pParse->nO
3fd0: 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70  pAlloc && growOp
3fe0: 41 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b  Array(p, nOp) ){
3ff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4000: 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e   }.  addr = p->n
4010: 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  Op;.  if( ALWAYS
4020: 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69  (nOp>0) ){.    i
4030: 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70  nt i;.    VdbeOp
4040: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20  List const *pIn 
4050: 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69  = aOp;.    for(i
4060: 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20  =0; i<nOp; i++, 
4070: 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  pIn++){.      in
4080: 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a  t p2 = pIn->p2;.
4090: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
40a0: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ut = &p->aOp[i+a
40b0: 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74  ddr];.      pOut
40c0: 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e  ->opcode = pIn->
40d0: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f  opcode;.      pO
40e0: 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31  ut->p1 = pIn->p1
40f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30  ;.      if( p2<0
4100: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
4110: 72 74 28 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  rt( sqlite3Opcod
4120: 65 50 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e  eProperty[pOut->
4130: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
4140: 4a 55 4d 50 20 29 3b 0a 20 20 20 20 20 20 20 20  JUMP );.        
4150: 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20  pOut->p2 = addr 
4160: 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20  + ADDR(p2);.    
4170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4180: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a   pOut->p2 = p2;.
4190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
41a0: 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33  ut->p3 = pIn->p3
41b0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
41c0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
41d0: 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  D;.      pOut->p
41e0: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  4.p = 0;.      p
41f0: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
4200: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4210: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
4220: 54 53 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  TS.      pOut->z
4230: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e  Comment = 0;.#en
4240: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
4250: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
4260: 20 20 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63        pOut->iSrc
4270: 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69  Line = iLineno+i
4280: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 28 76  ;.#else.      (v
4290: 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e  oid)iLineno;.#en
42a0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
42b0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
42c0: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  ( p->db->flags &
42d0: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f   SQLITE_VdbeAddo
42e0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pTrace ){.      
42f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
4300: 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20  ntOp(0, i+addr, 
4310: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29  &p->aOp[i+addr])
4320: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
4330: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f  .    }.    p->nO
4340: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20  p += nOp;.  }.  
4350: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
4360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4370: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
4380: 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a  CANSTATUS)./*.**
4390: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
43a0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f   the array of co
43b0: 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62  unters managed b
43c0: 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  y sqlite3_stmt_s
43d0: 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  canstatus()..*/.
43e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
43f0: 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64  ScanStatus(.  Vd
4400: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4420: 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73   VM to add scans
4430: 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20  tatus() to */.  
4440: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c  int addrExplain,
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
4470: 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
4480: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f  */.  int addrLoo
4490: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
44a0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
44b0: 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  of loop counter 
44c0: 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69  */ .  int addrVi
44d0: 73 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  sit,            
44e0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
44f0: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
4500: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f   counter */.  Lo
4510: 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20  gEst nEst,      
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4530: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
4540: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
4550: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4560: 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *zName         
4570: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
4580: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
4590: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f  being scanned */
45a0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  .){.  int nByte 
45b0: 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a  = (p->nScan+1) *
45c0: 20 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74   sizeof(ScanStat
45d0: 75 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75  us);.  ScanStatu
45e0: 73 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20  s *aNew;.  aNew 
45f0: 3d 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73  = (ScanStatus*)s
4600: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
4610: 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c  p->db, p->aScan,
4620: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61   nByte);.  if( a
4630: 4e 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53  New ){.    ScanS
4640: 74 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61  tatus *pNew = &a
4650: 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b  New[p->nScan++];
4660: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45  .    pNew->addrE
4670: 78 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70  xplain = addrExp
4680: 6c 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lain;.    pNew->
4690: 61 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c  addrLoop = addrL
46a0: 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  oop;.    pNew->a
46b0: 64 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56  ddrVisit = addrV
46c0: 69 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  isit;.    pNew->
46d0: 6e 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20  nEst = nEst;.   
46e0: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pNew->zName = s
46f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
4700: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
4710: 20 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65    p->aScan = aNe
4720: 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  w;.  }.}.#endif.
4730: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4740: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4750: 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P1 operand for a
4760: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
4770: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
4780: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
4790: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
47a0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
47b0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
47c0: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
47d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
47e0: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
47f0: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
4800: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
4810: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  the program..*/.
4820: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4830: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70  ChangeP1(Vdbe *p
4840: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
4850: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
4860: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
4870: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
4880: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
4890: 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20  ddr].p1 = val;. 
48a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
48b0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
48c0: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66  the P2 operand f
48d0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
48e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
48f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4900: 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67  eful for setting
4910: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
4920: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4930: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
4940: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
4950: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
4960: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4970: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
4980: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
4990: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
49a0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
49b0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
49c0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
49d0: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
49e0: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
49f0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4a00: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
4a10: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
4a20: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
4a30: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
4a40: 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70  if( ((u32)p->nOp
4a50: 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  )>addr ){.    p-
4a60: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20  >aOp[addr].p3 = 
4a70: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
4a80: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
4a90: 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65  ue of the P5 ope
4aa0: 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73  rand for the mos
4ab0: 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64  t recently.** ad
4ac0: 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ded operation..*
4ad0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4ae0: 62 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20  beChangeP5(Vdbe 
4af0: 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61  *p, u8 val){.  a
4b00: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4b10: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
4b20: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
4b30: 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  p>0 );.    p->aO
4b40: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d  p[p->nOp-1].p5 =
4b50: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
4b60: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32  ** Change the P2
4b70: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
4b80: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
4b90: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
4ba0: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
4bb0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
4bc0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
4bd0: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
4be0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
4bf0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
4c00: 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ddr){.  sqlite3V
4c10: 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61  dbeChangeP2(p, a
4c20: 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  ddr, p->nOp);.  
4c30: 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65  p->pParse->iFixe
4c40: 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  dOp = p->nOp - 1
4c50: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ;.}.../*.** If t
4c60: 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66  he input FuncDef
4c70: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70   structure is ep
4c80: 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72  hemeral, then fr
4c90: 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68  ee it.  If.** th
4ca0: 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74  e FuncDef is not
4cb0: 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20   ephermal, then 
4cc0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73  do nothing..*/.s
4cd0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45  tatic void freeE
4ce0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
4cf0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
4d00: 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20  ncDef *pDef){.  
4d10: 69 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29  if( ALWAYS(pDef)
4d20: 20 26 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46   && (pDef->funcF
4d30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
4d40: 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a  NC_EPHEM)!=0 ){.
4d50: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4d60: 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d  e(db, pDef);.  }
4d70: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
4d80: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
4d90: 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c  sqlite3 *, Op *,
4da0: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65   int);../*.** De
4db0: 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20  lete a P4 value 
4dc0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
4dd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
4de0: 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  eP4(sqlite3 *db,
4df0: 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69   int p4type, voi
4e00: 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34  d *p4){.  if( p4
4e10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4e20: 64 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68  db );.    switch
4e30: 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ( p4type ){.    
4e40: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a    case P4_REAL:.
4e50: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
4e60: 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20  T64:.      case 
4e70: 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20  P4_DYNAMIC:.    
4e80: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
4e90: 41 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  AY: {.        sq
4ea0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4eb0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4ec0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4ed0: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
4ee0: 4f 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  O: {.        if(
4ef0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4f00: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65  d==0 ) sqlite3Ke
4f10: 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49  yInfoUnref((KeyI
4f20: 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  nfo*)p4);.      
4f30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4f40: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
4f50: 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20  PRINTF: {.      
4f60: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
4f70: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
4f80: 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20  te3_free(p4);.  
4f90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4fa0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4fb0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
4fc0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
4fd0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
4fe0: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
4ff0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5000: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5010: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
5020: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
5030: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
5040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5050: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
5060: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
5070: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5080: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
5090: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
50a0: 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c      if( p->szMal
50b0: 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46  loc ) sqlite3DbF
50c0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
50d0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  oc);.          s
50e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
50f0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
5100: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5110: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5120: 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20   P4_VTAB : {.   
5130: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
5140: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
5150: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
5160: 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a  ((VTable *)p4);.
5170: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5180: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
51a0: 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
51b0: 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61  ed for aOp and a
51c0: 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c  ny p4 values all
51d0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a  ocated for the.*
51e0: 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69  * opcodes contai
51f0: 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61  ned within. If a
5200: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69  Op is not NULL i
5210: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
5220: 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20  contain .** nOp 
5230: 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61  entries. .*/.sta
5240: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
5250: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
5260: 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69   *db, Op *aOp, i
5270: 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61  nt nOp){.  if( a
5280: 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  Op ){.    Op *pO
5290: 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61  p;.    for(pOp=a
52a0: 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70  Op; pOp<&aOp[nOp
52b0: 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  ]; pOp++){.     
52c0: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
52d0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
52e0: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  .p);.#ifdef SQLI
52f0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
5300: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
5310: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5320: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
5330: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
5340: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
5350: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70  e3DbFree(db, aOp
5360: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b  );.}../*.** Link
5370: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20   the SubProgram 
5380: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
5390: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
53a0: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ment into the li
53b0: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20  nked.** list at 
53c0: 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d  Vdbe.pSubProgram
53d0: 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75  . This list is u
53e0: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c  sed to delete al
53f0: 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a  l sub-program.**
5400: 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68   objects when th
5410: 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e VM is no longe
5420: 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76  r required..*/.v
5430: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
5440: 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64  inkSubProgram(Vd
5450: 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72  be *pVdbe, SubPr
5460: 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e  ogram *p){.  p->
5470: 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70  pNext = pVdbe->p
5480: 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65  Program;.  pVdbe
5490: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a  ->pProgram = p;.
54a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
54b0: 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64  the opcode at ad
54c0: 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a  dr into OP_Noop.
54d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
54e0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
54f0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
5500: 72 29 7b 0a 20 20 69 66 28 20 61 64 64 72 3c 70  r){.  if( addr<p
5510: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->nOp ){.    Vdb
5520: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
5530: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
5540: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
5550: 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62  b;.    freeP4(db
5560: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
5570: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d  Op->p4.p);.    m
5580: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69  emset(pOp, 0, si
5590: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20  zeof(pOp[0]));. 
55a0: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
55b0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66   OP_Noop;.    if
55c0: 28 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31  ( addr==p->nOp-1
55d0: 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d   ) p->nOp--;.  }
55e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
55f0: 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20   last opcode is 
5600: 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e  "op" and it is n
5610: 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ot a jump destin
5620: 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72  ation,.** then r
5630: 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72  emove it.  Retur
5640: 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e  n true if and on
5650: 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20  ly if an opcode 
5660: 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  was removed..*/.
5670: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 44  int sqlite3VdbeD
5680: 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65  eletePriorOpcode
5690: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29  (Vdbe *p, u8 op)
56a0: 7b 0a 20 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d  {.  if( (p->nOp-
56b0: 31 29 3e 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69  1)>(p->pParse->i
56c0: 46 69 78 65 64 4f 70 29 20 26 26 20 70 2d 3e 61  FixedOp) && p->a
56d0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63  Op[p->nOp-1].opc
56e0: 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73  ode==op ){.    s
56f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5700: 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70  ToNoop(p, p->nOp
5710: 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  -1);.    return 
5720: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
5730: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
5740: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5750: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
5760: 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  4 operand for a 
5770: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
5780: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
5790: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
57a0: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
57b0: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
57c0: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
57d0: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
57e0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
57f0: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
5800: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
5810: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
5820: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  he program..**.*
5830: 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74  * If n>=0 then t
5840: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73  he P4 operand is
5850: 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e   dynamic, meanin
5860: 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66  g that a copy of
5870: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
5880: 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f  s made into memo
5890: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
58a0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
58b0: 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66  )..** A value of
58c0: 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79   n==0 means copy
58d0: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70   bytes of zP4 up
58e0: 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e   to and includin
58f0: 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e  g the.** first n
5900: 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e  ull byte.  If n>
5910: 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20  0 then copy n+1 
5920: 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a  bytes of zP4..**
5930: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
5940: 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49  s of n (P4_STATI
5950: 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P4_COLLSEQ et
5960: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
5970: 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP4 points.** 
5980: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
5990: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
59a0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
59b0: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
59c0: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
59d0: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
59e0: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
59f0: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
5a00: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
5a10: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
5a20: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
5a30: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
5a40: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
5a50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5a60: 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70  ChangeP4(Vdbe *p
5a70: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
5a80: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74  t char *zP4, int
5a90: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
5aa0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
5ab0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
5ac0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
5ad0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
5ae0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
5af0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  IT );.  if( p->a
5b00: 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op==0 || db->mal
5b10: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
5b20: 20 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20   if( n!=P4_VTAB 
5b30: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28  ){.      freeP4(
5b40: 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28  db, n, (void*)*(
5b50: 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20  char**)&zP4);.  
5b60: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a    }.    return;.
5b70: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
5b80: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
5b90: 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20  rt( addr<p->nOp 
5ba0: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
5bb0: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
5bc0: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
5bd0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
5be0: 64 72 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dr];.  assert( p
5bf0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e  Op->p4type==P4_N
5c00: 4f 54 55 53 45 44 0a 20 20 20 20 20 20 20 7c 7c  OTUSED.       ||
5c10: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
5c20: 5f 49 4e 54 33 32 0a 20 20 20 20 20 20 20 7c 7c  _INT32.       ||
5c30: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
5c40: 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72  _KEYINFO );.  fr
5c50: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
5c60: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
5c70: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
5c80: 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49  0;.  if( n==P4_I
5c90: 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  NT32 ){.    /* N
5ca0: 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69  ote: this cast i
5cb0: 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20  s safe, because 
5cc0: 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20  the origin data 
5cd0: 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74  point was an int
5ce0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73  .    ** that was
5cf0: 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73   cast to a (cons
5d00: 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20  t char *). */.  
5d10: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51    pOp->p4.i = SQ
5d20: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
5d30: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
5d40: 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32  4type = P4_INT32
5d50: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50  ;.  }else if( zP
5d60: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d  4==0 ){.    pOp-
5d70: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
5d80: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5d90: 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65  NOTUSED;.  }else
5da0: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
5db0: 46 4f 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  FO ){.    pOp->p
5dc0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
5dd0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5de0: 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a  e = P4_KEYINFO;.
5df0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50    }else if( n==P
5e00: 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f  4_VTAB ){.    pO
5e10: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
5e20: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5e30: 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b  4type = P4_VTAB;
5e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
5e50: 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a  Lock((VTable *)z
5e60: 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  P4);.    assert(
5e70: 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29   ((VTable *)zP4)
5e80: 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20  ->db==p->db );. 
5e90: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29   }else if( n<0 )
5ea0: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5eb0: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
5ec0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5ed0: 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a  (signed char)n;.
5ee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
5ef0: 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69   n==0 ) n = sqli
5f00: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29  te3Strlen30(zP4)
5f10: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ;.    pOp->p4.z 
5f20: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
5f30: 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e  up(p->db, zP4, n
5f40: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
5f50: 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b  pe = P4_DYNAMIC;
5f60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
5f70: 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20  t the P4 on the 
5f80: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
5f90: 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  ded opcode to th
5fa0: 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68  e KeyInfo for th
5fb0: 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e  e.** index given
5fc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5fd0: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
5fe0: 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
5ff0: 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20   Index *pIdx){. 
6000: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
6010: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
6020: 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73  rt( v!=0 );.  as
6030: 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
6040: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
6050: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
6060: 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
6070: 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
6080: 65 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20  e, pIdx),.      
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a  P4_KEYINFO);.}..
60b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
60c0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
60d0: 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  MENTS./*.** Chan
60e0: 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ge the comment o
60f0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
6100: 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  tly coded instru
6110: 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e  ction.  Or.** in
6120: 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64  sert a No-op and
6130: 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74   add the comment
6140: 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73   to that new ins
6150: 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a  truction.  This.
6160: 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64  ** makes the cod
6170: 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64  e easier to read
6180: 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e   during debuggin
6190: 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73  g.  None of this
61a0: 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61   happens.** in a
61b0: 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c   production buil
61c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
61d0: 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56  d vdbeVComment(V
61e0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
61f0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f  ar *zFormat, va_
6200: 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65  list ap){.  asse
6210: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20  rt( p->nOp>0 || 
6220: 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61  p->aOp==0 );.  a
6230: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30  ssert( p->aOp==0
6240: 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   || p->aOp[p->nO
6250: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30  p-1].zComment==0
6260: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
6270: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
6280: 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61   p->nOp ){.    a
6290: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b  ssert( p->aOp );
62a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
62b0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70  ee(p->db, p->aOp
62c0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
62d0: 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  ent);.    p->aOp
62e0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
62f0: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  ent = sqlite3VMP
6300: 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f  rintf(p->db, zFo
6310: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d  rmat, ap);.  }.}
6320: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6330: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  eComment(Vdbe *p
6340: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
6350: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
6360: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
6370: 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61   p ){.    va_sta
6380: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
6390: 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e  .    vdbeVCommen
63a0: 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  t(p, zFormat, ap
63b0: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
63c0: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
63d0: 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d  lite3VdbeNoopCom
63e0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
63f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
6400: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
6410: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
6420: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6430: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f  eAddOp0(p, OP_No
6440: 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  op);.    va_star
6450: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
6460: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
6470: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
6480: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
6490: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20  ;.  }.}.#endif  
64a0: 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  /* NDEBUG */..#i
64b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
64c0: 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20  _COVERAGE./*.** 
64d0: 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66  Set the value if
64e0: 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69   the iSrcLine fi
64f0: 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76  eld for the prev
6500: 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73  iously coded ins
6510: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
6520: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
6530: 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20  LineNumber(Vdbe 
6540: 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a  *v, int iLine){.
6550: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
6560: 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69  Op(v,-1)->iSrcLi
6570: 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65  ne = iLine;.}.#e
6580: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56  ndif /* SQLITE_V
6590: 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a  DBE_COVERAGE */.
65a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
65b0: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67  e opcode for a g
65c0: 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49  iven address.  I
65d0: 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73  f the address is
65e0: 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74   -1, then.** ret
65f0: 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
6600: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f  ently inserted o
6610: 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pcode..**.** If 
6620: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
6630: 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63  ion error has oc
6640: 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20  curred prior to 
6650: 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74  the calling of t
6660: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20  his.** routine, 
6670: 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
6680: 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70  o a dummy VdbeOp
6690: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
66a0: 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a  d.  That opcode.
66b0: 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62  ** is readable b
66c0: 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c  ut not writable,
66d0: 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61   though it is ca
66e0: 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65  st to a writable
66f0: 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72   value..** The r
6700: 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79  eturn of a dummy
6710: 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74   opcode allows t
6720: 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69  he call to conti
6730: 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a  nue functioning.
6740: 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20  ** after an OOM 
6750: 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61  fault without ha
6760: 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f  ving to check to
6770: 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75   see if the retu
6780: 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73  rn from .** this
6790: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61   routine is a va
67a0: 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75  lid pointer.  Bu
67b0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75  t because the du
67c0: 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c  mmy.opcode is 0,
67d0: 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e  .** dummy will n
67e0: 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20  ever be written 
67f0: 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72  to.  This is ver
6800: 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ified by code in
6810: 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  spection and.** 
6820: 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20  by running with 
6830: 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62  Valgrind..*/.Vdb
6840: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
6850: 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  GetOp(Vdbe *p, i
6860: 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43  nt addr){.  /* C
6870: 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61  89 specifies tha
6880: 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22  t the constant "
6890: 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69  dummy" will be i
68a0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
68b0: 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68  l.  ** zeros, wh
68c0: 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20  ich is correct. 
68d0: 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20   MSVC generates 
68e0: 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72  a warning, never
68f0: 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74  theless. */.  st
6900: 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d  atic VdbeOp dumm
6910: 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  y;  /* Ignore th
6920: 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61  e MSVC warning a
6930: 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69  bout no initiali
6940: 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  zer */.  assert(
6950: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
6960: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
6970: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
6980: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
6990: 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  - 1;.  }.  asser
69a0: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
69b0: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
69c0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
69d0: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  ed );.  if( p->d
69e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
69f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56  ){.    return (V
6a00: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20  dbeOp*)&dummy;. 
6a10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6a20: 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  rn &p->aOp[addr]
6a30: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66  ;.  }.}..#if def
6a40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
6a50: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
6a60: 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  NTS)./*.** Retur
6a70: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c  n an integer val
6a80: 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ue for one of th
6a90: 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  e parameters to 
6aa0: 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a  the opcode pOp.*
6ab0: 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
6ac0: 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a  character c..*/.
6ad0: 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73  static int trans
6ae0: 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f  lateP(char c, co
6af0: 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  nst Op *pOp){.  
6b00: 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74  if( c=='1' ) ret
6b10: 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69  urn pOp->p1;.  i
6b20: 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75  f( c=='2' ) retu
6b30: 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66  rn pOp->p2;.  if
6b40: 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72  ( c=='3' ) retur
6b50: 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28  n pOp->p3;.  if(
6b60: 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e   c=='4' ) return
6b70: 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65   pOp->p4.i;.  re
6b80: 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a  turn pOp->p5;.}.
6b90: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
6ba0: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
6bb0: 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20  "comment" field 
6bc0: 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65  of a VDBE opcode
6bd0: 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   listing..**.** 
6be0: 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69  The Synopsis: fi
6bf0: 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20  eld in comments 
6c00: 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f  in the vdbe.c so
6c10: 75 72 63 65 20 66 69 6c 65 20 67 65 74 73 20 63  urce file gets c
6c20: 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61  onverted.** to a
6c30: 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67 20 74  n extra string t
6c40: 68 61 74 20 69 73 20 61 70 70 65 6e 64 65 64 20  hat is appended 
6c50: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70  to the sqlite3Op
6c60: 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20  codeName().  In 
6c70: 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f  the.** absence o
6c80: 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73  f other comments
6c90: 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20  , this synopsis 
6ca0: 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d  becomes the comm
6cb0: 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64  ent on the opcod
6cc0: 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73  e..** Some trans
6cd0: 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a  lation occurs:.*
6ce0: 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20  *.**       "PX" 
6cf0: 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a       ->  "r[X]".
6d00: 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 22  **       "PX@PY"
6d10: 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59     ->  "r[X..X+Y
6d20: 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20  -1]"  or "r[x]" 
6d30: 69 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a  if y is 0 or 1.*
6d40: 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 2b 31  *       "PX@PY+1
6d50: 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d  " ->  "r[X..X+Y]
6d60: 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69  "    or "r[x]" i
6d70: 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20  f y is 0.**     
6d80: 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20    "PY..PY"  ->  
6d90: 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f  "r[X..Y]"      o
6da0: 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78  r "r[x]" if y<=x
6db0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
6dc0: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20  isplayComment(. 
6dd0: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20   const Op *pOp, 
6de0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
6df0: 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65  e to be commente
6e00: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
6e10: 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65  r *zP4,   /* Pre
6e20: 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64  viously obtained
6e30: 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f   value for P4 */
6e40: 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  .  char *zTemp, 
6e50: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
6e60: 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20  esult here */.  
6e70: 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20  int nTemp       
6e80: 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69     /* Space avai
6e90: 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d  lable in zTemp[]
6ea0: 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
6eb0: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20  har *zOpName;.  
6ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e  const char *zSyn
6ed0: 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70  opsis;.  int nOp
6ee0: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20  Name;.  int ii, 
6ef0: 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  jj;.  zOpName = 
6f00: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
6f10: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a  e(pOp->opcode);.
6f20: 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    nOpName = sqli
6f30: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e  te3Strlen30(zOpN
6f40: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e  ame);.  if( zOpN
6f50: 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29  ame[nOpName+1] )
6f60: 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f  {.    int seenCo
6f70: 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  m = 0;.    char 
6f80: 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73  c;.    zSynopsis
6f90: 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f   = zOpName += nO
6fa0: 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66  pName + 1;.    f
6fb0: 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e  or(ii=jj=0; jj<n
6fc0: 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a  Temp-1 && (c = z
6fd0: 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30  Synopsis[ii])!=0
6fe0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
6ff0: 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20  f( c=='P' ){.   
7000: 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73       c = zSynops
7010: 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20  is[++ii];.      
7020: 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a    if( c=='4' ){.
7030: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7040: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7050: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
7060: 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20  %s", zP4);.     
7070: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
7080: 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'X' ){.         
7090: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
70a0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
70b0: 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  p+jj, "%s", pOp-
70c0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
70d0: 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20        seenCom = 
70e0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
70f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
7100: 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28  v1 = translateP(
7110: 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  c, pOp);.       
7120: 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20     int v2;.     
7130: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7140: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7150: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20  zTemp+jj, "%d", 
7160: 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  v1);.          i
7170: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
7180: 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c  psis+ii+1, "@P",
7190: 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   2)==0 ){.      
71a0: 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20        ii += 3;. 
71b0: 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d             jj +=
71c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
71d0: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
71e0: 20 20 20 20 20 20 20 20 76 32 20 3d 20 74 72 61          v2 = tra
71f0: 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69  nslateP(zSynopsi
7200: 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20  s[ii], pOp);.   
7210: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
7220: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
7230: 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29  i+1,"+1",2)==0 )
7240: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7250: 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20  ii += 2;.       
7260: 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20         v2++;.   
7270: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7280: 20 20 20 20 20 20 20 69 66 28 20 76 32 3e 31 20         if( v2>1 
7290: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
72a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
72b0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
72c0: 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31  p+jj, "..%d", v1
72d0: 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  +v2-1);.        
72e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
72f0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
7300: 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31  p(zSynopsis+ii+1
7310: 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20  , "..P3", 4)==0 
7320: 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b  && pOp->p3==0 ){
7330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20  .            ii 
7340: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  += 4;.          
7350: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7360: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
7370: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
7380: 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  jj);.      }else
7390: 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  {.        zTemp[
73a0: 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20  jj++] = c;.     
73b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
73c0: 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c   !seenCom && jj<
73d0: 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e  nTemp-5 && pOp->
73e0: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
73f0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7400: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
7410: 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70  mp+jj, "; %s", p
7420: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
7430: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
7440: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
7450: 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  +jj);.    }.    
7460: 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a  if( jj<nTemp ) z
7470: 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20  Temp[jj] = 0;.  
7480: 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a  }else if( pOp->z
7490: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  Comment ){.    s
74a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
74b0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
74c0: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
74d0: 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c  t);.    jj = sql
74e0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
74f0: 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  mp);.  }else{.  
7500: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
7510: 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a      jj = 0;.  }.
7520: 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23    return jj;.}.#
7530: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7540: 44 45 42 55 47 20 2a 2f 0a 0a 0a 23 69 66 20 21  DEBUG */...#if !
7550: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7560: 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20  MIT_EXPLAIN) || 
7570: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
7580: 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e   \.     || defin
7590: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
75a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
75b0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
75c0: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
75d0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
75e0: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
75f0: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
7600: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
7610: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
7620: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
7630: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
7640: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
7650: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
7660: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
7670: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
7680: 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28  zTemp;.  assert(
7690: 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20   nTemp>=20 );.  
76a0: 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74  switch( pOp->p4t
76b0: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
76c0: 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20  P4_KEYINFO: {.  
76d0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
76e0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
76f0: 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e  yInfo = pOp->p4.
7700: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pKeyInfo;.      
7710: 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
7720: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
7730: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7740: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7750: 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64 22 2c 20   zTemp, "k(%d", 
7760: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
7770: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c  );.      i = sql
7780: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
7790: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
77a0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
77b0: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
77c0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
77d0: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
77e0: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
77f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7800: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  Coll = pColl ? p
7810: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e  Coll->zName : "n
7820: 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  il";.        int
7830: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
7840: 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20  en30(zColl);.   
7850: 20 20 20 20 20 69 66 28 20 6e 3d 3d 36 20 26 26       if( n==6 &&
7860: 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42   memcmp(zColl,"B
7870: 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20 29 7b 0a  INARY",6)==0 ){.
7880: 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20            zColl 
7890: 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20 20  = "B";.         
78a0: 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20   n = 1;.        
78b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 2b  }.        if( i+
78c0: 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20  n>nTemp-6 ){.   
78d0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
78e0: 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34  Temp[i],",...",4
78f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
7900: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
7910: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
7920: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
7930: 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
7940: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20  ortOrder[j] ){. 
7950: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
7960: 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20  ++] = '-';.     
7970: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
7980: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a  cpy(&zTemp[i], z
7990: 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20 20 20  Coll, n+1);.    
79a0: 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20      i += n;.    
79b0: 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b    }.      zTemp[
79c0: 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  i++] = ')';.    
79d0: 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a    zTemp[i] = 0;.
79e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
79f0: 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62  nTemp );.      b
7a00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7a10: 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a  case P4_COLLSEQ:
7a20: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
7a30: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70   *pColl = pOp->p
7a40: 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  4.pColl;.      s
7a50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7a60: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28  nTemp, zTemp, "(
7a70: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
7a80: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
7a90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7aa0: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
7ab0: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
7ac0: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
7ad0: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
7ae0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7af0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28  emp, zTemp, "%s(
7b00: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
7b10: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
7b20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7b30: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
7b40: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT64: {.      sq
7b50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7b60: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
7b70: 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  ld", *pOp->p4.pI
7b80: 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  64);.      break
7b90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7ba0: 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20   P4_INT32: {.   
7bb0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7bc0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7bd0: 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%d", pOp->p4.
7be0: 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  i);.      break;
7bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7c00: 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20  P4_REAL: {.     
7c10: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7c20: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7c30: 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70  "%.16g", *pOp->p
7c40: 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20  4.pReal);.      
7c50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7c60: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
7c70: 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
7c80: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a  = pOp->p4.pMem;.
7c90: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
7ca0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
7cb0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
7cc0: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
7cd0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
7ce0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
7cf0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7d00: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7d10: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
7d20: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
7d30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
7d40: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7d50: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
7d60: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7d70: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7d80: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e  %.16g", pMem->u.
7d90: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
7da0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
7db0: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
7dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7dd0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7de0: 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  emp, "NULL");.  
7df0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7e00: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
7e10: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
7e20: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
7e30: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
7e40: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7e50: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
7e60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7e70: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
7e80: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
7e90: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
7ea0: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
7eb0: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
7ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7ed0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7ee0: 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22  mp, "vtab:%p:%p"
7ef0: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e  , pVtab, pVtab->
7f00: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20  pModule);.      
7f10: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
7f20: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
7f30: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
7f40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7f50: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7f60: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20   "intarray");.  
7f70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7f80: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
7f90: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
7fa0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7fb0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7fc0: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
7fd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7fe0: 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e     case P4_ADVAN
7ff0: 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d  CE: {.      zTem
8000: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
8010: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8020: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
8030: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
8040: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
8050: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
8060: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
8070: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
8080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8090: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
80a0: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
80b0: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
80c0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
80d0: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
80e0: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
80f0: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
8100: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
8110: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
8120: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
8130: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
8140: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
8150: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
8160: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
8170: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
8180: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
8190: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
81a0: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
81b0: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
81c0: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
81d0: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
81e0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
81f0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
8200: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
8210: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
8220: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
8230: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
8240: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
8250: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
8260: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
8270: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
8280: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
8290: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
82a0: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62  eMask)*8 );.  Db
82b0: 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65  MaskSet(p->btree
82c0: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20  Mask, i);.  if( 
82d0: 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42  i!=1 && sqlite3B
82e0: 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e  treeSharable(p->
82f0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
8300: 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
8310: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29  (p->lockMask, i)
8320: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
8330: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8340: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
8350: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
8360: 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20  SAFE>0./*.** If 
8370: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
8380: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68  ed to support sh
8390: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
83a0: 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  and to be thread
83b0: 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  safe,.** this ro
83c0: 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68  utine obtains th
83d0: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
83e0: 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53  ed with each BtS
83f0: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a  hared structure.
8400: 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61  ** that may be a
8410: 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56  ccessed by the V
8420: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
8430: 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e  rgument. In doin
8440: 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20  g so it also.** 
8450: 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65  sets the BtShare
8460: 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65  d.db member of e
8470: 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61  ach of the BtSha
8480: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20  red structures, 
8490: 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74  ensuring.** that
84a0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73   the correct bus
84b0: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
84c0: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66  ck is invoked if
84d0: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
84e0: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
84f0: 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74  t threadsafe but
8500: 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68   does support sh
8510: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
8520: 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33   then.** sqlite3
8530: 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20  BtreeEnter() is 
8540: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
8550: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
8560: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
8570: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
8580: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
8590: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
85a0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
85b0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
85c0: 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49   the VM..**.** I
85d0: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
85e0: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
85f0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
8600: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
8610: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
8620: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
8630: 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72  **.** The p->btr
8640: 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20  eeMask field is 
8650: 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c  a bitmask of all
8660: 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65   btrees that the
8670: 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74   prepared .** st
8680: 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65  atement p will e
8690: 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20  ver use.  Let N 
86a0: 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
86b0: 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65   bits in p->btre
86c0: 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  eMask.** corresp
86d0: 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73  onding to btrees
86e0: 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
86f0: 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68   cache.  Then th
8700: 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20  e runtime of.** 
8710: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8720: 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69  N*N.  But as N i
8730: 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68  s rarely more th
8740: 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c  an 1, this shoul
8750: 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72  d not.** be a pr
8760: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
8770: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
8780: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
8790: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
87a0: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
87b0: 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62  nt nDb;.  if( Db
87c0: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
87d0: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
87e0: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
87f0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
8800: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
8810: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
8820: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
8830: 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29  i=0; i<nDb; i++)
8840: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
8850: 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  & DbMaskTest(p->
8860: 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41  lockMask,i) && A
8870: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
8880: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
8890: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
88a0: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
88b0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
88c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
88d0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
88e0: 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54  _CACHE) && SQLIT
88f0: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f  E_THREADSAFE>0./
8900: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20  *.** Unlock all 
8910: 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72  of the btrees pr
8920: 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20  eviously locked 
8930: 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  by a call to sql
8940: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e  ite3VdbeEnter().
8950: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8960: 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  VdbeLeave(Vdbe *
8970: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
8980: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
8990: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
89a0: 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  ;.  if( DbMaskAl
89b0: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
89c0: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
89d0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
89e0: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
89f0: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
8a00: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
8a10: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
8a20: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
8a30: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
8a40: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
8a50: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
8a60: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
8a70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
8a80: 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d  treeLeave(aDb[i]
8a90: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
8aa0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
8ab0: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
8ac0: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
8ad0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
8ae0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
8af0: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
8b00: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
8b10: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
8b20: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
8b30: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
8b40: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
8b50: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
8b60: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61  char *zP4;.  cha
8b70: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68  r zPtr[50];.  ch
8b80: 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20  ar zCom[100];.  
8b90: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
8ba0: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
8bb0: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
8bc0: 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20   %4d %-13s %.2X 
8bd0: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
8be0: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
8bf0: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
8c00: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
8c10: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
8c20: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8c30: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
8c40: 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61  OMMENTS.  displa
8c50: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
8c60: 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28  4, zCom, sizeof(
8c70: 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20  zCom));.#else.  
8c80: 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e  zCom[0] = 0;.#en
8c90: 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68  dif.  /* NB:  Th
8ca0: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
8cb0: 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ame() function i
8cc0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
8cd0: 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20   code created.  
8ce0: 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f  ** by the mkopco
8cf0: 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70  deh.awk and mkop
8d00: 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74  codec.awk script
8d10: 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20  s which extract 
8d20: 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  the.  ** informa
8d30: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64  tion from the vd
8d40: 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74  be.c source text
8d50: 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f   */.  fprintf(pO
8d60: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
8d70: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
8d80: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
8d90: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
8da0: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
8db0: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
8dc0: 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29  ,.      zCom.  )
8dd0: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
8de0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
8df0: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
8e00: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
8e10: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
8e20: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
8e30: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
8e40: 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e  N){.  if( p && N
8e50: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e   ){.    Mem *pEn
8e60: 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73  d = &p[N];.    s
8e70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
8e80: 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f  db;.    u8 mallo
8e90: 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d  c_failed = db->m
8ea0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
8eb0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
8ec0: 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64  Freed ){.      d
8ed0: 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
8ee0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  ->szMalloc ) sql
8ef0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8f00: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
8f10: 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c    }while( (++p)<
8f20: 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65  pEnd );.      re
8f30: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
8f40: 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  do{.      assert
8f50: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
8f60: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
8f70: 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73  .db );.      ass
8f80: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
8f90: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
8fa0: 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20  ts(p) );..      
8fb0: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73  /* This block is
8fc0: 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e   really an inlin
8fd0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
8fe0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
8ff0: 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74  ase().      ** t
9000: 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74  hat takes advant
9010: 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20  age of the fact 
9020: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
9030: 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20  cell value is . 
9040: 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65       ** being se
9050: 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20  t to NULL after 
9060: 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79  releasing any dy
9070: 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e  namic resources.
9080: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
9090: 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61  ** The justifica
90a0: 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
90b0: 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61  ting code is tha
90c0: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a  t according to .
90d0: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69        ** callgri
90e0: 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20  nd, this causes 
90f0: 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63  a certain test c
9100: 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43  ase to hit the C
9110: 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a  PU 4.7 .      **
9120: 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78   percent less (x
9130: 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65  86 linux, gcc ve
9140: 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36  rsion 4.1.2, -O6
9150: 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20  ) than if .     
9160: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65   ** sqlite3MemRe
9170: 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c  lease() were cal
9180: 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57  led from here. W
9190: 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75  ith -O2, this ju
91a0: 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  mps.      ** to 
91b0: 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65  6.6 percent. The
91c0: 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e   test case is in
91d0: 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77  serting 1000 row
91e0: 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a  s into a table .
91f0: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f        ** with no
9200: 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61   indexes using a
9210: 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64   single prepared
9220: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
9230: 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20  t, bind() .     
9240: 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e   ** and reset().
9250: 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f   Inserts are gro
9260: 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e  uped into a tran
9270: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
9280: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
9290: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
92a0: 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65  _Agg );.      te
92b0: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
92c0: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20   & MEM_Dyn );.  
92d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
92e0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61  >flags & MEM_Fra
92f0: 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  me );.      test
9300: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
9310: 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20   MEM_RowSet );. 
9320: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67       if( p->flag
9330: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44  s&(MEM_Agg|MEM_D
9340: 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d  yn|MEM_Frame|MEM
9350: 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20  _RowSet) ){.    
9360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
9370: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
9380: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
9390: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  >szMalloc ){.   
93a0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
93b0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
93c0: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  c);.        p->s
93d0: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
93e0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
93f0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
9400: 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ined;.    }while
9410: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
9420: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
9430: 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61  iled = malloc_fa
9440: 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iled;.  }.}../*.
9450: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
9460: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
9470: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
9480: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
9490: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
94a0: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
94b0: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
94c0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
94d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
94e0: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
94f0: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
9500: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
9510: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
9520: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
9530: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
9540: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
9550: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
9560: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
9570: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b  ->nChildCsr; i++
9580: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
9590: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
95a0: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  v, apCsr[i]);.  
95b0: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
95c0: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68  ray(aMem, p->nCh
95d0: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ildMem);.  sqlit
95e0: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
95f0: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
9600: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
9610: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
9620: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
9630: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
9640: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
9650: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
9660: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
9670: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
9680: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
9690: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
96a0: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
96b0: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
96c0: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
96d0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
96e0: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
96f0: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
9700: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
9710: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
9720: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
9730: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
9740: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
9750: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
9760: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
9770: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
9780: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
9790: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
97a0: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
97b0: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
97c0: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
97d0: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
97e0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
97f0: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
9800: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
9810: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
9820: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
9830: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
9840: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
9850: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
9860: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
9870: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
9880: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98a0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
98b0: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
98e0: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
98f0: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
9900: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9930: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
9940: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
9950: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
9960: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9970: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
9980: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
9990: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
99c0: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
99d0: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
99e0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
99f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a00: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
9a10: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9a20: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
9a50: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
9a60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
9a90: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
9aa0: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20   &p->aMem[1];   
9ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
9ac0: 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74  st Mem of result
9ad0: 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72   set */..  asser
9ae0: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
9af0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
9b00: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
9b10: 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RUN );.  assert(
9b20: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
9b30: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
9b40: 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63  TE_BUSY || p->rc
9b50: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
9b60: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
9b70: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
9b80: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e  does not use dyn
9b90: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72  amic strings for
9ba0: 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  .  ** the result
9bb0: 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  , result columns
9bc0: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61   may become dyna
9bd0: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20  mic if the user 
9be0: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74  calls.  ** sqlit
9bf0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
9c00: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72  (), causing a tr
9c10: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46  anslation to UTF
9c20: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20  -16 encoding..  
9c30: 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  */.  releaseMemA
9c40: 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20  rray(pMem, 8);. 
9c50: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
9c60: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
9c70: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
9c80: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
9c90: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
9ca0: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
9cb0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
9cc0: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
9cd0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
9ce0: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
9cf0: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d  led.  */.    db-
9d00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
9d10: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
9d20: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
9d30: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
9d40: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
9d50: 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f  rows reaches nRo
9d60: 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  w, that means th
9d70: 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68  e.  ** listing h
9d80: 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  as finished and 
9d90: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73  sqlite3_step() s
9da0: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c  hould return SQL
9db0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e  ITE_DONE..  ** n
9dc0: 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f  Row is the sum o
9dd0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
9de0: 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
9df0: 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20   program, plus. 
9e00: 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74   ** the sum of t
9e10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
9e20: 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72  s in all trigger
9e30: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63   subprograms enc
9e40: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f  ountered.  ** so
9e50: 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20   far.  The nRow 
9e60: 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65  value will incre
9e70: 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67  ase as new trigg
9e80: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
9e90: 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65  re.  ** encounte
9ea0: 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77  red, but p->pc w
9eb0: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
9ec0: 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e  atch up to nRow.
9ed0: 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70  .  */.  nRow = p
9ee0: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e  ->nOp;.  if( p->
9ef0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
9f00: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38    /* The first 8
9f10: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72   memory cells ar
9f20: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
9f30: 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77  esult set.  So w
9f40: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  e will.    ** co
9f50: 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68  mmandeer the 9th
9f60: 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20   cell to use as 
9f70: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61  storage for an a
9f80: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
9f90: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67  .    ** to trigg
9fa0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  er subprograms. 
9fb0: 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61   The VDBE is gua
9fc0: 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20  ranteed to have 
9fd0: 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a  at least 9.    *
9fe0: 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20  * cells.  */.   
9ff0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d   assert( p->nMem
a000: 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d  >9 );.    pSub =
a010: 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20   &p->aMem[9];.  
a020: 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67    if( pSub->flag
a030: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  s&MEM_Blob ){.  
a040: 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69      /* On the fi
a050: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
a060: 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62  te3_step(), pSub
a070: 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c   will hold a NUL
a080: 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20  L.  It is.      
a090: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ** initialized t
a0a0: 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20  o a BLOB by the 
a0b0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72  P4_SUBPROGRAM pr
a0c0: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62  ocessing logic b
a0d0: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53  elow */.      nS
a0e0: 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a  ub = pSub->n/siz
a0f0: 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20  eof(Vdbe*);.    
a100: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
a110: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
a120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
a130: 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b  i=0; i<nSub; i++
a140: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  ){.      nRow +=
a150: 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a   apSub[i]->nOp;.
a160: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b      }.  }..  do{
a170: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
a180: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52  ;.  }while( i<nR
a190: 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  ow && p->explain
a1a0: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
a1b0: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
a1c0: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
a1d0: 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72  nRow ){.    p->r
a1e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a1f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
a200: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
a210: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
a220: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
a230: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
a240: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
a250: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
a260: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
a270: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
a280: 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
a290: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
a2a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
a2b0: 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20  ar *zP4;.    Op 
a2c0: 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c  *pOp;.    if( i<
a2d0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
a2e0: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
a2f0: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
a300: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
a310: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
a320: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
a330: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
a340: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
a350: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
a360: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
a370: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
a380: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
a390: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
a3a0: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
a3b0: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
a3c0: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
a3d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
a3e0: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
a3f0: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
a400: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
a410: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
a420: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
a430: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
a440: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
a450: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
a460: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
a470: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
a480: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a490: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
a4a0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20   pMem->u.i = i; 
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a4d0: 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  * Program counte
a4e0: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  r */.      pMem+
a4f0: 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d  +;.  .      pMem
a500: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
a510: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
a520: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
a530: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
a540: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
a550: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a  pOp->opcode); /*
a560: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
a570: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
a580: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
a590: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
a5a0: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
a5b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
a5c0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
a5d0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
a5e0: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20       /* When an 
a5f0: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
a600: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28  e is encounter (
a610: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20  the only opcode 
a620: 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a  that has.      *
a630: 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41  * a P4_SUBPROGRA
a640: 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70  M argument), exp
a650: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
a660: 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62  the array of sub
a670: 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a  programs.      *
a680: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
a690: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
a6a0: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
a6b0: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
a6c0: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20  ubprogram.      
a6d0: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
a6e0: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
a6f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
a700: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
a710: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
a720: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
a730: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65   = (nSub+1)*size
a740: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
a750: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
a760: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
a770: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20   j<nSub; j++){. 
a780: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53           if( apS
a790: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70  ub[j]==pOp->p4.p
a7a0: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
a7b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a7c0: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26     if( j==nSub &
a7d0: 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c  & SQLITE_OK==sql
a7e0: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
a7f0: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75  pSub, nByte, nSu
a800: 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  b!=0) ){.       
a810: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
a820: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
a830: 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  z;.          apS
a840: 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70  ub[nSub++] = pOp
a850: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
a860: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66           pSub->f
a870: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62  lags |= MEM_Blob
a880: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
a890: 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f  ->n = nSub*sizeo
a8a0: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
a8b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a8c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  }.    }..    pMe
a8d0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
a8e0: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
a8f0: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
a920: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
a930: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a940: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
a950: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
a980: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
a990: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
a9a0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
a9b0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
a9c0: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a9e0: 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  3 */.    pMem++;
a9f0: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
aa00: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
aa10: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 33 32 29  Resize(pMem, 32)
aa20: 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20   ){ /* P4 */.   
aa30: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
aa40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
aa50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
aa60: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
aa70: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
aa80: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
aa90: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d  _Term;.    zP4 =
aaa0: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
aab0: 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20  pMem->z, 32);.  
aac0: 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d    if( zP4!=pMem-
aad0: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
aae0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
aaf0: 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20  (pMem, zP4, -1, 
ab00: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
ab10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ab20: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
ab30: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
ab40: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
ab50: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
ab60: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
ab70: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
ab80: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b  .    }.    pMem+
ab90: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
aba0: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
abb0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
abc0: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
abd0: 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a  ize(pMem, 4) ){.
abe0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
abf0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
ac00: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72  led );.        r
ac10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
ac20: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
ac30: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ac40: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
ac50: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
ac60: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
ac70: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70  e3_snprintf(3, p
ac80: 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20  Mem->z, "%.2x", 
ac90: 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50  pOp->p5);   /* P
aca0: 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  5 */.      pMem-
acb0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
acc0: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
acd0: 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.  .#ifdef SQLI
ace0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
acf0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
ad00: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
ad10: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
ad20: 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a  e(pMem, 500) ){.
ad30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ad40: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
ad50: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72  led );.        r
ad60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
ad70: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
ad80: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ad90: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
ada0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
adb0: 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74  = displayComment
adc0: 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d  (pOp, zP4, pMem-
add0: 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20  >z, 500);.      
ade0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
adf0: 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20  TE_UTF8;.#else. 
ae00: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
ae10: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
ae40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
ae50: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
ae60: 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70   = 8 - 4*(p->exp
ae70: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e  lain-1);.    p->
ae80: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d  pResultSet = &p-
ae90: 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d  >aMem[1];.    p-
aea0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
aeb0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
aec0: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
aed0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
aee0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
aef0: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
af00: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
af10: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
af20: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
af30: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
af40: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
af50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
af60: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
af70: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
af80: 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  *z = 0;.  if( p-
af90: 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d  >zSql ){.    z =
afa0: 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73   p->zSql;.  }els
afb0: 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20  e if( p->nOp>=1 
afc0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62  ){.    const Vdb
afd0: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
afe0: 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  Op[0];.    if( p
aff0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
b000: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
b010: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  !=0 ){.      z =
b020: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
b030: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
b040: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
b050: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
b060: 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53  f( z ) printf("S
b070: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
b080: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
b090: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b0a0: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
b0b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
b0c0: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
b0d0: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
b0e0: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
b0f0: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
b100: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b110: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
b120: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
b130: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
b140: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
b150: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
b160: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b170: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
b180: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
b190: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
b1a0: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
b1b0: 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  it && pOp->p4.z!
b1c0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
b1d0: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
b1e0: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
b1f0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
b200: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
b210: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66  Op->p4.z);.    f
b220: 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49  or(i=0; sqlite3I
b230: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sspace(z[i]); i+
b240: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30  +){}.    for(j=0
b250: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
b260: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
b270: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
b280: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
b290: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
b2a0: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
b2b0: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
b2c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b2d0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
b2e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b2f0: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
b300: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28   sqlite3IoTrace(
b310: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
b320: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
b330: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
b340: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
b350: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
b360: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
b370: 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65  pace from a fixe
b380: 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e  d size buffer an
b390: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
b3a0: 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70  er to.** that sp
b3b0: 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69  ace.  If insuffi
b3c0: 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20 61  cient space is a
b3d0: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
b3e0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
b3f0: 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72 20   pBuf parameter 
b400: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
b410: 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65  alue of a pointe
b420: 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20  r which will.** 
b430: 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77 20  receive the new 
b440: 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73  memory.  pBuf is
b450: 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20   normally NULL. 
b460: 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a   If pBuf is not.
b470: 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ** NULL, it mean
b480: 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70  s that memory sp
b490: 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ace has already 
b4a0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
b4b0: 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20  nd that.** this 
b4c0: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
b4d0: 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20  ot allocate any 
b4e0: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  new memory.  Whe
b4f0: 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  n pBuf is not.**
b500: 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74   NULL simply ret
b510: 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20  urn pBuf.  Only 
b520: 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d  allocate new mem
b530: 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20 70  ory space when p
b540: 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a  Buf.** is NULL..
b550: 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74  **.** nByte is t
b560: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
b570: 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64  es of space need
b580: 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f  ed..**.** *ppFro
b590: 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69  m points to avai
b5a0: 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20  lable space and 
b5b0: 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74  pEnd points to t
b5c0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
b5d0: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
b5e0: 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69 73  .  When space is
b5f0: 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46   allocated, *ppF
b600: 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20  rom is advanced 
b610: 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20  past.** the end 
b620: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
b630: 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70   space..**.** *p
b640: 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74  nByte is a count
b650: 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  er of the number
b660: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
b670: 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61 69  ce that have fai
b680: 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61  led.** to alloca
b690: 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  te.  If there is
b6a0: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70   insufficient sp
b6b0: 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74  ace in *ppFrom t
b6c0: 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  o satisfy the.**
b6d0: 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69   request, then i
b6e0: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
b6f0: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   by the amount o
b700: 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a  f the request..*
b710: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61  /.static void *a
b720: 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69  llocSpace(.  voi
b730: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
b740: 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72    /* Where retur
b750: 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62  n pointer will b
b760: 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e  e stored */.  in
b770: 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
b780: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b790: 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  bytes to allocat
b7a0: 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72  e */.  u8 **ppFr
b7b0: 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  om,         /* I
b7c0: 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20  N/OUT: Allocate 
b7d0: 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a  from *ppFrom */.
b7e0: 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20    u8 *pEnd,     
b7f0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
b800: 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74  r to 1 byte past
b810: 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46   the end of *ppF
b820: 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  rom buffer */.  
b830: 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20  int *pnByte     
b840: 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63       /* If alloc
b850: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
b860: 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20  made, increment 
b870: 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20  *pnByte */.){.  
b880: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
b890: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70  TE_ALIGNMENT(*pp
b8a0: 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70  From) );.  if( p
b8b0: 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42 75  Buf ) return pBu
b8c0: 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  f;.  nByte = ROU
b8d0: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66  ND8(nByte);.  if
b8e0: 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79  ( &(*ppFrom)[nBy
b8f0: 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20  te] <= pEnd ){. 
b900: 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a     pBuf = (void*
b910: 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70  )*ppFrom;.    *p
b920: 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a  pFrom += nByte;.
b930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e    }else{.    *pn
b940: 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  Byte += nByte;. 
b950: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66   }.  return pBuf
b960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e  ;.}../*.** Rewin
b970: 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20  d the VDBE back 
b980: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
b990: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
b9a0: 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  for.** running i
b9b0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
b9c0: 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62  e3VdbeRewind(Vdb
b9d0: 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e  e *p){.#if defin
b9e0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
b9f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
ba00: 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20  _PROFILE).  int 
ba10: 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  i;.#endif.  asse
ba20: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
ba30: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
ba40: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
ba50: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
ba60: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
ba70: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
ba80: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
ba90: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
baa0: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
bab0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
bac0: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
bad0: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d  n later. */.  p-
bae0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
baf0: 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66  GIC_RUN;..#ifdef
bb00: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
bb10: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d  for(i=1; i<p->nM
bb20: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  em; i++){.    as
bb30: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
bb40: 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  .db==p->db );.  
bb50: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63  }.#endif.  p->pc
bb60: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
bb70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
bb80: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
bb90: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61  E_Abort;.  p->ma
bba0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
bbb0: 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  _RUN;.  p->nChan
bbc0: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
bbd0: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
bbe0: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
bbf0: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69  at = 255;.  p->i
bc00: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
bc10: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
bc20: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
bc30: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72  BE_PROFILE.  for
bc40: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
bc50: 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  i++){.    p->aOp
bc60: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
bc70: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
bc80: 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  s = 0;.  }.#endi
bc90: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  f.}../*.** Prepa
bca0: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
bcb0: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
bcc0: 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  on for the first
bcd0: 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63   time after.** c
bce0: 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74  reating the virt
bcf0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68  ual machine.  Th
bd00: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
bd10: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
bd20: 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65  locating registe
bd30: 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  rs and initializ
bd40: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
bd50: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
bd60: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
bd70: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
bd80: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
bd90: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
bda0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
bdb0: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
bdc0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bdd0: 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
bde0: 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20  exactly once on 
bdf0: 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63  each virtual mac
be00: 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74  hine..** After t
be10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
be20: 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73  alled the VM has
be30: 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22   been "packaged"
be40: 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a   and is ready.**
be50: 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20   to run.  After 
be60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
be70: 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20  called, further 
be80: 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
be90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20  ite3VdbeAddOp() 
bea0: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72  functions are pr
beb0: 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20  ohibited.  This 
bec0: 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65  routine disconne
bed0: 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  cts.** the Vdbe 
bee0: 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f  from the Parse o
bef0: 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65  bject that helpe
bf00: 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f  d generate it so
bf10: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65   that the.** the
bf20: 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e   Vdbe becomes an
bf30: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74   independent ent
bf40: 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73  ity and the Pars
bf50: 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a  e object can be.
bf60: 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  ** destroyed..**
bf70: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
bf80: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20  te3VdbeRewind() 
bf90: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73  procedure to res
bfa0: 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  tore a virtual m
bfb0: 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74  achine back.** t
bfc0: 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74  o its initial st
bfd0: 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73  ate after it has
bfe0: 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f   been run..*/.vo
bff0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
c000: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
c010: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
c020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c030: 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65   VDBE */.  Parse
c040: 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20   *pParse        
c050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
c060: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c070: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c080: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c090: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
c0a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
c0b0: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c0e0: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
c0f0: 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  int nMem;       
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c110: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d  * Number of VM m
c120: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20  emory registers 
c130: 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72  */.  int nCursor
c140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c150: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c160: 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65   cursors require
c170: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b  d */.  int nArg;
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c1a0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20  of arguments in 
c1b0: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
c1c0: 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20   int nOnce;     
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f  /* Number of OP_
c1f0: 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  Once instruction
c200: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c230: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a  unter */.  u8 *z
c240: 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
c250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
c260: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
c270: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
c280: 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20    u8 *zEnd;     
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
c2b0: 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  ast allocated me
c2c0: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  mory */.  int nB
c2d0: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
c2e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
c2f0: 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72  much extra memor
c300: 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a  y is needed */..
c310: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
c320: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
c330: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
c340: 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
c350: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
c360: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
c370: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
c380: 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73  pParse==p->pPars
c390: 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e );.  db = p->d
c3a0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  b;.  assert( db-
c3b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
c3c0: 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61   );.  nVar = pPa
c3d0: 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65  rse->nVar;.  nMe
c3e0: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
c3f0: 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50  ;.  nCursor = pP
c400: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41  arse->nTab;.  nA
c410: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61  rg = pParse->nMa
c420: 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20  xArg;.  nOnce = 
c430: 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20  pParse->nOnce;. 
c440: 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20   if( nOnce==0 ) 
c450: 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e  nOnce = 1; /* En
c460: 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  sure at least on
c470: 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e  e byte in p->aOn
c480: 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20  ceFlag[] */.  . 
c490: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
c4a0: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
c4b0: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
c4c0: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
c4d0: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
c4e0: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
c4f0: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
c500: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
c510: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
c520: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
c530: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
c540: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
c550: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
c560: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
c570: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
c580: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
c590: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
c5a0: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
c5b0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
c5c0: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
c5d0: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
c5e0: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
c5f0: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
c600: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
c610: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
c620: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
c630: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
c640: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
c650: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
c660: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
c670: 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
c680: 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76  registers, SQL v
c690: 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63  ariables, VDBE c
c6a0: 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a  ursors and .  **
c6b0: 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72   an array to mar
c6c0: 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f  shal SQL functio
c6d0: 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a  n arguments in..
c6e0: 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75    */.  zCsr = (u
c6f0: 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f  8*)&p->aOp[p->nO
c700: 70 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  p];            /
c710: 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62  * Memory avaliab
c720: 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f  le for allocatio
c730: 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75  n */.  zEnd = (u
c740: 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 50 61 72 73  8*)&p->aOp[pPars
c750: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f  e->nOpAlloc];  /
c760: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
c770: 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20  t end of zCsr[] 
c780: 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  */..  resolveP2V
c790: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b  alues(p, &nArg);
c7a0: 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  .  p->usesStmtJo
c7b0: 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61  urnal = (u8)(pPa
c7c0: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
c7d0: 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79  e && pParse->may
c7e0: 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50  Abort);.  if( pP
c7f0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26  arse->explain &&
c800: 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20   nMem<10 ){.    
c810: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20  nMem = 10;.  }. 
c820: 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c   memset(zCsr, 0,
c830: 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a   zEnd-zCsr);.  z
c840: 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28  Csr += (zCsr - (
c850: 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65  u8*)0)&7;.  asse
c860: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
c870: 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29  LIGNMENT(zCsr) )
c880: 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  ;.  p->expired =
c890: 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79   0;..  /* Memory
c8a0: 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20   for registers, 
c8b0: 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73  parameters, curs
c8c0: 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f  or, etc, is allo
c8d0: 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a  cated in two.  *
c8e0: 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68  * passes.  On th
c8f0: 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65  e first pass, we
c900: 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e   try to reuse un
c910: 75 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68  used space at th
c920: 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  e .  ** end of t
c930: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
c940: 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
c950: 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
c960: 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65  l memory.  ** re
c970: 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65  quirements by re
c980: 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65  using the opcode
c990: 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65   array tail, the
c9a0: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a  n the second.  *
c9b0: 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c  * pass will fill
c9c0: 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 69   in the rest usi
c9d0: 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63  ng a fresh alloc
c9e0: 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  ation.  .  **.  
c9f0: 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73  ** This two-pass
ca00: 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72   approach that r
ca10: 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65  euses as much me
ca20: 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
ca30: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c   from.  ** the l
ca40: 65 66 74 6f 76 65 72 20 73 70 61 63 65 20 61 74  eftover space at
ca50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
ca60: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e  opcode array can
ca70: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
ca80: 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61   ** reduce the a
ca90: 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
caa0: 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72  held by a prepar
cab0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ed statement..  
cac0: 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42  */.  do {.    nB
cad0: 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  yte = 0;.    p->
cae0: 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
caf0: 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a  e(p->aMem, nMem*
cb00: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
cb10: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
cb20: 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d  );.    p->aVar =
cb30: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
cb40: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
cb50: 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45  (Mem), &zCsr, zE
cb60: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
cb70: 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f   p->apArg = allo
cb80: 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c  cSpace(p->apArg,
cb90: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
cba0: 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  *), &zCsr, zEnd,
cbb0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
cbc0: 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70  >azVar = allocSp
cbd0: 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56  ace(p->azVar, nV
cbe0: 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  ar*sizeof(char*)
cbf0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
cc00: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
cc10: 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pCsr = allocSpac
cc20: 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72  e(p->apCsr, nCur
cc30: 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
cc40: 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20  ursor*),.       
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20     &zCsr, zEnd, 
cc70: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
cc80: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f  aOnceFlag = allo
cc90: 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46  cSpace(p->aOnceF
cca0: 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73  lag, nOnce, &zCs
ccb0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
ccc0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
ccd0: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
cce0: 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e  STATUS.    p->an
ccf0: 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Exec = allocSpac
cd00: 65 28 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e  e(p->anExec, p->
cd10: 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 2c  nOp*sizeof(i64),
cd20: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
cd30: 42 79 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Byte);.#endif.  
cd40: 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
cd50: 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20       p->pFree = 
cd60: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
cd70: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
cd80: 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d      }.    zCsr =
cd90: 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a   p->pFree;.    z
cda0: 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74  End = &zCsr[nByt
cdb0: 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42  e];.  }while( nB
cdc0: 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  yte && !db->mall
cdd0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70  ocFailed );..  p
cde0: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72  ->nCursor = nCur
cdf0: 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46  sor;.  p->nOnceF
ce00: 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69  lag = nOnce;.  i
ce10: 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20  f( p->aVar ){.  
ce20: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56    p->nVar = (ynV
ce30: 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72  ar)nVar;.    for
ce40: 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b  (n=0; n<nVar; n+
ce50: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  +){.      p->aVa
ce60: 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  r[n].flags = MEM
ce70: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  _Null;.      p->
ce80: 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aVar[n].db = db;
ce90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
cea0: 20 70 2d 3e 61 7a 56 61 72 20 26 26 20 70 50 61   p->azVar && pPa
ceb0: 72 73 65 2d 3e 6e 7a 56 61 72 3e 30 20 29 7b 0a  rse->nzVar>0 ){.
cec0: 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70      p->nzVar = p
ced0: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20  Parse->nzVar;.  
cee0: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61    memcpy(p->azVa
cef0: 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  r, pParse->azVar
cf00: 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f  , p->nzVar*sizeo
cf10: 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b  f(p->azVar[0]));
cf20: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72  .    memset(pPar
cf30: 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50  se->azVar, 0, pP
cf40: 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65  arse->nzVar*size
cf50: 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  of(pParse->azVar
cf60: 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  [0]));.  }.  if(
cf70: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
cf80: 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20  p->aMem--;      
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66  /* aMem[] goes f
cfb0: 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20  rom 1..nMem */. 
cfc0: 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65     p->nMem = nMe
cfd0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
cfe0: 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20     /*       not 
cff0: 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a  from 0..nMem-1 *
d000: 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e  /.    for(n=1; n
d010: 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  <=nMem; n++){.  
d020: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66      p->aMem[n].f
d030: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
d040: 69 6e 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ined;.      p->a
d050: 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Mem[n].db = db;.
d060: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65      }.  }.  p->e
d070: 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d  xplain = pParse-
d080: 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69  >explain;.  sqli
d090: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29  te3VdbeRewind(p)
d0a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
d0b0: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
d0c0: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
d0d0: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
d0e0: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
d0f0: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
d100: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d110: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
d120: 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
d130: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
d140: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d150: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
d160: 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28  VdbeSorterClose(
d170: 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69  p->db, pCx);.  i
d180: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
d190: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
d1a0: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
d1b0: 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
d1c0: 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
d1d0: 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
d1e0: 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
d1f0: 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65  s, by.    ** the
d200: 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
d210: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d    }else if( pCx-
d220: 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
d230: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
d240: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75  eCursor(pCx->pCu
d250: 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
d260: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
d270: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 65 6c  IRTUALTABLE.  el
d280: 73 65 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  se if( pCx->pVta
d290: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
d2a0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
d2b0: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
d2c0: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
d2d0: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
d2e0: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
d2f0: 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 43 75 72  odule = pVtabCur
d300: 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64  sor->pVtab->pMod
d310: 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  ule;.    p->inVt
d320: 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20  abMethod = 1;.  
d330: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
d340: 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  e(pVtabCursor);.
d350: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
d360: 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  hod = 0;.  }.#en
d370: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  dif.}../*.** Cop
d380: 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  y the values sto
d390: 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46  red in the VdbeF
d3a0: 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74  rame structure t
d3b0: 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73  o its Vdbe. This
d3c0: 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72  .** is used, for
d3d0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
d3e0: 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f   trigger sub-pro
d3f0: 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74  gram is halted t
d400: 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e  o restore.** con
d410: 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e  trol to the main
d420: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74   program..*/.int
d430: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
d440: 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61  eRestore(VdbeFra
d450: 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56  me *pFrame){.  V
d460: 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d  dbe *v = pFrame-
d470: 3e 76 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  >v;.#ifdef SQLIT
d480: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
d490: 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e  ANSTATUS.  v->an
d4a0: 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61  Exec = pFrame->a
d4b0: 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20  nExec;.#endif.  
d4c0: 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70  v->aOnceFlag = p
d4d0: 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67  Frame->aOnceFlag
d4e0: 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67  ;.  v->nOnceFlag
d4f0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65   = pFrame->nOnce
d500: 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d  Flag;.  v->aOp =
d510: 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20   pFrame->aOp;.  
d520: 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->nOp = pFrame-
d530: 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20  >nOp;.  v->aMem 
d540: 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a  = pFrame->aMem;.
d550: 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    v->nMem = pFra
d560: 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61  me->nMem;.  v->a
d570: 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61  pCsr = pFrame->a
d580: 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73  pCsr;.  v->nCurs
d590: 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75  or = pFrame->nCu
d5a0: 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c  rsor;.  v->db->l
d5b0: 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d  astRowid = pFram
d5c0: 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  e->lastRowid;.  
d5d0: 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  v->nChange = pFr
d5e0: 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  ame->nChange;.  
d5f0: 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  v->db->nChange =
d600: 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e   pFrame->nDbChan
d610: 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72  ge;.  return pFr
d620: 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame->pc;.}../*.*
d630: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
d640: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ors..**.** Also 
d650: 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61  release any dyna
d660: 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20  mic memory held 
d670: 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65  by the VM in the
d680: 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72   Vdbe.aMem memor
d690: 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79  y .** cell array
d6a0: 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73  . This is necess
d6b0: 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72  ary as the memor
d6c0: 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79  y cell array may
d6d0: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e   contain.** poin
d6e0: 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d  ters to VdbeFram
d6f0: 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68  e objects, which
d700: 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e   may in turn con
d710: 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  tain pointers to
d720: 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  .** open cursors
d730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d740: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
d750: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
d760: 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
d770: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
d780: 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72  ame;.    for(pFr
d790: 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
d7a0: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
d7b0: 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
d7c0: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c  Parent);.    sql
d7d0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
d7e0: 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20  tore(pFrame);.  
d7f0: 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b    p->pFrame = 0;
d800: 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d  .    p->nFrame =
d810: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
d820: 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29  ( p->nFrame==0 )
d830: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ;..  if( p->apCs
d840: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
d850: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d860: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
d870: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
d880: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
d890: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
d8a0: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
d8b0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
d8c0: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
d8d0: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
d8e0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
d8f0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
d900: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Mem ){.    relea
d910: 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61  seMemArray(&p->a
d920: 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29  Mem[1], p->nMem)
d930: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
d940: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
d950: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
d960: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
d970: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
d980: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
d990: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
d9a0: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
d9b0: 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pDel);.  }..  /*
d9c0: 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64   Delete any auxd
d9d0: 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ata allocations 
d9e0: 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a  made by the VM *
d9f0: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44  /.  if( p->pAuxD
da00: 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62  ata ) sqlite3Vdb
da10: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
da20: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65  , -1, 0);.  asse
da30: 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d  rt( p->pAuxData=
da40: 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  =0 );.}../*.** C
da50: 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61  lean up the VM a
da60: 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75  fter a single ru
da70: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
da80: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
da90: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
daa0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64  b = p->db;..#ifd
dab0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
dac0: 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73    /* Execute ass
dad0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
dae0: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
daf0: 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d  the Vdbe.apCsr[]
db00: 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e   and .  ** Vdbe.
db10: 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61  aMem[] arrays ha
db20: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
db30: 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a  cleaned up.  */.
db40: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
db50: 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d  ->apCsr ) for(i=
db60: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
db70: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
db80: 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a  >apCsr[i]==0 );.
db90: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
dba0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
dbb0: 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61  =p->nMem; i++) a
dbc0: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
dbd0: 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64  ].flags==MEM_Und
dbe0: 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65  efined );.  }.#e
dbf0: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44  ndif..  sqlite3D
dc00: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
dc10: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
dc20: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52  Msg = 0;.  p->pR
dc30: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a  esultSet = 0;.}.
dc40: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
dc50: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
dc60: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
dc70: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
dc80: 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
dc90: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
dca0: 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
dcb0: 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
dcc0: 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
dcd0: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
dce0: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
dcf0: 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
dd00: 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
dd10: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
dd20: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
dd30: 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
dd40: 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
dd50: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
dd60: 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
dd70: 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
dd80: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
dd90: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
dda0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
ddb0: 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ..  releaseMemAr
ddc0: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
ddd0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
dde0: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
ddf0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
de00: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
de10: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
de20: 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
de30: 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29  esColumn = (u16)
de40: 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
de50: 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c  >aColName = pCol
de60: 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
de70: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
de80: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29  (db, sizeof(Mem)
de90: 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  *n );.  if( p->a
dea0: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ColName==0 ) ret
deb0: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  urn;.  while( n-
dec0: 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f  - > 0 ){.    pCo
ded0: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d  lName->flags = M
dee0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f  EM_Null;.    pCo
def0: 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64  lName->db = p->d
df00: 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b  b;.    pColName+
df10: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
df20: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
df30: 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
df40: 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
df50: 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
df60: 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
df70: 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
df80: 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
df90: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
dfa0: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
dfb0: 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
dfc0: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
dfd0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
dfe0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
dff0: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
e000: 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
e010: 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
e020: 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
e030: 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
e040: 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
e050: 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
e060: 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
e070: 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
e080: 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
e090: 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
e0a0: 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
e0b0: 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
e0c0: 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
e0d0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
e0e0: 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
e110: 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
e120: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
e150: 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
e160: 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
e170: 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e190: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
e1a0: 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
e1b0: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
e1c0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
e1d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
e1e0: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
e1f0: 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
e200: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
e210: 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
e220: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
e230: 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
e240: 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
e250: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
e260: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
e270: 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
e280: 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
e290: 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
e2a0: 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
e2b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e2c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e2d0: 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
e2e0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
e2f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
e300: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
e310: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
e320: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
e330: 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
e340: 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
e350: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
e360: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
e370: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
e380: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
e390: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
e3a0: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
e3b0: 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
e3c0: 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
e3d0: 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
e3e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e3f0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
e400: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
e410: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
e420: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
e430: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
e440: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
e450: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
e460: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
e470: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
e480: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
e490: 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
e4a0: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
e4b0: 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
e4c0: 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
e4d0: 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
e4e0: 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
e4f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e500: 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
e510: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
e520: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
e530: 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
e540: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
e550: 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
e560: 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
e570: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
e580: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
e590: 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
e5a0: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
e5b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
e5c0: 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68  LTABLE.  /* With
e5d0: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71   this option, sq
e5e0: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20  lite3VtabSync() 
e5f0: 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
e600: 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51   simply .  ** SQ
e610: 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20  LITE_OK so p is 
e620: 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a  not used. .  */.
e630: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
e640: 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ER(p);.#endif.. 
e650: 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
e660: 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
e670: 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
e680: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
e690: 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
e6a0: 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
e6b0: 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
e6c0: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
e6d0: 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
e6e0: 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
e6f0: 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
e700: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e710: 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
e720: 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
e730: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
e740: 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
e750: 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
e760: 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
e770: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
e780: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
e790: 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, p);..  /* Th
e7a0: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
e7b0: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
e7c0: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
e7d0: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
e7e0: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
e7f0: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
e800: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
e810: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
e820: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
e830: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
e840: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
e850: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
e860: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
e870: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
e880: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
e890: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
e8a0: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
e8b0: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
e8c0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
e8d0: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
e8e0: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
e8f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e900: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
e910: 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
e920: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
e930: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
e940: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
e950: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
e960: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
e970: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31  ;.      if( i!=1
e980: 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20   ) nTrans++;.   
e990: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
e9a0: 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  nter(pBt);.     
e9b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e9c0: 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
e9d0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
e9e0: 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73  r(pBt));.      s
e9f0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
ea00: 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
ea10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ea20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
ea30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
ea40: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
ea50: 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
ea60: 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
ea70: 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
ea80: 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
ea90: 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
eaa0: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
eab0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  ){.    rc = db->
eac0: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
ead0: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
eae0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
eaf0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
eb00: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
eb10: 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a  MMITHOOK;.    }.
eb20: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
eb30: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
eb40: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
eb50: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
eb60: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
eb70: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
eb80: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
eb90: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
eba0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
ebb0: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
ebc0: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
ebd0: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
ebe0: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
ebf0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
ec00: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
ec10: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
ec20: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
ec30: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
ec40: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
ec50: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
ec60: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
ec70: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
ec80: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
ec90: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
eca0: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
ecb0: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
ecc0: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
ecd0: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
ece0: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
ecf0: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
ed00: 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
ed10: 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
ed20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
ed30: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
ed40: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
ed50: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
ed60: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
ed70: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
ed80: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
ed90: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
eda0: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
edb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
edc0: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
edd0: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
ede0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
edf0: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
ee00: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
ee10: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
ee20: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
ee30: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
ee40: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
ee50: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
ee60: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
ee70: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
ee80: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
ee90: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
eea0: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
eeb0: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
eec0: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
eed0: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
eee0: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
eef0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
ef00: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
ef10: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
ef20: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
ef30: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
ef40: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
ef50: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
ef60: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ef70: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
ef80: 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20  eTwo(pBt, 0);.  
ef90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
efa0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
efb0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
efc0: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
efd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
efe0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
eff0: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
f000: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
f010: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
f020: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
f030: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
f040: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
f050: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
f060: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
f070: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
f080: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ally..  */.#ifnd
f090: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
f0a0: 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
f0b0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
f0c0: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
f0d0: 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
f0e0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
f0f0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
f100: 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
f110: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f120: 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
f130: 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
f140: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
f150: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
f160: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73  b[0].pBt);.    s
f170: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
f180: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36  ster = 0;.    i6
f190: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
f1a0: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69    int res;.    i
f1b0: 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20  nt retryCount = 
f1c0: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e  0;.    int nMain
f1d0: 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  File;..    /* Se
f1e0: 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
f1f0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
f200: 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65  */.    nMainFile
f210: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
f220: 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20  30(zMainFile);. 
f230: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
f240: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
f250: 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a  "%s-mjXXXXXX9XXz
f260: 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20  ", zMainFile);. 
f270: 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d     if( zMaster==
f280: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
f290: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20  E_NOMEM;.    do 
f2a0: 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e  {.      u32 iRan
f2b0: 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dom;.      if( r
f2c0: 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20  etryCount ){.   
f2d0: 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
f2e0: 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20  unt>100 ){.     
f2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
f300: 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
f310: 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a  J delete: %s", z
f320: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
f330: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
f340: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
f350: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
f360: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
f370: 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f  else if( retryCo
f380: 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unt==1 ){.      
f390: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
f3a0: 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
f3b0: 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a   collide: %s", z
f3c0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
f3d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f3e0: 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20   retryCount++;. 
f3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
f400: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69  domness(sizeof(i
f410: 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f  Random), &iRando
f420: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
f430: 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26  3_snprintf(13, &
f440: 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c  zMaster[nMainFil
f450: 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32  e], "-mj%06X9%02
f460: 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X",.            
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f480: 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26     (iRandom>>8)&
f490: 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f  0xffffff, iRando
f4a0: 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f  m&0xff);.      /
f4b0: 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74  * The antipenult
f4c0: 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20  imate character 
f4d0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
f4e0: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a  urnal name must.
f4f0: 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20        ** be "9" 
f500: 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f  to avoid name co
f510: 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73  llisions when us
f520: 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65  ing 8+3 filename
f530: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  s. */.      asse
f540: 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69  rt( zMaster[sqli
f550: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73  te3Strlen30(zMas
f560: 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a  ter)-3]=='9' );.
f570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c        sqlite3Fil
f580: 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69  eSuffix3(zMainFi
f590: 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  le, zMaster);.  
f5a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f5b0: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
f5c0: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
f5d0: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
f5e0: 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  es);.    }while(
f5f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
f600: 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28  & res );.    if(
f610: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f620: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  {.      /* Open 
f630: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f640: 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  al. */.      rc 
f650: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
f660: 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73  alloc(pVfs, zMas
f670: 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a  ter, &pMaster, .
f680: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
f690: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
f6a0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
f6b0: 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  TE|.          SQ
f6c0: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
f6d0: 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
f6e0: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20  MASTER_JOURNAL, 
f6f0: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
f700: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f710: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f720: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f730: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
f740: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
f750: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
f760: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
f770: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
f780: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
f790: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
f7a0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
f7b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
f7c0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
f7d0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
f7e0: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
f7f0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
f800: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
f810: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
f820: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
f830: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
f840: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
f850: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
f860: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
f870: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
f880: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
f890: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
f8a0: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
f8b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
f8c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
f8d0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
f8e0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
f8f0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
f900: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
f910: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
f920: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
f930: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
f940: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
f950: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
f960: 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ( zFile==0 ){.  
f970: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
f980: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d  ;  /* Ignore TEM
f990: 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64  P and :memory: d
f9a0: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20  atabases */.    
f9b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
f9c0: 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d  sert( zFile[0]!=
f9d0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
f9e0: 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73   !needSync && !s
f9f0: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
fa00: 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a  isabled(pBt) ){.
fa10: 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
fa20: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
fa30: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
fa40: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
fa50: 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
fa60: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
fa70: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
fa80: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
fa90: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
faa0: 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
fab0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
fac0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fad0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
fae0: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
faf0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
fb00: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
fb10: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
fb20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
fb30: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
fb40: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
fb50: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
fb60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
fb70: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
fb80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
fb90: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
fba0: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
fbb0: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
fbc0: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
fbd0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
fbe0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
fbf0: 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20  edSync .     && 
fc00: 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76  0==(sqlite3OsDev
fc10: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
fc20: 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49  cs(pMaster)&SQLI
fc30: 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
fc40: 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c  IAL).     && SQL
fc50: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
fc60: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
fc70: 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
fc80: 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b  _NORMAL)).    ){
fc90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
fca0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
fcb0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
fcc0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
fcd0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
fce0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
fcf0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
fd00: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fd10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
fd20: 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
fd30: 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
fd40: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
fd50: 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
fd60: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
fd70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
fd80: 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
fd90: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
fda0: 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
fdb0: 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
fdc0: 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
fdd0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fde0: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
fdf0: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
fe00: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
fe10: 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
fe20: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
fe30: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
fe40: 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
fe50: 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
fe60: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
fe70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fe80: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
fe90: 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
fea0: 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
feb0: 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
fec0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
fed0: 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
fee0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
fef0: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
ff00: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
ff10: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
ff20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
ff30: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
ff40: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
ff50: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
ff60: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
ff70: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
ff80: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
ff90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ffa0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
ffb0: 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
ffc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ffd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
ffe0: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
fff0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
10000 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  !=SQLITE_BUSY );
10010 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10030 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10040 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
10050 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10060 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74   }..    /* Delet
10070 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
10080 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
10090 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e  commits the tran
100a0 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20  saction. After. 
100b0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73     ** doing this
100c0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
100d0 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62  s synced again b
100e0 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69  efore any indivi
100f0 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e  dual.    ** tran
10100 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72  saction files ar
10110 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  e deleted..    *
10120 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
10130 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
10140 20 7a 4d 61 73 74 65 72 2c 20 6e 65 65 64 53 79   zMaster, needSy
10150 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nc);.    sqlite3
10160 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
10170 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
10180 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
10190 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
101a0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
101b0 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64  /* All files and
101c0 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76   directories hav
101d0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
101e0 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f  ynced, so the fo
101f0 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63  llowing.    ** c
10200 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
10210 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
10220 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  wo() are only cl
10230 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a  osing files and.
10240 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
10250 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f  or truncating jo
10260 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74  urnals. If somet
10270 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
10280 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
10290 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
102a0 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63  e don't really c
102b0 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69  are. The integri
102c0 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ty of the.    **
102d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
102e0 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
102f0 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72  ed, but some str
10300 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61  ay 'cold' journa
10310 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65  ls.    ** may be
10320 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
10330 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
10340 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c  r code won't hel
10350 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a  p matters..    *
10360 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  /.    disable_si
10370 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
10380 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
10390 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
103a0 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  c();.    for(i=0
103b0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
103c0 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
103d0 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
103e0 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
103f0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
10400 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
10410 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
10420 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
10430 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
10440 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
10450 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
10460 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
10470 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
10480 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
10490 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
104a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
104b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
104c0 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
104d0 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76  lite3.nVdbeActiv
104e0 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65  e count variable
104f0 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20  .** matches the 
10500 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73  number of vdbe's
10510 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c   in the list sql
10520 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20  ite3.pVdbe that 
10530 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  are.** currently
10540 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65   active. An asse
10550 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74  rtion fails if t
10560 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f  he two counts do
10570 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54   not match..** T
10580 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  his is an intern
10590 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e  al self-check on
105a0 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61  ly - it is not a
105b0 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63  n essential proc
105c0 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a  essing.** step..
105d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
105e0 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20  no-op if NDEBUG 
105f0 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
10600 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
10610 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
10620 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c  ctiveVdbeCnt(sql
10630 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
10640 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20  e *p;.  int cnt 
10650 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  = 0;.  int nWrit
10660 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65  e = 0;.  int nRe
10670 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62  ad = 0;.  p = db
10680 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65  ->pVdbe;.  while
10690 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ( p ){.    if( s
106a0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
106b0 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29  ((sqlite3_stmt*)
106c0 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  p) ){.      cnt+
106d0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
106e0 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57  readOnly==0 ) nW
106f0 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  rite++;.      if
10700 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
10710 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a   nRead++;.    }.
10720 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
10730 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10740 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63  cnt==db->nVdbeAc
10750 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tive );.  assert
10760 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56  ( nWrite==db->nV
10770 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73  dbeWrite );.  as
10780 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d  sert( nRead==db-
10790 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a  >nVdbeRead );.}.
107a0 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68  #else.#define ch
107b0 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
107c0 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
107d0 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61  * If the Vdbe pa
107e0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
107f0 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65  t argument opene
10800 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  d a statement-tr
10810 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c  ansaction,.** cl
10820 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75  ose it now. Argu
10830 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65  ment eOp must be
10840 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e   either SAVEPOIN
10850 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a  T_ROLLBACK or.**
10860 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
10870 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56  SE. If it is SAV
10880 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
10890 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d   then the statem
108a0 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
108b0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
108c0 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56  k. If eOp is SAV
108d0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
108e0 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61  then the .** sta
108f0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
10900 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
10910 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
10920 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
10930 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
10940 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
10950 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
10960 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
10970 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
10980 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
10990 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ent(Vdbe *p, int
109a0 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33   eOp){.  sqlite3
109b0 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e   *const db = p->
109c0 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
109d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
109e0 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  If p->iStatement
109f0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
10a00 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
10a10 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a   Vdbe opened a .
10a20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
10a30 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
10a40 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
10a50 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20   here. The only 
10a60 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  exception.  ** i
10a70 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72  s that an IO err
10a80 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75  or may have occu
10a90 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e  rred, causing an
10aa0 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62   emergency rollb
10ab0 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69  ack..  ** In thi
10ac0 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61  s case (db->nSta
10ad0 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20  tement==0), and 
10ae0 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
10af0 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69   to do..  */.  i
10b00 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  f( db->nStatemen
10b10 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65  t && p->iStateme
10b20 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  nt ){.    int i;
10b30 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
10b40 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69  Savepoint = p->i
10b50 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20  Statement-1;..  
10b60 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
10b70 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10b80 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
10b90 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
10ba0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53    assert( db->nS
10bb0 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
10bc0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
10bd0 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53  atement==(db->nS
10be0 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
10bf0 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20  vepoint) );..   
10c00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
10c10 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
10c20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
10c30 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72  TE_OK;.      Btr
10c40 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
10c50 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
10c60 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
10c70 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
10c80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
10c90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
10ca0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
10cb0 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
10cc0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
10cd0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
10ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10cf0 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
10d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
10d10 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
10d20 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
10d30 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
10d40 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
10d50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10d60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10d70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10d80 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
10d90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10da0 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61    }.    db->nSta
10db0 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d  tement--;.    p-
10dc0 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
10dd0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
10de0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10df0 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
10e00 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
10e10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10e20 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
10e30 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
10e40 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
10e50 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
10e60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
10e70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10e80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
10e90 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
10ea0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
10eb0 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
10ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
10ed0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
10ee0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
10ef0 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  on is being roll
10f00 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65  ed back, also re
10f10 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a  store the .    *
10f20 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
10f30 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
10f40 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
10f50 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
10f60 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20  ad when .    ** 
10f70 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
10f80 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
10f90 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ened.  */.    if
10fa0 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
10fb0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
10fc0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
10fd0 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
10fe0 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62  efCons;.      db
10ff0 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
11000 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
11010 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20  ImmCons;.    }. 
11020 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11030 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11040 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
11050 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
11060 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ion opened by th
11070 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
11080 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64  andle associated
11090 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73   with the VM pas
110a0 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
110b0 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  nt is about to b
110c0 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  e .** committed.
110d0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
110e0 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72  tstanding deferr
110f0 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
11100 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f  onstraint.** vio
11110 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20  lations, return 
11120 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74  SQLITE_ERROR. Ot
11130 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
11140 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
11150 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
11160 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73  ng FK violations
11170 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
11180 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
11190 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74  QLITE_ERROR, set
111a0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
111b0 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f  he VM to SQLITE_
111c0 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
111d0 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69  GNKEY.** and wri
111e0 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
111f0 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20  age to it. Then 
11200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
11210 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ROR..*/.#ifndef 
11220 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
11230 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69  IGN_KEY.int sqli
11240 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56  te3VdbeCheckFk(V
11250 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65  dbe *p, int defe
11260 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  rred){.  sqlite3
11270 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
11280 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26  if( (deferred &&
11290 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43   (db->nDeferredC
112a0 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65  ons+db->nDeferre
112b0 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20  dImmCons)>0) .  
112c0 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26   || (!deferred &
112d0 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  & p->nFkConstrai
112e0 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  nt>0) .  ){.    
112f0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
11300 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
11310 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72  NKEY;.    p->err
11320 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
11330 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ort;.    sqlite3
11340 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
11350 72 72 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52 45  rrMsg, db, "FORE
11360 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
11370 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  nt failed");.   
11380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
11390 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
113a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
113b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
113c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
113d0 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
113e0 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
113f0 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
11400 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
11410 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
11420 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
11430 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
11440 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
11450 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
11460 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
11470 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
11480 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11490 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
114a0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
114b0 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
114c0 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
114d0 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
114e0 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
114f0 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
11500 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
11510 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
11520 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
11530 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
11540 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
11550 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
11560 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
11570 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
11580 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
11590 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
115a0 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
115b0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
115c0 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
115d0 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
115e0 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
115f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
11600 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
11610 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
11620 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
11630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
11650 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73  d to store trans
11660 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65  ient return code
11670 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
11680 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
11690 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
116a0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67  contains the log
116b0 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ic that determin
116c0 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  es if a statemen
116d0 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61  t or.  ** transa
116e0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f  ction will be co
116f0 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
11700 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
11710 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65  lt of the.  ** e
11720 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
11730 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
11740 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  . .  **.  ** If 
11750 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
11760 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75  wing errors occu
11770 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  r:.  **.  **    
11780 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
11790 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  **     SQLITE_IO
117a0 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ERR.  **     SQL
117b0 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20  ITE_FULL.  **   
117c0 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55    SQLITE_INTERRU
117d0 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  PT.  **.  ** The
117e0 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  n the internal c
117f0 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20  ache might have 
11800 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20  been left in an 
11810 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a  inconsistent.  *
11820 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65  * state.  We nee
11830 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  d to rollback th
11840 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
11850 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72  saction, if ther
11860 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f  e is.  ** one, o
11870 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
11880 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
11890 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d  ere is no statem
118a0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
118b0 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  .  */..  if( p->
118c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
118d0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
118e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
118f0 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65  }.  if( p->aOnce
11900 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d  Flag ) memset(p-
11910 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70  >aOnceFlag, 0, p
11920 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20  ->nOnceFlag);.  
11930 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
11940 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  p);.  if( p->mag
11950 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
11960 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
11970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11980 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
11990 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
119a0 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
119b0 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
119c0 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
119d0 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20  r started or if 
119e0 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  the.  ** SQL sta
119f0 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  tement does not 
11a00 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20  read or write a 
11a10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
11a20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
11a30 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65  0 && p->bIsReade
11a40 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  r ){.    int mrc
11a50 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
11a60 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
11a70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ->rc */.    int 
11a80 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30  eStatementOp = 0
11a90 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63  ;.    int isSpec
11aa0 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
11ab0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
11ac0 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61  rue if a 'specia
11ad0 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20  l' error */..   
11ae0 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
11af0 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
11b00 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
11b10 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
11b20 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(p);..    /* Ch
11b30 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
11b40 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
11b50 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  s */.    mrc = p
11b60 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
11b70 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
11b80 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  = mrc==SQLITE_NO
11b90 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
11ba0 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  TE_IOERR.       
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
11bc0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
11bd0 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53  ERRUPT || mrc==S
11be0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
11bf0 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
11c00 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
11c10 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
11c20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68  read-only and th
11c30 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
11c40 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
11c50 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72  , .      ** no r
11c60 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73  ollback is neces
11c70 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  sary. Otherwise,
11c80 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65   at least a save
11c90 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
11ca0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
11cb0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
11cc0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
11cd0 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20  atabase to a .  
11ce0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e      ** consisten
11cf0 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
11d00 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  *.      ** Even 
11d10 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
11d20 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69   is read-only, i
11d30 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
11d40 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20  o perform.      
11d50 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  ** a statement o
11d60 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  r transaction ro
11d70 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
11d80 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a  . If the error .
11d90 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65        ** occurre
11da0 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
11db0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
11dc0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
11dd0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
11de0 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
11df0 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
11e00 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
11e10 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
11e20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
11e30 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
11e40 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
11e50 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
11e60 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
11e70 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
11e80 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
11e90 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
11ea0 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
11eb0 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
11ec0 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
11ed0 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d         if( (mrc=
11ee0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
11ef0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
11f00 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  L) && p->usesStm
11f10 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
11f20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
11f30 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
11f40 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
11f50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11f60 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
11f70 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
11f80 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
11f90 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
11fa0 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
11fb0 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
11fc0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
11fd0 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
11fe0 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
11ff0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
12000 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12010 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
12020 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
12030 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
12040 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
12050 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
12060 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
12070 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
12080 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
12090 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
120a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
120b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
120c0 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
120d0 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
120e0 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  s. */.    if( p-
120f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
12100 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
12110 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
12120 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
12130 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
12140 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
12150 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
12160 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69   only active wri
12170 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20  ter .    ** VM, 
12180 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65  then we do eithe
12190 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
121a0 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
121b0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
121c0 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
121d0 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
121e0 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
121f0 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
12200 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
12210 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
12220 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20  has occurred. . 
12230 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73     */.    if( !s
12240 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63  qlite3VtabInSync
12250 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62  (db) .     && db
12260 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20  ->autoCommit .  
12270 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57     && db->nVdbeW
12280 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  rite==(p->readOn
12290 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
122a0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
122b0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
122c0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
122d0 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
122e0 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
122f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12300 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
12310 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
12320 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12330 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
12340 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  EVER(p->readOnly
12350 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
12360 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
12370 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
12380 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12390 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
123a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
123b0 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
123c0 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a  INT_FOREIGNKEY;.
123d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
123e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
123f0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
12400 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
12410 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
12420 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
12430 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
12440 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
12450 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
12460 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
12470 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
12480 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
12490 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
124a0 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
124b0 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
124c0 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
124d0 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
124e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
124f0 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
12500 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
12510 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
12520 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
12530 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
12540 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12550 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
12560 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12570 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
12580 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
12590 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
125a0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
125b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
125c0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
125d0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
125e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
125f0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
12600 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12610 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
12620 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  edCons = 0;.    
12630 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
12640 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
12650 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
12660 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
12670 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20  eferFKs;.       
12680 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
12690 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
126a0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
126b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
126c0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
126d0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
126e0 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70  E_OK);.        p
126f0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
12700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
12710 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
12720 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
12730 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
12740 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
12750 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
12760 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
12770 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
12780 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
12790 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
127a0 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
127b0 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
127c0 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
127d0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
127e0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
127f0 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
12800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12810 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
12820 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
12830 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
12840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
12850 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
12860 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
12870 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
12880 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
12890 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
128a0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
128b0 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  If eStatementOp 
128c0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
128d0 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  n a statement tr
128e0 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
128f0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d  to.    ** be com
12900 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
12910 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69   back. Call sqli
12920 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
12930 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a  ement() to.    *
12940 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73  * do so. If this
12950 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72   operation retur
12960 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  ns an error, and
12970 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
12980 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72  tement.    ** er
12990 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
129a0 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
129b0 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e  CONSTRAINT, then
129c0 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20   promote the.   
129d0 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74   ** current stat
129e0 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ement error code
129f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12a00 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b   eStatementOp ){
12a10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12a20 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
12a30 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d  ement(p, eStatem
12a40 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66  entOp);.      if
12a50 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
12a60 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12a70 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30  E_OK || (p->rc&0
12a80 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
12a90 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
12aa0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
12ab0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12ac0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
12ad0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
12ae0 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
12af0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
12b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
12b10 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
12b20 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
12b30 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
12b40 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
12b50 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
12b60 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
12b70 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
12b80 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
12b90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
12ba0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
12bb0 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
12bc0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
12bd0 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
12be0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
12bf0 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
12c00 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
12c10 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
12c20 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
12c30 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
12c40 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
12c50 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
12c60 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
12c70 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12c80 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
12c90 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
12ca0 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
12cb0 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
12cc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12cd0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
12ce0 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
12cf0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
12d00 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
12d10 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
12d20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
12d30 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
12d40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
12d50 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
12d60 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
12d70 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
12d80 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
12d90 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
12da0 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65  ){.    db->nVdbe
12db0 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66  Active--;.    if
12dc0 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
12dd0 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d   db->nVdbeWrite-
12de0 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49  -;.    if( p->bI
12df0 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56  sReader ) db->nV
12e00 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61  dbeRead--;.    a
12e10 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
12e20 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62  Active>=db->nVdb
12e30 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73  eRead );.    ass
12e40 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65  ert( db->nVdbeRe
12e50 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  ad>=db->nVdbeWri
12e60 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  te );.    assert
12e70 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
12e80 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >=0 );.  }.  p->
12e90 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
12ea0 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
12eb0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
12ec0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
12ed0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
12ee0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
12ef0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
12f00 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
12f10 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
12f20 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
12f30 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
12f40 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
12f50 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
12f60 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
12f70 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
12f80 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
12f90 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
12fa0 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
12fb0 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
12fc0 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
12fd0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
12fe0 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
12ff0 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
13000 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
13010 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
13020 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
13030 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
13040 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
13050 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
13060 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
13070 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
13080 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
13090 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
130a0 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
130b0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
130c0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
130d0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
130e0 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
130f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
13100 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
13110 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
13120 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13130 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
13140 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
13150 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
13160 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
13170 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
13180 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
13190 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
131a0 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
131b0 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
131c0 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
131d0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
131e0 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
131f0 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
13200 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
13210 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
13220 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
13230 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
13240 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
13250 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
13260 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
13270 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
13280 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
13290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
132a0 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
132b0 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
132c0 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
132d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
132e0 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
132f0 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
13300 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
13310 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64   u8 mallocFailed
13320 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
13330 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  led;.    sqlite3
13340 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
13350 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  c();.    if( db-
13360 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70  >pErr==0 ) db->p
13370 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Err = sqlite3Val
13380 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
13390 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
133a0 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
133b0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
133c0 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
133d0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
133e0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
133f0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62  Malloc();.    db
13400 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
13410 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20   mallocFailed;. 
13420 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
13430 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
13440 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
13450 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  b, rc);.  }.  re
13460 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
13470 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
13480 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
13490 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
134a0 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
134b0 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
134c0 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
134d0 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
134e0 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
134f0 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
13500 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
13510 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
13520 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
13530 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
13540 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
13550 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
13560 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
13570 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
13580 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
13590 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
135a0 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
135b0 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
135c0 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
135d0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
135e0 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
135f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13600 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
13610 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
13620 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
13630 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
13640 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
13650 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
13660 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
13670 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
13680 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
13690 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
136a0 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
136b0 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
136c0 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
136d0 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
136e0 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
136f0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
13700 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
13710 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
13720 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
13730 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
13740 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
13750 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
13760 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
13770 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
13780 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
13790 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
137a0 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
137b0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
137c0 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
137d0 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
137e0 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
137f0 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
13800 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
13810 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
13820 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
13830 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
13840 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
13850 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
13860 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
13870 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
13880 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
13890 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
138a0 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
138b0 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
138c0 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
138d0 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
138e0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
138f0 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
13900 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
13910 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
13920 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
13930 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
13940 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
13950 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
13960 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
13970 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
13980 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
13990 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
139a0 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
139b0 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
139c0 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
139d0 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
139e0 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
139f0 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
13a00 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
13a10 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
13a20 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
13a30 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
13a40 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
13a50 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
13a60 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
13a70 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
13a80 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13a90 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
13aa0 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
13ab0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
13ac0 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
13ad0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
13ae0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
13af0 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
13b00 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
13b10 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
13b20 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
13b30 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
13b40 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
13b50 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
13b60 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
13b70 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
13b80 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
13b90 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
13ba0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
13bb0 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
13bc0 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
13bd0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
13be0 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
13bf0 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
13c00 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
13c10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
13c20 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
13c30 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
13c40 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
13c50 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
13c60 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
13c70 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
13c80 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
13c90 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
13ca0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
13cb0 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
13cc0 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
13cd0 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
13ce0 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
13cf0 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
13d00 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
13d10 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
13d20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
13d30 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
13d40 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
13d50 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
13d60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
13d70 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
13d80 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
13d90 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
13da0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
13db0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28  "\n");.      if(
13dc0 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20   p->zSql ){.    
13dd0 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d      char c, pc =
13de0 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   0;.        fpri
13df0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
13e00 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
13e10 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69  ; (c = p->zSql[i
13e20 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
13e30 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27         if( pc=='
13e40 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
13e50 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
13e60 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74       putc(c, out
13e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  );.          pc 
13e80 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = c;.        }. 
13e90 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27         if( pc!='
13ea0 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
13eb0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
13ec0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
13ed0 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
13ee0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48  .        char zH
13ef0 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20  dr[100];.       
13f00 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
13f10 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20  f(sizeof(zHdr), 
13f20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c  zHdr, "%6u %12ll
13f30 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20  u %8llu ",.     
13f40 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
13f50 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
13f60 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
13f70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
13f80 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
13f90 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
13fa0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
13fb0 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
13fc0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
13fd0 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20  , "%s", zHdr);. 
13fe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13ff0 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
14000 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
14010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
14020 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
14030 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
14040 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30  iCurrentTime = 0
14050 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
14060 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
14070 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
14080 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
14090 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
140a0 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
140b0 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
140c0 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
140d0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
140e0 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
140f0 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
14100 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
14110 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
14120 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14130 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
14140 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
14150 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
14160 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
14170 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
14180 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
14190 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
141a0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
141b0 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
141c0 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
141d0 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
141e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
141f0 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
14200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14210 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
14220 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68  r iOp is less th
14230 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  an zero, then in
14240 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
14250 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61  tor for.** all a
14260 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
14270 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79  inters currently
14280 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56   cached by the V
14290 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74  M passed as.** t
142a0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
142b0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  t..**.** Or, if 
142c0 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  iOp is greater t
142d0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
142e0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
142f0 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
14300 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72  only invoked for
14310 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79   those auxiliary
14320 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
14330 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73  reated by the us
14340 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  er .** function 
14350 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f  invoked by the O
14360 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64  P_Function opcod
14370 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  e at instruction
14380 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70   iOp of .** VM p
14390 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  Vdbe, and only t
143a0 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  hen if:.**.**   
143b0 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65   * the associate
143c0 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  d function param
143d0 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64  eter is the 32nd
143e0 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74   or later (count
143f0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ing.**      from
14400 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c   left to right),
14410 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74   or.**.**    * t
14420 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
14430 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74   bit in argument
14440 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28   mask is clear (
14450 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a  where the first.
14460 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  **      function
14470 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65   parameter corre
14480 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20  sponds to bit 0 
14490 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  etc.)..*/.void s
144a0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
144b0 41 75 78 44 61 74 61 28 56 64 62 65 20 2a 70 56  AuxData(Vdbe *pV
144c0 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e  dbe, int iOp, in
144d0 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61  t mask){.  AuxDa
144e0 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65  ta **pp = &pVdbe
144f0 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68  ->pAuxData;.  wh
14500 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20  ile( *pp ){.    
14510 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
14520 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f  *pp;.    if( (iO
14530 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41  p<0).     || (pA
14540 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20  ux->iOp==iOp && 
14550 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c  (pAux->iArg>31 |
14560 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42  | !(mask & MASKB
14570 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29  IT32(pAux->iArg)
14580 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ))).    ){.     
14590 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78 2d   testcase( pAux-
145a0 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20  >iArg==31 );.   
145b0 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
145c0 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
145d0 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
145e0 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
145f0 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
14600 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Aux->pNext;.    
14610 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14620 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29  pVdbe->db, pAux)
14630 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14640 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
14650 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
14660 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
14670 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
14680 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
14690 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
146a0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
146b0 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
146c0 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
146d0 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
146e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
146f0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
14700 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
14710 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
14720 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
14730 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
14740 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
14750 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
14760 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
14770 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
14780 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14790 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
147a0 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
147b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
147c0 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
147d0 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
147e0 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
147f0 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
14800 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
14810 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
14820 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
14830 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
14840 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
14850 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
14860 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
14870 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
14880 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
14890 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
148a0 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
148b0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
148c0 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
148d0 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
148e0 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
148f0 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
14900 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14910 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
14920 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d   for(i=p->nzVar-
14930 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71  1; i>=0; i--) sq
14940 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14950 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20  p->azVar[i]);.  
14960 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
14970 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  db, p->aOp, p->n
14980 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Op);.  sqlite3Db
14990 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
149a0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
149b0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53  DbFree(db, p->zS
149c0 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ql);.  sqlite3Db
149d0 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65  Free(db, p->pFre
149e0 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e);.#ifdef SQLIT
149f0 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
14a00 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69  ANSTATUS.  for(i
14a10 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20  =0; i<p->nScan; 
14a20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
14a30 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
14a40 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
14a50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
14a60 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
14a70 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
14a80 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
14a90 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
14aa0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
14ab0 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
14ac0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
14ad0 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
14ae0 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
14af0 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
14b00 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14b10 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
14b20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14b30 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
14b40 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
14b50 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
14b60 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
14b70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
14b80 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
14b90 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
14ba0 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
14bb0 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
14bc0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
14bd0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
14be0 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
14bf0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
14c00 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
14c10 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
14c20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
14c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
14c40 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
14c50 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
14c60 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
14c70 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
14c80 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
14c90 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
14ca0 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
14cb0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
14cc0 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
14cd0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
14ce0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
14cf0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
14d00 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
14d10 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
14d20 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
14d30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
14d40 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
14d50 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
14d60 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
14d70 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
14d80 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
14d90 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
14da0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
14db0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
14dc0 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  acked(p->pCursor
14dd0 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
14de0 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
14df0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
14e00 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21  n rc;.  if( res!
14e10 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
14e20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
14e30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
14e40 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  EST.  sqlite3_se
14e50 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
14e60 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72  ndif.  p->deferr
14e70 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
14e80 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
14e90 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
14ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74  ;.}../*.** Somet
14ec0 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63  hing has moved c
14ed0 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66  ursor "p" out of
14ee0 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74   place.  Maybe t
14ef0 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a  he row it was.**
14f00 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20   pointed to was 
14f10 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
14f20 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d   under it.  Or m
14f30 61 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77  aybe the btree w
14f40 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64  as.** rebalanced
14f50 2e 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20  .  Whatever the 
14f60 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65  cause, try to re
14f70 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65  store "p" to the
14f80 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20   place it.** is 
14f90 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70  supposed to be p
14fa0 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65  ointing.  If the
14fb0 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64   row was deleted
14fc0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
14fd0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73  the.** cursor, s
14fe0 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  et the cursor to
14ff0 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c   point to a NULL
15000 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
15010 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
15020 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  INE handleMovedC
15030 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72  ursor(VdbeCursor
15040 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69   *p){.  int isDi
15050 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a  fferentRow, rc;.
15060 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 75    assert( p->pCu
15070 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
15080 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
15090 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
150a0 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20  p->pCursor) );. 
150b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
150c0 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
150d0 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 69 73 44  p->pCursor, &isD
150e0 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20  ifferentRow);.  
150f0 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
15100 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
15110 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74 52  if( isDifferentR
15120 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20  ow ) p->nullRow 
15130 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 1;.  return rc
15140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
15150 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
15160 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61  the cursor is va
15170 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68  lid.  Restore th
15180 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e  e cursor.** if n
15190 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20  eed be.  Return 
151a0 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72  any I/O error fr
151b0 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f  om the restore o
151c0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  peration..*/.int
151d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
151e0 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43 75  orRestore(VdbeCu
151f0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rsor *p){.  if( 
15200 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
15210 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
15220 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65  ursor) ){.    re
15230 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64  turn handleMoved
15240 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20  Cursor(p);.  }. 
15250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15260 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
15270 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
15280 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
15290 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
152a0 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
152b0 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
152c0 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
152d0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
152e0 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
152f0 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
15300 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
15310 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
15320 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
15330 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
15340 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
15350 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
15360 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
15370 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
15380 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
15390 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
153a0 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
153b0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
153c0 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
153d0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
153e0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
153f0 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
15400 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
15410 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
15420 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
15430 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
15440 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
15450 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
15460 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
15470 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
15480 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
15490 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
154a0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
154b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
154c0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
154d0 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
154e0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
154f0 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
15500 65 74 6f 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eto ){.    retur
15510 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64  n handleDeferred
15520 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20  Moveto(p);.  }. 
15530 20 69 66 28 20 70 2d 3e 70 43 75 72 73 6f 72 20   if( p->pCursor 
15540 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  && sqlite3BtreeC
15550 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
15560 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  >pCursor) ){.   
15570 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
15580 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
15590 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
155a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
155b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
155c0 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
155d0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
155e0 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
155f0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
15600 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
15610 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
15620 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15630 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74  alPut().** sqlit
15640 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
15650 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
15660 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
15670 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
15680 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
15690 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
156a0 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
156b0 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
156c0 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
156d0 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
156e0 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
156f0 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
15700 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
15710 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
15720 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
15730 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
15740 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
15750 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
15760 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
15770 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
15780 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
15790 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
157a0 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
157b0 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
157c0 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
157d0 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
157e0 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
157f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
15800 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
15810 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
15820 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
15830 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
15840 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
15850 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
15860 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
15870 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
15880 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  separately..**.*
15890 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
158a0 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
158b0 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
158c0 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
158d0 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
158e0 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
158f0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
15900 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
15910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
15920 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
15930 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
15940 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
15970 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15990 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
159a0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
159b0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
159c0 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
159d0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
159e0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
159f0 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
15a00 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
15a10 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
15a20 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a40 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
15a50 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
15a60 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
15a70 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
15a80 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
15a90 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
15aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ab0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
15ac0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
15ad0 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
15af0 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
15b00 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
15b30 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
15b40 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b60 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
15b70 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
15b80 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
15bb0 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
15bc0 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
15bd0 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
15be0 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
15bf0 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
15c00 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
15c10 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
15c20 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
15c30 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
15c40 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
15c50 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
15c60 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
15c70 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
15c80 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
15c90 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
15ca0 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
15cb0 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
15cc0 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
15cd0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
15ce0 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
15cf0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
15d00 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
15d10 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
15d20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d  int flags = pMem
15d30 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e  ->flags;.  u32 n
15d40 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  ;..  if( flags&M
15d50 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
15d60 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
15d70 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
15d80 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
15d90 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
15da0 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
15db0 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
15dc0 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
15dd0 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
15de0 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
15df0 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
15e00 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
15e10 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b  ;.    if( i<0 ){
15e20 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20  .      u = ~i;. 
15e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15e40 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u = i;.    }.   
15e50 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20   if( u<=127 ){. 
15e60 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 69 26       return ((i&
15e70 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f  1)==i && file_fo
15e80 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33  rmat>=4) ? 8+(u3
15e90 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20  2)u : 1;.    }. 
15ea0 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
15eb0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
15ec0 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
15ed0 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
15ee0 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
15ef0 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
15f00 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
15f10 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
15f20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
15f30 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
15f40 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
15f50 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
15f60 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61  rt( pMem->db->ma
15f70 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c  llocFailed || fl
15f80 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
15f90 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65  _Blob) );.  asse
15fa0 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29  rt( pMem->n>=0 )
15fb0 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65  ;.  n = (u32)pMe
15fc0 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
15fd0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
15fe0 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
15ff0 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 72 65  .nZero;.  }.  re
16000 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
16010 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
16020 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
16030 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
16040 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
16050 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
16060 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
16070 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75  erial-type..*/.u
16080 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
16090 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
160a0 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
160b0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
160c0 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =12 ){.    retur
160d0 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
160e0 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
160f0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
16100 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30  u8 aSize[] = { 0
16110 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c  , 1, 2, 3, 4, 6,
16120 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20   8, 8, 0, 0, 0, 
16130 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 };.    return 
16140 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70  aSize[serial_typ
16150 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e];.  }.}../*.**
16160 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
16170 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
16180 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
16190 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
161a0 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
161b0 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
161c0 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
161d0 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
161e0 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
161f0 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
16200 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
16210 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
16220 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
16230 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
16240 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
16250 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
16260 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
16270 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
16280 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
16290 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
162a0 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
162b0 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
162c0 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
162d0 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
162e0 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
162f0 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
16300 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
16310 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
16320 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
16330 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
16340 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
16350 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
16360 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
16370 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
16380 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
16390 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
163a0 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
163b0 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
163c0 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
163d0 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
163e0 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
163f0 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
16400 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
16410 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
16420 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
16430 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
16440 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
16450 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
16460 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
16470 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
16480 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
16490 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
164a0 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
164b0 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
164c0 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
164d0 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
164e0 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
164f0 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
16500 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
16510 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
16520 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
16530 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
16540 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
16550 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
16560 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
16570 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
16580 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
16590 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
165a0 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
165b0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
165c0 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
165d0 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
165e0 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
165f0 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
16600 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
16610 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
16620 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
16630 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
16640 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
16650 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
16660 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
16670 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
16680 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
16690 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
166a0 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
166b0 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
166c0 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
166d0 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
166e0 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
166f0 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
16700 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
16710 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
16720 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
16730 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
16740 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
16750 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
16760 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
16770 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
16780 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
16790 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
167a0 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
167b0 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
167c0 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
167d0 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
167e0 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
167f0 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
16800 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
16810 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
16820 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
16830 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
16840 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
16850 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
16860 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
16870 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
16880 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
16890 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
168a0 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
168b0 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
168c0 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
168d0 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
168e0 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
168f0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
16900 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
16910 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
16920 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
16930 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
16940 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
16950 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
16960 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
16970 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
16980 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
16990 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
169a0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
169b0 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
169c0 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
169d0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
169e0 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
169f0 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  .  The caller is
16a00 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20   responsible.** 
16a10 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65  for allocating e
16a20 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62  nough space to b
16a30 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65  uf[] to hold the
16a40 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65   entire field, e
16a50 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74  xclusive.** of t
16a60 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  he pMem->u.nZero
16a70 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d   bytes for a MEM
16a80 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  _Zero value..**.
16a90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
16aa0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
16ab0 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
16ac0 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
16ad0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
16ae0 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
16af0 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
16b00 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
16b10 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
16b20 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
16b30 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
16b40 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
16b50 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16b60 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65  lPut(u8 *buf, Me
16b70 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72  m *pMem, u32 ser
16b80 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32  ial_type){.  u32
16b90 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
16ba0 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
16bb0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
16bc0 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
16bd0 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
16be0 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
16bf0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
16c00 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
16c10 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
16c20 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  ==sizeof(pMem->u
16c30 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  .r) );.      mem
16c40 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75  cpy(&v, &pMem->u
16c50 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  .r, sizeof(v));.
16c60 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
16c70 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
16c80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16c90 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
16ca0 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
16cb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
16cc0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
16cd0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
16ce0 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
16cf0 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d   do{.      buf[-
16d00 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  -i] = (u8)(v&0xF
16d10 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
16d20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  8;.    }while( i
16d30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c   );.    return l
16d40 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
16d50 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
16d60 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
16d70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
16d80 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
16d90 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
16da0 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
16db0 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
16dc0 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73         == (int)s
16dd0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16de0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
16df0 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20  ype) );.    len 
16e00 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d  = pMem->n;.    m
16e10 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
16e20 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65  >z, len);.    re
16e30 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
16e40 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
16e50 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
16e60 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
16e70 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61  * Input "x" is a
16e80 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73   sequence of uns
16e90 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73  igned characters
16ea0 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20   that represent 
16eb0 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20  a.** big-endian 
16ec0 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e  integer.  Return
16ed0 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
16ee0 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a  native integer.*
16ef0 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59  /.#define ONE_BY
16f00 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69  TE_INT(x)    ((i
16f10 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e  8)(x)[0]).#defin
16f20 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78  e TWO_BYTE_INT(x
16f30 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28  )    (256*(i8)((
16f40 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23  x)[0])|(x)[1]).#
16f50 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54  define THREE_BYT
16f60 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36  E_INT(x)  (65536
16f70 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
16f80 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d  x)[1]<<8)|(x)[2]
16f90 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
16fa0 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28  YTE_UINT(x)  (((
16fb0 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c  u32)(x)[0]<<24)|
16fc0 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78  ((x)[1]<<16)|((x
16fd0 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29  )[2]<<8)|(x)[3])
16fe0 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59  .#define FOUR_BY
16ff0 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37  TE_INT(x) (16777
17000 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  216*(i8)((x)[0])
17010 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
17020 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
17030 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  )../*.** Deseria
17040 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
17050 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
17060 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
17070 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
17080 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
17090 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
170a0 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
170b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
170c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
170d0 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  nction is implem
170e0 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70  ented as two sep
170f0 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66  arate routines f
17100 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  or performance..
17110 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73  ** The few cases
17120 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f   that require lo
17130 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72  cal variables ar
17140 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
17150 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20  o a separate.** 
17160 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20  routine so that 
17170 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68  in most cases th
17180 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f  e overhead of mo
17190 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70  ving the stack p
171a0 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f  ointer.** is avo
171b0 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ided..*/ .static
171c0 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   u32 SQLITE_NOIN
171d0 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a  LINE serialGet(.
171e0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
171f0 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
17200 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
17210 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
17220 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
17230 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
17240 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
17250 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
17260 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
17290 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
172a0 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34  into */.){.  u64
172b0 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
172c0 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20  INT(buf);.  u32 
172d0 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
172e0 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d  NT(buf+4);.  x =
172f0 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20   (x<<32) + y;.  
17300 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
17310 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  =6 ){.    /* EVI
17320 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35  DENCE-OF: R-2985
17330 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69 73  1-52272 Value is
17340 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34   a big-endian 64
17350 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73  -bit.    ** twos
17360 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
17370 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  ger. */.    pMem
17380 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
17390 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  x;.    pMem->fla
173a0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
173b0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
173c0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c  ->u.i<0 );.  }el
173d0 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  se{.    /* EVIDE
173e0 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d  NCE-OF: R-57343-
173f0 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20 61  49114 Value is a
17400 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45   big-endian IEEE
17410 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74   754-2008 64-bit
17420 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67  .    ** floating
17430 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a   point number. *
17440 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
17450 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
17460 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
17470 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
17480 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
17490 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
174a0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
174b0 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
174c0 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72  e.    ** byte or
174d0 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
174e0 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
174f0 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
17500 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  T is.    ** defi
17510 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20  ned that 64-bit 
17520 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
17530 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65  alues really are
17540 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e   mixed.    ** en
17550 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dian..    */.   
17560 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
17570 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
17580 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
17590 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
175a0 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
175b0 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
175c0 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
175d0 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20  dianFloat(t2);. 
175e0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
175f0 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32  f(r1)==sizeof(t2
17600 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c  ) && memcmp(&r1,
17610 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29   &t2, sizeof(r1)
17620 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20  )==0 );.#endif. 
17630 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
17640 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
17650 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20  f(pMem->u.r)==8 
17660 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  );.    swapMixed
17670 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a  EndianFloat(x);.
17680 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
17690 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  ->u.r, &x, sizeo
176a0 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  f(x));.    pMem-
176b0 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
176c0 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29  IsNaN(pMem->u.r)
176d0 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
176e0 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65  M_Real;.  }.  re
176f0 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71  turn 8;.}.u32 sq
17700 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
17710 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
17720 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
17730 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
17740 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
17750 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
17760 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
17770 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
17780 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
17790 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
177a0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
177b0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
177c0 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
177d0 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
177e0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
177f0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
17800 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
17810 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
17820 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
17830 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
17840 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
17850 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
17860 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20   /* Null */.    
17870 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17880 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20  : R-24078-09375 
17890 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e  Value is a NULL.
178a0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
178b0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
178c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
178d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
178e0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
178f0 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35  ENCE-OF: R-44885
17900 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73 20  -25196 Value is 
17910 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f  an 8-bit twos-co
17920 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  mplement.      *
17930 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  * integer. */.  
17940 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
17950 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  ONE_BYTE_INT(buf
17960 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
17970 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
17980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17990 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
179a0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
179b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
179c0 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
179d0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
179e0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
179f0 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30  -OF: R-49794-350
17a00 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  26 Value is a bi
17a10 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a  g-endian 16-bit.
17a20 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
17a30 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
17a40 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
17a50 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f  >u.i = TWO_BYTE_
17a60 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
17a70 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
17a80 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
17a90 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
17aa0 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
17ab0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
17ac0 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
17ad0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
17ae0 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
17af0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
17b00 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20  839-54301 Value 
17b10 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
17b20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  24-bit.      ** 
17b30 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
17b40 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
17b50 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48    pMem->u.i = TH
17b60 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  REE_BYTE_INT(buf
17b70 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
17b80 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
17b90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
17ba0 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
17bb0 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
17bc0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
17bd0 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
17be0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
17bf0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
17c00 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30  -OF: R-01849-260
17c10 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  79 Value is a bi
17c20 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a  g-endian 32-bit.
17c30 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
17c40 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
17c50 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
17c60 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
17c70 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
17c80 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
17c90 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
17ca0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
17cb0 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
17cc0 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 4;.    }.   
17cd0 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
17ce0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
17cf0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
17d00 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
17d10 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65  0385-09674 Value
17d20 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
17d30 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   48-bit.      **
17d40 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
17d50 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
17d60 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46     pMem->u.i = F
17d70 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
17d80 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  f+2) + (((i64)1)
17d90 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
17da0 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
17db0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
17dc0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
17dd0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
17de0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
17df0 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
17e00 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
17e10 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
17e20 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
17e30 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
17e40 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
17e50 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20     /* These use 
17e60 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c  local variables,
17e70 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61   so do them in a
17e80 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e   separate routin
17e90 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76  e.      ** to av
17ea0 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f  oid having to mo
17eb0 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69  ve the frame poi
17ec0 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d  nter in the comm
17ed0 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20  on case */.     
17ee0 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65   return serialGe
17ef0 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70  t(buf,serial_typ
17f00 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  e,pMem);.    }. 
17f10 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
17f20 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
17f30 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
17f40 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
17f50 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
17f60 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33  F: R-12976-22893
17f70 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e   Value is the in
17f80 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20  teger 0. */.    
17f90 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17fa0 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20  : R-18143-12121 
17fb0 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74  Value is the int
17fc0 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20  eger 1. */.     
17fd0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72   pMem->u.i = ser
17fe0 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20  ial_type-8;.    
17ff0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
18000 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
18010 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
18020 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
18030 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18040 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36  OF: R-14606-3156
18050 34 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f  4 Value is a BLO
18060 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29  B that is (N-12)
18070 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20  /2 bytes in.    
18080 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20    ** length..   
18090 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
180a0 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30  F: R-28401-00140
180b0 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   Value is a stri
180c0 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74 20 65  ng in the text e
180d0 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20  ncoding and.    
180e0 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79    ** (N-13)/2 by
180f0 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a  tes in length. *
18100 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
18110 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d  onst u16 aFlag[]
18120 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45   = { MEM_Blob|ME
18130 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72  M_Ephem, MEM_Str
18140 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20  |MEM_Ephem };.  
18150 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
18160 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20  har *)buf;.     
18170 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69   pMem->n = (seri
18180 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
18190 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
181a0 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f   = aFlag[serial_
181b0 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72  type&1];.      r
181c0 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  eturn pMem->n;. 
181d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
181e0 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69  n 0;.}./*.** Thi
181f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
18200 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75  d to allocate su
18210 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66  fficient space f
18220 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65  or an UnpackedRe
18230 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72  cord.** structur
18240 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  e large enough t
18250 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73  o be used with s
18260 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
18270 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74  Unpack() if.** t
18280 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
18290 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
182a0 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  o KeyInfo struct
182b0 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a  ure pKeyInfo..**
182c0 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73  .** The space is
182d0 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65   either allocate
182e0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  d using sqlite3D
182f0 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20  bMallocRaw() or 
18300 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74  from within.** t
18310 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66  he unaligned buf
18320 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74  fer passed via t
18330 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68  he second and th
18340 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70  ird arguments (p
18350 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61  resumably.** sta
18360 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68  ck space). If th
18370 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a  e former, then *
18380 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f  ppFree is set to
18390 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20   a pointer that 
183a0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65  should.** be eve
183b0 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79  ntually freed by
183c0 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
183d0 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  g sqlite3DbFree(
183e0 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a  ). Or, if the .*
183f0 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d  * allocation com
18400 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61  es from the pSpa
18410 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65  ce/szSpace buffe
18420 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65  r, *ppFree is se
18430 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66  t to NULL.** bef
18440 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
18450 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
18460 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
18470 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
18480 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  /.UnpackedRecord
18490 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c   *sqlite3VdbeAll
184a0 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
184b0 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
184c0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
184d0 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
184e0 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  on of the record
184f0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61   */.  char *pSpa
18500 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
18510 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e        /* Unalign
18520 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ed space availab
18530 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70  le */.  int szSp
18540 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
18550 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
18560 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62  of pSpace[] in b
18570 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
18580 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20 20  *ppFree         
18590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
185a0 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  : Caller should 
185b0 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65  free this pointe
185c0 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b  r */.){.  Unpack
185d0 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20  edRecord *p;    
185e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70            /* Unp
185f0 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20  acked record to 
18600 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
18610 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  nOff;           
18620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
18630 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20  ncrement pSpace 
18640 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e  by nOff to align
18650 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79   it */.  int nBy
18660 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
18670 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18680 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75  er of bytes requ
18690 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a  ired for *p */..
186a0 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20    /* We want to 
186b0 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65  shift the pointe
186c0 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68  r pSpace up such
186d0 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79   that it is 8-by
186e0 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a  te aligned..  **
186f0 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74   Thus, we need t
18700 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61  o calculate a va
18710 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65  lue, nOff, betwe
18720 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73  en 0 and 7, to s
18730 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79  hift .  ** it by
18740 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20  .  If pSpace is 
18750 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61  already 8-byte a
18760 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f  ligned, nOff sho
18770 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a  uld be zero..  *
18780 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20  /.  nOff = (8 - 
18790 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
187a0 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29  NT(pSpace) & 7))
187b0 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20   & 7;.  nByte = 
187c0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
187d0 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b  packedRecord)) +
187e0 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b   sizeof(Mem)*(pK
187f0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31  eyInfo->nField+1
18800 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73  );.  if( nByte>s
18810 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20  zSpace+nOff ){. 
18820 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
18830 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33  Record *)sqlite3
18840 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
18850 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
18860 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20  ;.    *ppFree = 
18870 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69  (char *)p;.    i
18880 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
18890 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
188a0 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
188b0 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66  rd*)&pSpace[nOff
188c0 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  ];.    *ppFree =
188d0 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d   0;.  }..  p->aM
188e0 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68  em = (Mem*)&((ch
188f0 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69  ar*)p)[ROUND8(si
18900 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
18910 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74  ord))];.  assert
18920 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
18930 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70  tOrder!=0 );.  p
18940 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
18950 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65  yInfo;.  p->nFie
18960 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
18970 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74  Field + 1;.  ret
18980 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
18990 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62  Given the nKey-b
189a0 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  yte encoding of 
189b0 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79  a record in pKey
189c0 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  [], populate the
189d0 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63   .** UnpackedRec
189e0 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e  ord structure in
189f0 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
18a00 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77  ourth argument w
18a10 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ith the.** conte
18a20 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64  nts of the decod
18a30 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76  ed record..*/ .v
18a40 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
18a50 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b  ecordUnpack(.  K
18a60 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
18a70 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ,     /* Informa
18a80 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
18a90 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a  ecord format */.
18aa0 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
18ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
18ac0 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72   of the binary r
18ad0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
18ae0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
18af0 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20    /* The binary 
18b00 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61  record */.  Unpa
18b10 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20  ckedRecord *p   
18b20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
18b30 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65  his structure be
18b40 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
18b50 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  */.){.  const un
18b60 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
18b70 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
18b80 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b  ned char *)pKey;
18b90 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32  .  int d; .  u32
18ba0 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18bc0 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d  Offset in aKey[]
18bd0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
18be0 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20  .  u16 u;       
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
18c10 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
18c20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65   u32 szHdr;.  Me
18c30 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65  m *pMem = p->aMe
18c40 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74  m;..  p->default
18c50 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  _rc = 0;.  asser
18c60 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
18c70 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b  IGNMENT(pMem) );
18c80 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
18c90 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
18ca0 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a  );.  d = szHdr;.
18cb0 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    u = 0;.  while
18cc0 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64  ( idx<szHdr && d
18cd0 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33  <=nKey ){.    u3
18ce0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
18cf0 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
18d00 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78  rint32(&aKey[idx
18d10 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
18d20 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
18d30 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
18d40 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70      pMem->db = p
18d50 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
18d60 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20   /* pMem->flags 
18d70 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56  = 0; // sqlite3V
18d80 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77  dbeSerialGet() w
18d90 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72  ill set this for
18da0 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   us */.    pMem-
18db0 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  >szMalloc = 0;. 
18dc0 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a     pMem->z = 0;.
18dd0 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
18de0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
18df0 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
18e00 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
18e10 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20  pMem++;.    if( 
18e20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64  (++u)>=p->nField
18e30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
18e40 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
18e50 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
18e60 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
18e70 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54   u;.}..#if SQLIT
18e80 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
18e90 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
18ea0 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f  ares two index o
18eb0 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b  r table record k
18ec0 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  eys in the same 
18ed0 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71  way.** as the sq
18ee0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
18ef0 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65  ompare() routine
18f00 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63  . Unlike VdbeRec
18f10 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a  ordCompare(),.**
18f20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
18f30 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20  eserializes and 
18f40 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20  compares values 
18f50 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c  using the.** sql
18f60 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
18f70 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d  t() and sqlite3M
18f80 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63  emCompare() func
18f90 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65  tions. It is use
18fa0 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  d.** in assert()
18fb0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
18fc0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f  nsure that the o
18fd0 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e  ptimized code in
18fe0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52  .** sqlite3VdbeR
18ff0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72  ecordCompare() r
19000 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77  eturns results w
19010 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72  ith these two pr
19020 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20  imitives..**.** 
19030 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
19040 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
19050 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76  parison is equiv
19060 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64  alent to desired
19070 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72  Result..** Retur
19080 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65  n false if there
19090 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65   is a disagreeme
190a0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
190b0 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
190c0 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20  areDebug(.  int 
190d0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
190e0 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
190f0 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  t key */.  const
19100 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
19110 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68  *pPKey2, /* Righ
19120 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64  t key */.  int d
19130 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20  esiredResult    
19140 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
19150 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b  ect answer */.){
19160 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
19170 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
19180 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
19190 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
191a0 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
191b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
191c0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
191d0 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
191e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
191f0 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
19200 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
19210 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
19220 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
19230 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
19240 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19250 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
19260 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
19270 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
19280 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
19290 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
192a0 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
192b0 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65  yInfo;.  if( pKe
192c0 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72  yInfo->db==0 ) r
192d0 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e  eturn 1;.  mem1.
192e0 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
192f0 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d  enc;.  mem1.db =
19300 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
19310 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d   /* mem1.flags =
19320 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20   0;  // Will be 
19330 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73  initialized by s
19340 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
19350 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f  Get() */.  VVA_O
19360 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  NLY( mem1.szMall
19370 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
19380 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
19390 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
193a0 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65  */..  /* Compile
193b0 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20  rs may complain 
193c0 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73  that mem1.u.i is
193d0 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69   potentially uni
193e0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
193f0 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61   We could initia
19400 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77  lize it, as show
19410 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e  n here, to silen
19420 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69  ce those complai
19430 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e  nts..  ** But in
19440 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20   fact, mem1.u.i 
19450 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61  will never actua
19460 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e  lly be used unin
19470 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64  itialized, and d
19480 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75  oing .  ** the u
19490 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69  nnecessary initi
194a0 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20  alization has a 
194b0 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74  measurable negat
194c0 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ive performance.
194d0 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e    ** impact, sin
194e0 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
194f0 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72  is a very high r
19500 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20  unner.  And so, 
19510 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74  we choose.  ** t
19520 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d  o ignore the com
19530 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61  piler warnings a
19540 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61  nd leave this va
19550 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c  riable uninitial
19560 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20  ized..  */.  /* 
19570 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20   mem1.u.i = 0;  
19580 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68  // not needed, h
19590 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63  ere to silence c
195a0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20  ompiler warning 
195b0 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  */.  .  idx1 = g
195c0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
195d0 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20  , szHdr1);.  d1 
195e0 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
195f0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
19600 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ield+pKeyInfo->n
19610 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
19620 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50  nField || CORRUP
19630 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
19640 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
19650 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
19660 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
19670 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
19680 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
19690 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
196a0 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
196b0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
196c0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
196d0 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
196e0 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
196f0 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
19700 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
19710 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
19720 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
19730 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
19740 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
19750 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
19760 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
19770 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
19780 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
19790 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
197a0 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
197b0 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
197c0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
197d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
197e0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
197f0 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
19800 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
19810 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
19820 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
19830 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
19840 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
19850 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
19860 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
19870 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
19880 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
19890 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  f( d1+serial_typ
198a0 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a  e1+2>(u32)nKey1.
198b0 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74       && d1+sqlit
198c0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
198d0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
198e0 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20  )>(u32)nKey1 .  
198f0 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
19900 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19910 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
19920 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
19930 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
19940 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
19950 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
19960 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
19970 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
19980 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
19990 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
199a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
199b0 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
199c0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20  PKey2->aMem[i], 
199d0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
199e0 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
199f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
19a00 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
19a10 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
19a20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
19a30 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
19a40 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
19a50 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
19a60 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65   = -rc;  /* Inve
19a70 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f  rt the result fo
19a80 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  r DESC sort orde
19a90 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  r. */.      }.  
19aa0 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f      goto debugCo
19ab0 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a  mpareEnd;.    }.
19ac0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c      i++;.  }whil
19ad0 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
19ae0 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
19af0 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ld );..  /* No m
19b00 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
19b10 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
19b20 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
19b30 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
19b40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
19b50 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
19b60 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
19b70 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
19b80 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
19b90 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
19ba0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
19bb0 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
19bc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
19bd0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
19be0 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
19bf0 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
19c00 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
19c10 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
19c20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
19c30 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
19c40 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
19c50 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
19c60 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
19c70 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20  value.  */.  rc 
19c80 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
19c90 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70  t_rc;..debugComp
19ca0 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65  areEnd:.  if( de
19cb0 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26  siredResult==0 &
19cc0 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  & rc==0 ) return
19cd0 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
19ce0 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c  dResult<0 && rc<
19cf0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
19d00 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
19d10 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65  t>0 && rc>0 ) re
19d20 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f  turn 1;.  if( CO
19d30 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
19d40 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  n 1;.  if( pKeyI
19d50 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
19d60 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
19d70 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
19d80 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
19d90 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43  TE_DEBUG./*.** C
19da0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
19db0 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61  of fields (a.k.a
19dc0 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68  . columns) in th
19dd0 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62  e record given b
19de0 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20  y.** pKey,nKey. 
19df0 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61 74   The verify that
19e00 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c   this count is l
19e10 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
19e20 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69  l to the.** limi
19e30 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49  t given by pKeyI
19e40 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b  nfo->nField + pK
19e50 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e  eyInfo->nXField.
19e60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63  .**.** If this c
19e70 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74  onstraint is not
19e80 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d   satisfied, it m
19e90 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68 69  eans that the hi
19ea0 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65  gh-speed.** vdbe
19eb0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
19ec0 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72  () and vdbeRecor
19ed0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
19ee0 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a   routines will.*
19ef0 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  * not work corre
19f00 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61  ctly.  If this a
19f10 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69 72  ssert() ever fir
19f20 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20  es, it probably 
19f30 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68  means.** that th
19f40 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64  e KeyInfo.nField
19f50 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69   or KeyInfo.nXFi
19f60 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20  eld values were 
19f70 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f  computed.** inco
19f80 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
19f90 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65  ic void vdbeAsse
19fa0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
19fb0 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20  inLimits(.  int 
19fc0 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64  nKey, const void
19fd0 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
19fe0 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66   record to verif
19ff0 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65  y */ .  const Ke
1a000 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1a010 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
1a020 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20   size with this 
1a030 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20  KeyInfo */.){.  
1a040 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a  int nField = 0;.
1a050 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75    u32 szHdr;.  u
1a060 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f  32 idx;.  u32 no
1a070 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75  tUsed;.  const u
1a080 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1a090 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1a0a0 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b  gned char*)pKey;
1a0b0 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ..  if( CORRUPT_
1a0c0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1a0d0 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1a0e0 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1a0f0 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30   assert( nKey>=0
1a100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
1a110 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29  Hdr<=(u32)nKey )
1a120 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1a130 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20  zHdr ){.    idx 
1a140 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61  += getVarint32(a
1a150 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64  Key+idx, notUsed
1a160 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b  );.    nField++;
1a170 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
1a180 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66  Field <= pKeyInf
1a190 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
1a1a0 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d  fo->nXField );.}
1a1b0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1a1c0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1a1d0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1a1e0 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a  (A,B,C).#endif..
1a1f0 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d  /*.** Both *pMem
1a200 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e  1 and *pMem2 con
1a210 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75  tain string valu
1a220 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  es. Compare the 
1a230 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73  two values.** us
1a240 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
1a250 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
1a260 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75  . As usual, retu
1a270 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20  rn a negative , 
1a280 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
1a290 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d  ive value if *pM
1a2a0 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1a2b0 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72  , equal to or gr
1a2c0 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a  eater than .** *
1a2d0 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76  pMem2, respectiv
1a2e0 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20  ely. Similar in 
1a2f0 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20  spirit to "rc = 
1a300 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65  (*pMem1) - (*pMe
1a310 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  m2);"..*/.static
1a320 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65   int vdbeCompare
1a330 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e  MemString(.  con
1a340 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20  st Mem *pMem1,. 
1a350 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1a360 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  2,.  const CollS
1a370 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20  eq *pColl,.  u8 
1a380 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20 20  *prcErr         
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a3a0 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
1a3b0 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  , set to SQLITE_
1a3c0 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66  NOMEM */.){.  if
1a3d0 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43  ( pMem1->enc==pC
1a3e0 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
1a3f0 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 61  /* The strings a
1a400 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  re already in th
1a410 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69  e correct encodi
1a420 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20  ng.  Call the.  
1a430 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
1a440 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74   function direct
1a450 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
1a460 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1a470 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d  ll->pUser,pMem1-
1a480 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d  >n,pMem1->z,pMem
1a490 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a  2->n,pMem2->z);.
1a4a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1a4b0 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76   rc;.    const v
1a4c0 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20  oid *v1, *v2;.  
1a4d0 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20    int n1, n2;.  
1a4e0 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65    Mem c1;.    Me
1a4f0 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65  m c2;.    sqlite
1a500 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31  3VdbeMemInit(&c1
1a510 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d  , pMem1->db, MEM
1a520 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
1a530 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1a540 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c2, pMem1->db, M
1a550 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
1a560 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1a570 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65  lowCopy(&c1, pMe
1a580 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m1, MEM_Ephem);.
1a590 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1a5a0 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1a5b0 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70  2, pMem2, MEM_Ep
1a5c0 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73  hem);.    v1 = s
1a5d0 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1a5e0 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
1a5f0 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c1, pColl->enc)
1a600 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30  ;.    n1 = v1==0
1a610 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20   ? 0 : c1.n;.   
1a620 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v2 = sqlite3Val
1a630 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1a640 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c  value*)&c2, pCol
1a650 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20  l->enc);.    n2 
1a660 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32  = v2==0 ? 0 : c2
1a670 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f  .n;.    rc = pCo
1a680 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
1a690 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e  pUser, n1, v1, n
1a6a0 32 2c 20 76 32 29 3b 0a 20 20 20 20 73 71 6c 69  2, v2);.    sqli
1a6b0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1a6c0 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69  e(&c1);.    sqli
1a6d0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1a6e0 65 28 26 63 32 29 3b 0a 20 20 20 20 69 66 28 20  e(&c2);.    if( 
1a6f0 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29  (v1==0 || v2==0)
1a700 20 26 26 20 70 72 63 45 72 72 20 29 20 2a 70 72   && prcErr ) *pr
1a710 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  cErr = SQLITE_NO
1a720 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  MEM;.    return 
1a730 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rc;.  }.}../*.**
1a740 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f   Compare two blo
1a750 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61  bs.  Return nega
1a760 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
1a770 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
1a780 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20  irst.** is less 
1a790 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1a7a0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1a7b0 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70  the second, resp
1a7c0 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20  ectively..** If 
1a7d0 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72  one blob is a pr
1a7e0 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65  efix of the othe
1a7f0 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72  r, then the shor
1a800 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f  ter is the lesso
1a810 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  r..*/.static SQL
1a820 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
1a830 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1a840 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
1a850 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  B1, const Mem *p
1a860 42 32 29 7b 0a 20 20 69 6e 74 20 63 20 3d 20 6d  B2){.  int c = m
1a870 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42  emcmp(pB1->z, pB
1a880 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70 42 32  2->z, pB1->n>pB2
1a890 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a 20 70  ->n ? pB2->n : p
1a8a0 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 63 20  B1->n);.  if( c 
1a8b0 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65  ) return c;.  re
1a8c0 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d 20 70 42  turn pB1->n - pB
1a8d0 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  2->n;.}.../*.** 
1a8e0 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  Compare the valu
1a8f0 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20  es contained by 
1a900 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63  the two memory c
1a910 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a  ells, returning.
1a920 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  ** negative, zer
1a930 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  o or positive if
1a940 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74   pMem1 is less t
1a950 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
1a960 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61  r greater.** tha
1a970 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67  n pMem2. Sorting
1a980 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73   order is NULL's
1a990 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64   first, followed
1a9a0 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74   by numbers (int
1a9b0 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61  egers.** and rea
1a9c0 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72  ls) sorted numer
1a9d0 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64  ically, followed
1a9e0 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64   by text ordered
1a9f0 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   by the collatin
1aa00 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43  g.** sequence pC
1aa10 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  oll and finally 
1aa20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62  blob's ordered b
1aa30 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a  y memcmp()..**.*
1aa40 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  * Two NULL value
1aa50 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1aa60 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66   equal by this f
1aa70 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1aa80 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1aa90 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  e(const Mem *pMe
1aaa0 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  m1, const Mem *p
1aab0 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c  Mem2, const Coll
1aac0 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69  Seq *pColl){.  i
1aad0 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74  nt f1, f2;.  int
1aae0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b   combined_flags;
1aaf0 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e  ..  f1 = pMem1->
1ab00 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d  flags;.  f2 = pM
1ab10 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f  em2->flags;.  co
1ab20 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66  mbined_flags = f
1ab30 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20  1|f2;.  assert( 
1ab40 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20  (combined_flags 
1ab50 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
1ab60 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e   );. .  /* If on
1ab70 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c  e value is NULL,
1ab80 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1ab90 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62   the other. If b
1aba0 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20  oth values.  ** 
1abb0 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  are NULL, return
1abc0 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63   0..  */.  if( c
1abd0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1abe0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
1abf0 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c  turn (f2&MEM_Nul
1ac00 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c  l) - (f1&MEM_Nul
1ac10 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  l);.  }..  /* If
1ac20 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20   one value is a 
1ac30 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 6f  number and the o
1ac40 74 68 65 72 20 69 73 20 6e 6f 74 2c 20 74 68 65  ther is not, the
1ac50 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 2e   number is less.
1ac60 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72  .  ** If both ar
1ac70 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d 70 61  e numbers, compa
1ac80 72 65 20 61 73 20 72 65 61 6c 73 20 69 66 20 6f  re as reals if o
1ac90 6e 65 20 69 73 20 61 20 72 65 61 6c 2c 20 6f 72  ne is a real, or
1aca0 20 61 73 20 69 6e 74 65 67 65 72 73 0a 20 20 2a   as integers.  *
1acb0 2a 20 69 66 20 62 6f 74 68 20 76 61 6c 75 65 73  * if both values
1acc0 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e 0a 20   are integers.. 
1acd0 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1ace0 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e  ed_flags&(MEM_In
1acf0 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20  t|MEM_Real) ){. 
1ad00 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20 72 32     double r1, r2
1ad10 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  ;.    if( (f1 & 
1ad20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  f2 & MEM_Int)!=0
1ad30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
1ad40 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32  em1->u.i < pMem2
1ad50 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d  ->u.i ) return -
1ad60 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
1ad70 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d  m1->u.i > pMem2-
1ad80 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 31 3b  >u.i ) return 1;
1ad90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1ada0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1adb0 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f1&MEM_Real)!=0 
1adc0 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 70 4d  ){.      r1 = pM
1add0 65 6d 31 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d 65  em1->u.r;.    }e
1ade0 6c 73 65 20 69 66 28 20 28 66 31 26 4d 45 4d 5f  lse if( (f1&MEM_
1adf0 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1ae00 20 72 31 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d   r1 = (double)pM
1ae10 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65  em1->u.i;.    }e
1ae20 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
1ae30 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
1ae40 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29  f( (f2&MEM_Real)
1ae50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20  !=0 ){.      r2 
1ae60 3d 20 70 4d 65 6d 32 2d 3e 75 2e 72 3b 0a 20 20  = pMem2->u.r;.  
1ae70 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 32 26    }else if( (f2&
1ae80 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1ae90 20 20 20 20 20 72 32 20 3d 20 28 64 6f 75 62 6c       r2 = (doubl
1aea0 65 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20  e)pMem2->u.i;.  
1aeb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1aec0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
1aed0 20 20 20 20 69 66 28 20 72 31 3c 72 32 20 29 20      if( r1<r2 ) 
1aee0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1aef0 66 28 20 72 31 3e 72 32 20 29 20 72 65 74 75 72  f( r1>r2 ) retur
1af00 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 1;.    return 
1af10 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
1af20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73  one value is a s
1af30 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74  tring and the ot
1af40 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74  her is a blob, t
1af50 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73  he string is les
1af60 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20  s..  ** If both 
1af70 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d  are strings, com
1af80 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63  pare using the c
1af90 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1afa0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ns..  */.  if( c
1afb0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1afc0 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28  M_Str ){.    if(
1afd0 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f1 & MEM_Str)=
1afe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1aff0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1b000 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74  if( (f2 & MEM_St
1b010 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1b020 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
1b030 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1b040 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e  m1->enc==pMem2->
1b050 65 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72  enc );.    asser
1b060 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53  t( pMem1->enc==S
1b070 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20  QLITE_UTF8 || . 
1b080 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31             pMem1
1b090 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1b0a0 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e  F16LE || pMem1->
1b0b0 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
1b0c0 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  6BE );..    /* T
1b0d0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1b0e0 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65  uence must be de
1b0f0 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f  fined at this po
1b100 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  int, even if.   
1b110 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c   ** the user del
1b120 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  etes the collati
1b130 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65  on sequence afte
1b140 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  r the vdbe progr
1b150 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d  am is.    ** com
1b160 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73 20  piled (this was 
1b170 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20 63  not always the c
1b180 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ase)..    */.   
1b190 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20   assert( !pColl 
1b1a0 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  || pColl->xCmp )
1b1b0 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  ;..    if( pColl
1b1c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b1d0 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1b1e0 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65  tring(pMem1, pMe
1b1f0 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20  m2, pColl, 0);. 
1b200 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61     }.    /* If a
1b210 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61   NULL pointer wa
1b220 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
1b230 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e  collate function
1b240 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20  , fall through. 
1b250 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f     ** to the blo
1b260 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d  b case and use m
1b270 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d  emcmp().  */.  }
1b280 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c  . .  /* Both val
1b290 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62  ues must be blob
1b2a0 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e  s.  Compare usin
1b2b0 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  g memcmp().  */.
1b2c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1b2d0 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d  BlobCompare(pMem
1b2e0 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f  1, pMem2);.}.../
1b2f0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
1b300 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
1b310 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1b320 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65  is a serial-type
1b330 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70   that.** corresp
1b340 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67  onds to an integ
1b350 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20  er - all values 
1b360 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20  between 1 and 9 
1b370 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78  inclusive .** ex
1b380 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f  cept 7. The seco
1b390 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  nd points to a b
1b3a0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1b3b0 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
1b3c0 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20  e.** serialized 
1b3d0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72  according to ser
1b3e0 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66  ial_type. This f
1b3f0 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
1b400 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75  izes.** and retu
1b410 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a  rns the value..*
1b420 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 62  /.static i64 vdb
1b430 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1b440 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
1b450 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79  , const u8 *aKey
1b460 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73  ){.  u32 y;.  as
1b470 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
1b480 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
1b490 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79  >=1 && serial_ty
1b4a0 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f  pe<=9 && serial_
1b4b0 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77  type!=7) );.  sw
1b4c0 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1b4d0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  e ){.    case 0:
1b4e0 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20  .    case 1:.   
1b4f0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1b500 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1b510 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59     return ONE_BY
1b520 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1b530 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20    case 2:.      
1b540 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1b550 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1b560 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f  return TWO_BYTE_
1b570 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1b580 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73  ase 3:.      tes
1b590 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1b5a0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1b5b0 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49  urn THREE_BYTE_I
1b5c0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
1b5d0 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65  se 4: {.      te
1b5e0 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1b5f0 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20  0x80 );.      y 
1b600 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1b610 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65  (aKey);.      re
1b620 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a  turn (i64)*(int*
1b630 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  )&y;.    }.    c
1b640 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74  ase 5: {.      t
1b650 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1b660 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1b670 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f  eturn FOUR_BYTE_
1b680 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
1b690 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1b6a0 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1b6b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b6c0 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20   6: {.      u64 
1b6d0 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
1b6e0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1b6f0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1b700 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1b710 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
1b720 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1b730 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75  y+4);.      retu
1b740 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26  rn (i64)*(i64*)&
1b750 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  x;.    }.  }..  
1b760 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
1b770 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a  ype - 8);.}../*.
1b780 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b790 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
1b7a0 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
1b7b0 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
1b7c0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
1b7d0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
1b7e0 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
1b7f0 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
1b800 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1b810 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
1b820 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
1b830 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
1b840 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
1b850 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
1b860 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
1b870 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
1b880 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 4f  created by the O
1b890 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1b8a0 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
1b8b0 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
1b8c0 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
1b8d0 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
1b8e0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
1b8f0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
1b900 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
1b910 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69  If argument bSki
1b920 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69  p is non-zero, i
1b930 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1b940 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1b950 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65   already.** dete
1b960 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
1b970 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
1b980 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
1b990 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  al..**.** Key1 a
1b9a0 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
1b9b0 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
1b9c0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
1b9d0 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c  f fields. If all
1b9e0 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74   .** fields that
1b9f0 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20   appear in both 
1ba00 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20  keys are equal, 
1ba10 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  then pPKey2->def
1ba20 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72  ault_rc is .** r
1ba30 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1ba40 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
1ba50 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65  ption is discove
1ba60 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d  red, set pPKey2-
1ba70 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20  >errCode to .** 
1ba80 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
1ba90 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20  nd return 0. If 
1baa0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
1bab0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a  encountered, .**
1bac0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1bad0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
1bae0 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20  E_NOMEM and, if 
1baf0 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  it is not NULL, 
1bb00 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61  the.** malloc-fa
1bb10 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e  iled flag set on
1bb20 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1bb30 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e   (pPKey2->pKeyIn
1bb40 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 73 74 61 74  fo->db)..*/.stat
1bb50 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1bb60 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1bb70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1bb80 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1bb90 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
1bba0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1bbb0 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20  ord *pPKey2,    
1bbc0 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1bbd0 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  y */.  int bSkip
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1bc00 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72 73  e, skip the firs
1bc10 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  t field */.){.  
1bc20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc40 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1bc50 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
1bc60 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
1bc70 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
1bca0 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72   field to compar
1bcb0 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  e */.  u32 szHdr
1bcc0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1bcd0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1bce0 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  f record header 
1bcf0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1bd00 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd20 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
1bd30 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72 20   type in header 
1bd40 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  */.  int rc = 0;
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd60 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1bd70 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  alue */.  Mem *p
1bd80 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d  Rhs = pPKey2->aM
1bd90 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  em;       /* Nex
1bda0 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
1bdb0 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  2 to compare */.
1bdc0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1bdd0 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1bde0 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20  eyInfo;.  const 
1bdf0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1be00 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1be10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1be20 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  ey1;.  Mem mem1;
1be30 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20  ..  /* If bSkip 
1be40 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1be50 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1be60 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20  eady determined 
1be70 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a 20  that the first. 
1be80 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
1be90 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65   in the keys are
1bea0 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20   equal. Fix the 
1beb0 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61  various stack va
1bec0 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20  riables so.  ** 
1bed0 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
1bee0 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69  e begins compari
1bef0 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64  ng at the second
1bf00 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28   field. */.  if(
1bf10 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33   bSkip ){.    u3
1bf20 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d  2 s1;.    idx1 =
1bf30 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32   1 + getVarint32
1bf40 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b  (&aKey1[1], s1);
1bf50 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b  .    szHdr1 = aK
1bf60 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d  ey1[0];.    d1 =
1bf70 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65   szHdr1 + sqlite
1bf80 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1bf90 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20  en(s1);.    i = 
1bfa0 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  1;.    pRhs++;. 
1bfb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31   }else{.    idx1
1bfc0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1bfd0 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1bfe0 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a     d1 = szHdr1;.
1bff0 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69      if( d1>(unsi
1c000 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20  gned)nKey1 ){ . 
1c010 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1c020 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1c030 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1c040 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1c050 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1c060 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  /.    }.    i = 
1c070 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e  0;.  }..  VVA_ON
1c080 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
1c090 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
1c0a0 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
1c0b0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1c0c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  /.  assert( pPKe
1c0d0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  y2->pKeyInfo->nF
1c0e0 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65  ield+pPKey2->pKe
1c0f0 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
1c100 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a  pPKey2->nField .
1c110 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
1c120 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1c130 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1c140 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1c150 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1c160 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1c170 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
1c180 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
1c190 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
1c1a0 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
1c1b0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
1c1c0 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1c1d0 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  n integer */.   
1c1e0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1c1f0 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
1c200 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1c210 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1c220 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1c230 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
1c240 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1c250 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
1c260 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1c270 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c280 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29  serial_type==0 )
1c290 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1c2a0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1c2b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1c2c0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 75  7 ){.        dou
1c2d0 62 6c 65 20 72 68 73 20 3d 20 28 64 6f 75 62 6c  ble rhs = (doubl
1c2e0 65 29 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20  e)pRhs->u.i;.   
1c2f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c300 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1c310 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1c320 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
1c330 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c     if( mem1.u.r<
1c340 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1c350 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1c360 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31    }else if( mem1
1c370 2e 75 2e 72 3e 72 68 73 20 29 7b 0a 20 20 20 20  .u.r>rhs ){.    
1c380 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1c390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c3a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
1c3b0 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f  4 lhs = vdbeReco
1c3c0 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69  rdDecodeInt(seri
1c3d0 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b  al_type, &aKey1[
1c3e0 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36  d1]);.        i6
1c3f0 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e  4 rhs = pRhs->u.
1c400 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  i;.        if( l
1c410 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs<rhs ){.      
1c420 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1c430 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
1c440 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs>rhs ){.      
1c450 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1c460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c470 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1c480 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20   is real */.    
1c490 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1c4a0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
1c4b0 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1c4c0 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1c4d0 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65  1];.      if( se
1c4e0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
1c4f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1c500 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1c510 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
1c520 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c530 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1c540 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  {.        double
1c550 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 72   rhs = pRhs->u.r
1c560 3b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  ;.        double
1c570 20 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 73 71   lhs;.        sq
1c580 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1c590 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1c5a0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1c5b0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1c5c0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1c5d0 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73 20  {.          lhs 
1c5e0 3d 20 6d 65 6d 31 2e 75 2e 72 3b 0a 20 20 20 20  = mem1.u.r;.    
1c5f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c600 20 20 20 20 20 6c 68 73 20 3d 20 28 64 6f 75 62       lhs = (doub
1c610 6c 65 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20  le)mem1.u.i;.   
1c620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1c630 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20  f( lhs<rhs ){.  
1c640 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1c650 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1c660 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20  f( lhs>rhs ){.  
1c670 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1c680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c690 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1c6a0 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67   RHS is a string
1c6b0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1c6c0 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1c6d0 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
1c6e0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1c6f0 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1c700 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1c710 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1c720 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1c730 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1c740 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  <12 ){.        r
1c750 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1c760 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
1c770 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1c780 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1c790 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c7a0 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20         mem1.n = 
1c7b0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1c7c0 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1c7d0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1c7e0 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64  m1.n)==(unsigned
1c7f0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1c800 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1c810 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69  mem1.n+1)==(unsi
1c820 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1c830 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65        if( (d1+me
1c840 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65  m1.n) > (unsigne
1c850 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
1c860 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1c870 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1c880 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1c890 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1c8a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c8b0 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
1c8c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
1c8d0 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
1c8e0 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
1c8f0 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d        mem1.enc =
1c900 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
1c910 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64            mem1.d
1c920 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1c930 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1c940 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  .flags = MEM_Str
1c950 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1c960 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65  .z = (char*)&aKe
1c970 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20  y1[d1];.        
1c980 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61    rc = vdbeCompa
1c990 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20  reMemString(.   
1c9a0 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31             &mem1
1c9b0 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f  , pRhs, pKeyInfo
1c9c0 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b  ->aColl[i], &pPK
1c9d0 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  ey2->errCode.   
1c9e0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1c9f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ca00 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
1ca10 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e  N(mem1.n, pRhs->
1ca20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
1ca30 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1ca40 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
1ca50 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
1ca60 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
1ca70 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e   mem1.n - pRhs->
1ca80 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n; .        }.  
1ca90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1caa0 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f   /* RHS is a blo
1cab0 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  b */.    else if
1cac0 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1cad0 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
1cae0 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1caf0 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
1cb00 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
1cb10 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1cb20 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1cb30 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1cb40 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c  pe<12 || (serial
1cb50 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1cb60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1cb70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1cb80 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20         int nStr 
1cb90 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
1cba0 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
1cbb0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1cbc0 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64  nStr)==(unsigned
1cbd0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1cbe0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1cbf0 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  nStr+1)==(unsign
1cc00 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1cc10 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72      if( (d1+nStr
1cc20 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
1cc30 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ey1 ){.         
1cc40 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1cc50 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
1cc60 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1cc70 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cc90 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1cca0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ccb0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1ccc0 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52  p = MIN(nStr, pR
1ccd0 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
1cce0 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
1ccf0 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
1cd00 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
1cd10 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1cd20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73  rc = nStr - pRhs
1cd30 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ->n;.        }. 
1cd40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1cd50 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c    /* RHS is null
1cd60 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20   */.    else{.  
1cd70 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1cd80 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1cd90 20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61       rc = (seria
1cda0 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20  l_type!=0);.    
1cdb0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  }..    if( rc!=0
1cdc0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b   ){.      if( pK
1cdd0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1cde0 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
1cdf0 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20   rc = -rc;.     
1ce00 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
1ce10 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1ce20 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1ce30 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63  Key1, pPKey2, rc
1ce40 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1ce50 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1ce60 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
1ce70 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
1ce80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ce90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b  .    }..    i++;
1cea0 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20  .    pRhs++;.   
1ceb0 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
1cec0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1ced0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1cee0 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65    idx1 += sqlite
1cef0 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61  3VarintLen(seria
1cf00 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  l_type);.  }whil
1cf10 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65  e( idx1<(unsigne
1cf20 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  d)szHdr1 && i<pP
1cf30 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20  Key2->nField && 
1cf40 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  d1<=(unsigned)nK
1cf50 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  ey1 );..  /* No 
1cf60 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1cf70 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1cf80 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1cf90 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1cfa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1cfb0 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1cfc0 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1cfd0 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1cfe0 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1cff0 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1d000 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1d010 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20  Release(&mem1). 
1d020 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1d030 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1d040 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1d050 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1d060 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
1d070 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1d080 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1d090 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1d0a0 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1d0b0 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1d0c0 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1d0d0 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1d0e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  */.  assert( COR
1d0f0 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20  RUPT_DB .       
1d100 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  || vdbeRecordCom
1d110 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1d120 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1d130 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1d140 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  rc) .       || p
1d150 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
1d160 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20  locFailed.  );. 
1d170 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   return pPKey2->
1d180 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e  default_rc;.}.in
1d190 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
1d1a0 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e  ordCompare(.  in
1d1b0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1d1c0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
1d1d0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1d1e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1d1f0 50 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f  PKey2          /
1d200 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
1d210 7b 0a 20 20 72 65 74 75 72 6e 20 76 64 62 65 52  {.  return vdbeR
1d220 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
1d230 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
1d240 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d  1, pPKey2, 0);.}
1d250 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
1d260 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74  nction is an opt
1d270 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  imized version o
1d280 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  f sqlite3VdbeRec
1d290 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a  ordCompare() .**
1d2a0 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69   that (a) the fi
1d2b0 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  rst field of pPK
1d2c0 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ey2 is an intege
1d2d0 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a  r, and (b) the .
1d2e0 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  ** size-of-heade
1d2f0 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20  r varint at the 
1d300 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f  start of (pKey1/
1d310 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61  nKey1) fits in a
1d320 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20   single.** byte 
1d330 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68  (i.e. is less th
1d340 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54  an 128)..**.** T
1d350 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73  o avoid concerns
1d360 20 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76   about buffer ov
1d370 65 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f  erreads, this ro
1d380 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73  utine is only us
1d390 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73  ed.** on schemas
1d3a0 20 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d   where the maxim
1d3b0 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 20  um valid header 
1d3c0 73 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 73  size is 63 bytes
1d3d0 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61   or less..*/.sta
1d3e0 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f  tic int vdbeReco
1d3f0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20  rdCompareInt(.  
1d400 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1d410 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
1d420 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1d430 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1d440 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
1d450 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
1d460 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79    const u8 *aKey
1d470 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29   = &((const u8*)
1d480 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75  pKey1)[*(const u
1d490 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d  8*)pKey1 & 0x3F]
1d4a0 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74  ;.  int serial_t
1d4b0 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38  ype = ((const u8
1d4c0 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69  *)pKey1)[1];.  i
1d4d0 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b  nt res;.  u32 y;
1d4e0 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20  .  u64 x;.  i64 
1d4f0 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  v = pPKey2->aMem
1d500 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c  [0].u.i;.  i64 l
1d510 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72  hs;..  vdbeAsser
1d520 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
1d530 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70  nLimits(nKey1, p
1d540 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b  Key1, pPKey2->pK
1d550 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  eyInfo);.  asser
1d560 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29  t( (*(u8*)pKey1)
1d570 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50  <=0x3F || CORRUP
1d580 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68  T_DB );.  switch
1d590 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
1d5a0 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
1d5b0 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
1d5c0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1d5d0 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f   lhs = ONE_BYTE_
1d5e0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1d5f0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1d600 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1d610 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1d620 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
1d630 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1d640 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f  .      lhs = TWO
1d650 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1d660 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d670 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1d680 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1d690 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
1d6a0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1d6b0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
1d6c0 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
1d6d0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1d6e0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1d6f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d700 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
1d710 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
1d720 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1d730 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
1d740 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1d750 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29       lhs = (i64)
1d760 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20  *(int*)&y;.     
1d770 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1d780 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1d790 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1d7a0 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
1d7b0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1d7c0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55  .      lhs = FOU
1d7d0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1d7e0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
1d7f0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
1d800 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1d810 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1d820 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d830 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
1d840 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67   { /* 8-byte sig
1d850 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1d860 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59       x = FOUR_BY
1d870 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1d880 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1d890 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1d8a0 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1d8b0 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78   lhs = *(i64*)&x
1d8c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1d8d0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1d8e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1d8f0 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20    case 8: .     
1d900 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   lhs = 0;.      
1d910 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1d920 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31  9:.      lhs = 1
1d930 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
1d940 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
1d950 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65   could be remove
1d960 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  d without changi
1d970 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
1d980 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  f running.    **
1d990 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c   this code. Incl
1d9a0 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20  uding it causes 
1d9b0 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20  gcc to generate 
1d9c0 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20  a faster switch 
1d9d0 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
1d9e0 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e  t (since the ran
1d9f0 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72  ge of switch tar
1da00 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20  gets now starts 
1da10 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20  at zero and.    
1da20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73  ** is contiguous
1da30 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  ) but does not c
1da40 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61  ause any duplica
1da50 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65  te code to be ge
1da60 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28  nerated.    ** (
1da70 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72  as gcc is clever
1da80 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69   enough to combi
1da90 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20  ne the two like 
1daa0 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20  cases). Other . 
1dab0 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20     ** compilers 
1dac0 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72  might be similar
1dad0 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20  .  */ .    case 
1dae0 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20  0: case 7:.     
1daf0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1db00 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1db10 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1db20 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66  PKey2);..    def
1db30 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
1db40 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1db50 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
1db60 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1db70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e  );.  }..  if( v>
1db80 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  lhs ){.    res =
1db90 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d   pPKey2->r1;.  }
1dba0 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29  else if( v<lhs )
1dbb0 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
1dbc0 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20  y2->r2;.  }else 
1dbd0 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
1dbe0 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ld>1 ){.    /* T
1dbf0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1dc00 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
1dc10 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61  are equal. Compa
1dc20 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20  re the trailing 
1dc30 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
1dc40 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 76 64   */.    res = vd
1dc50 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1dc60 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
1dc70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
1dc80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1dc90 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
1dca0 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
1dcb0 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64  ys are equal and
1dcc0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
1dcd0 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69  ailing.    ** fi
1dce0 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b  elds. Return pPK
1dcf0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1dd00 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  in this case. */
1dd10 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1dd20 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
1dd30 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
1dd40 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1dd50 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1dd60 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20  1, pPKey2, res) 
1dd70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
1dd80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1dd90 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
1dda0 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
1ddb0 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
1ddc0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
1ddd0 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
1dde0 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
1ddf0 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67  Key2 is a string
1de00 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66  , that (b) the f
1de10 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73  irst field.** us
1de20 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
1de30 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
1de40 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68   and (c) that th
1de50 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
1de60 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74   varint .** at t
1de70 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
1de80 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
1de90 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  n a single byte.
1dea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1deb0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1dec0 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b  String(.  int nK
1ded0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1dee0 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
1def0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1df00 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
1df10 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1df20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  key */.){.  cons
1df30 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63  t u8 *aKey1 = (c
1df40 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a  onst u8*)pKey1;.
1df50 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
1df60 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  e;.  int res;.. 
1df70 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1df80 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1df90 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  s(nKey1, pKey1, 
1dfa0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1dfb0 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32  );.  getVarint32
1dfc0 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69  (&aKey1[1], seri
1dfd0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20  al_type);.  if( 
1dfe0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29  serial_type<12 )
1dff0 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
1e000 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20  y2->r1;      /* 
1e010 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73  (pKey1/nKey1) is
1e020 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e   a number or a n
1e030 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ull */.  }else i
1e040 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65  f( !(serial_type
1e050 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20   & 0x01) ){ .   
1e060 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1e070 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  2;      /* (pKey
1e080 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c  1/nKey1) is a bl
1e090 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ob */.  }else{. 
1e0a0 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20     int nCmp;.   
1e0b0 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69   int nStr;.    i
1e0c0 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31  nt szHdr = aKey1
1e0d0 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d  [0];..    nStr =
1e0e0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
1e0f0 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28  ) / 2;.    if( (
1e100 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20  szHdr + nStr) > 
1e110 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70  nKey1 ){.      p
1e120 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1e130 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1e140 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1e150 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
1e160 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1e170 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d    }.    nCmp = M
1e180 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  IN( pPKey2->aMem
1e190 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20  [0].n, nStr );. 
1e1a0 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
1e1b0 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70  &aKey1[szHdr], p
1e1c0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a  PKey2->aMem[0].z
1e1d0 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66  , nCmp);..    if
1e1e0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
1e1f0 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70    res = nStr - p
1e200 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
1e210 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ;.      if( res=
1e220 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
1e230 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
1e240 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
1e250 72 65 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64  res = vdbeRecord
1e260 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
1e270 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1e280 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  Key2, 1);.      
1e290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e2a0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1e2b0 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
1e2c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1e2d0 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
1e2e0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
1e2f0 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20  Key2->r2;.      
1e300 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1e310 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
1e320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1e330 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
1e340 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1e350 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73  y2->r2;.    }els
1e360 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  e{.      res = p
1e370 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d  PKey2->r1;.    }
1e380 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e390 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1e3a0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1e3b0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
1e3c0 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
1e3d0 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c  UPT_DB.       ||
1e3e0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1e3f0 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
1e400 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
1e410 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
1e420 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1e430 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64   to an sqlite3Vd
1e440 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1e450 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e  ) compatible fun
1e460 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c  ction.** suitabl
1e470 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  e for comparing 
1e480 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72  serialized recor
1e490 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b  ds to the unpack
1e4a0 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64  ed record passed
1e4b0 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  .** as the only 
1e4c0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63  argument..*/.Rec
1e4d0 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74  ordCompare sqlit
1e4e0 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
1e4f0 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e(UnpackedRecord
1e500 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e   *p){.  /* varin
1e510 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
1e520 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65  t() and varintRe
1e530 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1e540 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a  g() both assume.
1e550 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69    ** that the si
1e560 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
1e570 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20  int that occurs 
1e580 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1e590 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a  each record.  **
1e5a0 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
1e5b0 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  e byte (i.e. is 
1e5c0 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61  127 or less). va
1e5d0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
1e5e0 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f  eInt().  ** also
1e5f0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
1e600 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
1e610 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79  read a buffer by
1e620 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20   at least the . 
1e630 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73   ** maximum poss
1e640 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65  ible legal heade
1e650 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79  r size plus 8 by
1e660 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65  tes. Because the
1e670 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61  re is.  ** guara
1e680 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c  nteed to be at l
1e690 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74  east 74 (but not
1e6a0 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70   136) bytes of p
1e6b0 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
1e6c0 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65   each.  ** buffe
1e6d0 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69  r passed to vari
1e6e0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
1e6f0 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20  nt() this makes 
1e700 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  it convenient to
1e710 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20  .  ** limit the 
1e720 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
1e730 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69  er to 64 bytes i
1e740 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  n cases where th
1e750 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20  e first field.  
1e760 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ** is an integer
1e770 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1e780 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65  easiest way to e
1e790 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69  nforce this limi
1e7a0 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  t is to consider
1e7b0 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69   only records wi
1e7c0 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64  th.  ** 13 field
1e7d0 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68  s or less. If th
1e7e0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73  e first field is
1e7f0 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65   an integer, the
1e800 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20   maximum legal. 
1e810 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20   ** header size 
1e820 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31  is (12*5 + 1 + 1
1e830 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69  ) bytes.  */.  i
1e840 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  f( (p->pKeyInfo-
1e850 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65  >nField + p->pKe
1e860 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c  yInfo->nXField)<
1e870 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  =13 ){.    int f
1e880 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30  lags = p->aMem[0
1e890 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28  ].flags;.    if(
1e8a0 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   p->pKeyInfo->aS
1e8b0 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20  ortOrder[0] ){. 
1e8c0 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a       p->r1 = 1;.
1e8d0 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31        p->r2 = -1
1e8e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e8f0 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20     p->r1 = -1;. 
1e900 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a       p->r2 = 1;.
1e910 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1e920 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20  lags & MEM_Int) 
1e930 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e940 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1e950 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eInt;.    }.    
1e960 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
1e970 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
1e980 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
1e990 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  s & MEM_Null );.
1e9a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
1e9b0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
1e9c0 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
1e9d0 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d   & (MEM_Real|MEM
1e9e0 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29  _Null|MEM_Blob))
1e9f0 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e  ==0 && p->pKeyIn
1ea00 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20  fo->aColl[0]==0 
1ea10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1ea20 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72   flags & MEM_Str
1ea30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1ea40 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1ea50 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a  reString;.    }.
1ea60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
1ea70 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1ea80 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ompare;.}../*.**
1ea90 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
1eaa0 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
1eab0 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
1eac0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1ead0 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
1eae0 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
1eaf0 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
1eb00 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
1eb10 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
1eb20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1eb30 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
1eb40 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
1eb50 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
1eb60 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  ise..**.** pCur 
1eb70 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e  might be pointin
1eb80 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  g to text obtain
1eb90 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70  ed from a corrup
1eba0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  t database file.
1ebb0 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65  .** So the conte
1ebc0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  nt cannot be tru
1ebd0 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70  sted.  Do approp
1ebe0 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20  riate checks on 
1ebf0 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  the content..*/.
1ec00 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
1ec10 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20  dxRowid(sqlite3 
1ec20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  *db, BtCursor *p
1ec30 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
1ec40 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
1ec50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
1ec60 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
1ec70 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1ec80 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
1ec90 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
1eca0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
1ecb0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
1ecc0 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
1ecd0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1ece0 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
1ecf0 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65  m m, v;..  /* Ge
1ed00 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
1ed10 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20  e index entry.  
1ed20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74  Only indices ent
1ed30 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a  ries of less.  *
1ed40 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20  * than 2GiB are 
1ed50 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69  support - anythi
1ed60 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65  ng large must be
1ed70 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1ed80 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63  tion..  ** Any c
1ed90 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
1eda0 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33  ected in sqlite3
1edb0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
1edc0 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a  r(), though, so.
1edd0 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63    ** this code c
1ede0 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65  an safely assume
1edf0 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69   that nCellKey i
1ee00 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f  s 32-bits  .  */
1ee10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ee20 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
1ee30 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
1ee40 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
1ee50 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
1ee60 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
1ee70 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
1ee80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
1ee90 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
1eea0 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
1eeb0 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
1eec0 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  il */.  assert( 
1eed0 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
1eee0 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
1eef0 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
1ef00 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
1ef10 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
1ef20 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
1ef30 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  try */.  sqlite3
1ef40 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
1ef50 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
1ef60 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
1ef70 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
1ef80 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (u32)nCellKey, 1
1ef90 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
1efa0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1efb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1efc0 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
1efd0 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
1efe0 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
1eff0 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
1f000 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
1f010 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
1f020 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
1f030 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
1f040 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
1f050 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
1f060 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
1f070 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
1f080 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
1f090 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
1f0a0 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
1f0b0 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
1f0c0 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
1f0d0 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
1f0e0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
1f0f0 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
1f100 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
1f110 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
1f120 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
1f130 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
1f140 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
1f150 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
1f160 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
1f170 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
1f180 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
1f190 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
1f1a0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
1f1b0 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
1f1c0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
1f1d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
1f1e0 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
1f1f0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
1f200 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
1f210 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
1f220 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
1f230 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
1f240 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
1f250 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
1f260 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
1f270 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
1f280 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
1f290 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
1f2a0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
1f2b0 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
1f2c0 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
1f2d0 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
1f2e0 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
1f2f0 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
1f300 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
1f310 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
1f320 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
1f330 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
1f340 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
1f350 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
1f360 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
1f370 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1f380 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
1f390 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
1f3a0 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
1f3b0 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
1f3c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1f3d0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
1f3e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1f3f0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
1f400 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1f410 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
1f420 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
1f430 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
1f440 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
1f450 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
1f460 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
1f470 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
1f480 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
1f490 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d  se( m.szMalloc!=
1f4a0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
1f4b0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
1f4c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1f4d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1f4e0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1f4f0 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
1f500 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
1f510 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
1f520 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73  inting to agains
1f530 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
1f540 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64  ing in pUnpacked
1f550 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
1f560 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
1f570 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
1f580 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1f590 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
1f5a0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1f5b0 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
1f5c0 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  than pUnpacked. 
1f5d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1f5e0 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
1f5f0 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73  .** pUnpacked is
1f600 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
1f610 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
1f620 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
1f630 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
1f640 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
1f650 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
1f660 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
1f670 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
1f680 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
1f690 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65   as well.  Hence
1f6a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  , this routine o
1f6b0 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65  nly compares the
1f6c0 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66   prefixes .** of
1f6d0 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20   the keys prior 
1f6e0 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  to the final row
1f6f0 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69  id, not the enti
1f700 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  re key..*/.int s
1f710 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
1f720 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Compare(.  sqlit
1f730 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1f740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1f750 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1f760 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  on */.  VdbeCurs
1f770 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
1f780 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f790 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
1f7a0 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
1f7b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1f7c0 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20  Unpacked,       
1f7d0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
1f7e0 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20  ion of key */.  
1f7f0 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20  int *res        
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f810 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
1f820 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
1f830 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
1f840 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
1f850 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
1f860 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e  sor *pCur = pC->
1f870 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d  pCursor;.  Mem m
1f880 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1f890 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1f8a0 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
1f8b0 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
1f8c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1f8d0 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
1f8e0 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
1f8f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f900 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
1f910 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
1f920 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
1f930 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
1f940 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
1f950 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
1f960 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
1f970 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a  ause of the way.
1f980 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
1f990 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
1f9a0 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
1f9b0 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
1f9c0 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
1f9d0 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
1f9e0 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
1f9f0 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
1fa00 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1fa10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1fa20 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
1fa30 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c  3VdbeMemInit(&m,
1fa40 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20   db, 0);.  rc = 
1fa50 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
1fa60 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72  omBtree(pC->pCur
1fa70 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  sor, 0, (u32)nCe
1fa80 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
1fa90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1faa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1fab0 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
1fac0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1fad0 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
1fae0 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ked);.  sqlite3V
1faf0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1fb00 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1fb10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1fb20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1fb30 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
1fb40 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
1fb50 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1fb60 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
1fb70 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
1fb80 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
1fb90 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
1fba0 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
1fbb0 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
1fbc0 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
1fbd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1fbe0 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
1fbf0 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
1fc00 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
1fc10 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
1fc20 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
1fc30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
1fc40 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
1fc50 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
1fc60 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
1fc70 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
1fc80 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
1fc90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1fca0 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
1fcb0 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
1fcc0 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
1fcd0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
1fce0 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
1fcf0 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
1fd00 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
1fd10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
1fd20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
1fd30 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
1fd40 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
1fd50 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
1fd60 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
1fd70 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
1fd80 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
1fd90 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
1fda0 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
1fdb0 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
1fdc0 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
1fdd0 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
1fde0 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
1fdf0 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
1fe00 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
1fe10 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
1fe20 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
1fe30 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
1fe40 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
1fe50 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
1fe60 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
1fe70 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1fe80 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
1fe90 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
1fea0 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
1feb0 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
1fec0 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
1fed0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
1fee0 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
1fef0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ff00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
1ff10 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1ff20 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
1ff30 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
1ff40 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
1ff50 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f  turn v->db;.}../
1ff60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1ff70 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
1ff80 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
1ff90 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
1ffa0 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
1ffb0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
1ffc0 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
1ffd0 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
1ffe0 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
1fff0 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
20000 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
20010 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
20020 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
20030 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
20040 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
20050 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
20060 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
20070 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
20080 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
20090 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
200a0 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
200b0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
200c0 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
200d0 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
200e0 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
200f0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
20100 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
20110 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
20120 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
20130 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
20140 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
20150 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
20160 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
20170 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
20180 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
20190 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
201a0 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
201b0 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
201c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
201d0 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
201e0 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
201f0 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
20200 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
20210 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
20220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20230 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20  return pRet;.   
20240 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20250 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  0;.}../*.** Conf
20260 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62  igure SQL variab
20270 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20  le iVar so that 
20280 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61  binding a new va
20290 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c  lue to it signal
202a0 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f  s.** to sqlite3_
202b0 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61  reoptimize() tha
202c0 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74  t re-preparing t
202d0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79  he statement may
202e0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20   result.** in a 
202f0 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61  better query pla
20300 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
20310 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
20320 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
20330 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ar){.  assert( i
20340 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69  Var>0 );.  if( i
20350 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d  Var>32 ){.    v-
20360 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66  >expmask = 0xfff
20370 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fffff;.  }else{.
20380 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c      v->expmask |
20390 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56  = ((u32)1 << (iV
203a0 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  ar-1));.  }.}..#
203b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
203c0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
203d0 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
203e0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
203f0 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65  t from an sqlite
20400 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28  3_vtab.zErrMsg (
20410 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
20420 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
20430 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
20440 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64  alloc) into a Vd
20450 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  be.zErrMsg (text
20460 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
20470 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
20480 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
20490 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  oc)..*/.void sql
204a0 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72  ite3VtabImportEr
204b0 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71  rmsg(Vdbe *p, sq
204c0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
204d0 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
204e0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c  b = p->db;.  sql
204f0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20500 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
20510 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
20520 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
20530 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
20540 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
20550 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
20560 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
20570 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f   = 0;.}.#endif /
20580 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
20590 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
205a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
205b0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
205c0 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  OK../*.** If the
205d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
205e0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65   is not NULL, re
205f0 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61  lease any alloca
20600 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
20610 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65   .** with the me
20620 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68  mory cells in th
20630 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61  e p->aMem[] arra
20640 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65  y. Also free the
20650 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
20660 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73  ** structure its
20670 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74  elf, using sqlit
20680 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  e3DbFree()..**.*
20690 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
206a0 69 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20  is used to free 
206b0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
206c0 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61  tructures alloca
206d0 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64  ted by.** the vd
206e0 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
206f0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20   function found 
20700 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f  in vdbeapi.c..*/
20710 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
20720 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71  eFreeUnpacked(sq
20730 6c 69 74 65 33 20 2a 64 62 2c 20 55 6e 70 61 63  lite3 *db, Unpac
20740 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
20750 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
20760 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
20770 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69  ; i<p->nField; i
20780 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  ++){.      Mem *
20790 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pMem = &p->aMem[
207a0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  i];.      if( pM
207b0 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  em->zMalloc ) sq
207c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
207d0 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d  ase(pMem);.    }
207e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
207f0 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
20800 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
20810 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f  he pre-update ho
20820 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ok. If this is a
20830 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
20840 54 45 20 70 72 65 2d 75 70 64 61 74 65 20 63 61  TE pre-update ca
20850 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73  ll,.** then curs
20860 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
20870 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20880 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f   should point to
20890 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a   the row about.*
208a0 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f  * to be update o
208b0 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  r deleted. If th
208c0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61  e application ca
208d0 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75  lls sqlite3_preu
208e0 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20  pdate_old(),.** 
208f0 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c  the required val
20900 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ue will be read 
20910 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65  from the row the
20920 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74   cursor points t
20930 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  o..*/.void sqlit
20940 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65 48  e3VdbePreUpdateH
20950 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  ook(.  Vdbe *v, 
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70         /* Vdbe p
20980 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69  re-update hook i
20990 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a  s invoked by */.
209a0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
209b0 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
209c0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67    /* Cursor to g
209d0 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73  rab old.* values
209e0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f   from */.  int o
209f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
20a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
20a10 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44  LITE_INSERT, UPD
20a20 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f  ATE or DELETE */
20a30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
20a40 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
20a50 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
20a60 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ame */.  Table *
20a70 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20  pTab,           
20a80 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69           /* Modi
20a90 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  fied table */.  
20aa0 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20  i64 iKey1,      
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ac0 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76  /* Initial key v
20ad0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  alue */.  int iR
20ae0 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  eg              
20af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
20b00 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20  ister for new.* 
20b10 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73  record */.){.  s
20b20 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e  qlite3 *db = v->
20b30 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b  db;.  i64 iKey2;
20b40 0a 20 20 50 72 65 55 70 64 61 74 65 20 70 72 65  .  PreUpdate pre
20b50 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20  update;.  const 
20b60 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61  char *zTbl = pTa
20b70 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74  b->zName;.  stat
20b80 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b 65  ic const u8 fake
20b90 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a  SortOrder = 0;..
20ba0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 50    assert( db->pP
20bb0 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20  reUpdate==0 );. 
20bc0 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64 61   memset(&preupda
20bd0 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72  te, 0, sizeof(Pr
20be0 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66 28  eUpdate));.  if(
20bf0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
20c00 54 45 20 29 7b 0a 20 20 20 20 69 4b 65 79 32 20  TE ){.    iKey2 
20c10 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e  = v->aMem[iReg].
20c20 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  u.i;.  }else{.  
20c30 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b    iKey2 = iKey1;
20c40 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
20c50 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54  pCsr->nField==pT
20c60 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20  ab->nCol .      
20c70 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c   || (pCsr->nFiel
20c80 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20  d==pTab->nCol+1 
20c90 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  && op==SQLITE_DE
20ca0 4c 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31  LETE && iReg==-1
20cb0 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64  ).  );..  preupd
20cc0 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65  ate.v = v;.  pre
20cd0 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43  update.pCsr = pC
20ce0 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  sr;.  preupdate.
20cf0 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70  op = op;.  preup
20d00 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69  date.iNewReg = i
20d10 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Reg;.  preupdate
20d20 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62  .keyinfo.db = db
20d30 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
20d40 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28  yinfo.enc = ENC(
20d50 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65  db);.  preupdate
20d60 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 20  .keyinfo.nField 
20d70 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
20d80 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
20d90 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  o.aSortOrder = (
20da0 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64  u8*)&fakeSortOrd
20db0 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  er;.  preupdate.
20dc0 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20  iKey1 = iKey1;. 
20dd0 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32   preupdate.iKey2
20de0 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75   = iKey2;.  preu
20df0 70 64 61 74 65 2e 69 50 4b 65 79 20 3d 20 70 54  pdate.iPKey = pT
20e00 61 62 2d 3e 69 50 4b 65 79 3b 0a 0a 20 20 64 62  ab->iPKey;..  db
20e10 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26  ->pPreUpdate = &
20e20 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d  preupdate;.  db-
20e30 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62  >xPreUpdateCallb
20e40 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61  ack(db->pPreUpda
20e50 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a  teArg, db, op, z
20e60 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c  Db, zTbl, iKey1,
20e70 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70   iKey2);.  db->p
20e80 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  PreUpdate = 0;. 
20e90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20ea0 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65  b, preupdate.aRe
20eb0 63 6f 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65  cord);.  vdbeFre
20ec0 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72  eUnpacked(db, pr
20ed0 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65  eupdate.pUnpacke
20ee0 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e  d);.  vdbeFreeUn
20ef0 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70  packed(db, preup
20f00 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65  date.pNewUnpacke
20f10 64 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64  d);.  if( preupd
20f20 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20  ate.aNew ){.    
20f30 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
20f40 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65  =0; i<pCsr->nFie
20f50 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
20f60 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
20f70 6c 65 61 73 65 28 26 70 72 65 75 70 64 61 74 65  lease(&preupdate
20f80 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d  .aNew[i]);.    }
20f90 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
20fa0 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ee(db, preupdate
20fb0 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .aNew);.  }.}.#e
20fc0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
20fd0 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
20fe0 48 4f 4f 4b 20 2a 2f 0a                          HOOK */.