/ Hex Artifact Content
Login

Artifact d71429f70e95e21aaf15ee287a78beefcda4bdc7d1b6d3c704dfeba820a792e0:


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 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70  Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b  se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b  ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20  e->szOpAlloc==0 
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69  AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75  t, 0, 1);.  retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20  hange the error 
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e  string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f   Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20  eError(Vdbe *p, 
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74  list ap;.  sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76  p->zErrMsg);.  v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  mat);.  p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70   *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28  repFlags){.  if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d    p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66   prepFlags;.  if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53  ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41  QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VESQL)==0 ){.   
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b   p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 23 69 66 64 65 66 20 53   z, n);.#ifdef S
06f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52  QLITE_ENABLE_NOR
0700: 4d 41 4c 49 5a 45 0a 20 20 61 73 73 65 72 74 28  MALIZE.  assert(
0710: 20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 3d 3d 30 20   p->zNormSql==0 
0720: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c  );.  if( p->zSql
0730: 20 26 26 20 28 70 72 65 70 46 6c 61 67 73 20 26   && (prepFlags &
0740: 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f   SQLITE_PREPARE_
0750: 4e 4f 52 4d 41 4c 49 5a 45 29 21 3d 30 20 29 7b  NORMALIZE)!=0 ){
0760: 0a 20 20 20 20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c  .    p->zNormSql
0770: 20 3d 20 73 71 6c 69 74 65 33 4e 6f 72 6d 61 6c   = sqlite3Normal
0780: 69 7a 65 28 70 2c 20 70 2d 3e 7a 53 71 6c 2c 20  ize(p, p->zSql, 
0790: 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  n);.    assert( 
07a0: 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 21 3d 30 20 7c  p->zNormSql!=0 |
07b0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
07c0: 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e  ailed );.  }.#en
07d0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  dif.}../*.** Swa
07e0: 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65  p all content be
07f0: 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73  tween two VDBE s
0800: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
0810: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77  id sqlite3VdbeSw
0820: 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62  ap(Vdbe *pA, Vdb
0830: 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74  e *pB){.  Vdbe t
0840: 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61  mp, *pTmp;.  cha
0850: 72 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72  r *zTmp;.  asser
0860: 74 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64  t( pA->db==pB->d
0870: 62 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41  b );.  tmp = *pA
0880: 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20  ;.  *pA = *pB;. 
0890: 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54   *pB = tmp;.  pT
08a0: 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a  mp = pA->pNext;.
08b0: 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42    pA->pNext = pB
08c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70  ->pNext;.  pB->p
08d0: 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70  Next = pTmp;.  p
08e0: 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b  Tmp = pA->pPrev;
08f0: 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70  .  pA->pPrev = p
0900: 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e  B->pPrev;.  pB->
0910: 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20  pPrev = pTmp;.  
0920: 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b  zTmp = pA->zSql;
0930: 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42  .  pA->zSql = pB
0940: 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53  ->zSql;.  pB->zS
0950: 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 64 65  ql = zTmp;.#ifde
0960: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
0970: 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 7a 54 6d 70  NORMALIZE.  zTmp
0980: 20 3d 20 70 41 2d 3e 7a 4e 6f 72 6d 53 71 6c 3b   = pA->zNormSql;
0990: 0a 20 20 70 41 2d 3e 7a 4e 6f 72 6d 53 71 6c 20  .  pA->zNormSql 
09a0: 3d 20 70 42 2d 3e 7a 4e 6f 72 6d 53 71 6c 3b 0a  = pB->zNormSql;.
09b0: 20 20 70 42 2d 3e 7a 4e 6f 72 6d 53 71 6c 20 3d    pB->zNormSql =
09c0: 20 7a 54 6d 70 3b 0a 23 65 6e 64 69 66 0a 20 20   zTmp;.#endif.  
09d0: 70 42 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 70 41  pB->expmask = pA
09e0: 2d 3e 65 78 70 6d 61 73 6b 3b 0a 20 20 70 42 2d  ->expmask;.  pB-
09f0: 3e 70 72 65 70 46 6c 61 67 73 20 3d 20 70 41 2d  >prepFlags = pA-
0a00: 3e 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 6d 65  >prepFlags;.  me
0a10: 6d 63 70 79 28 70 42 2d 3e 61 43 6f 75 6e 74 65  mcpy(pB->aCounte
0a20: 72 2c 20 70 41 2d 3e 61 43 6f 75 6e 74 65 72 2c  r, pA->aCounter,
0a30: 20 73 69 7a 65 6f 66 28 70 42 2d 3e 61 43 6f 75   sizeof(pB->aCou
0a40: 6e 74 65 72 29 29 3b 0a 20 20 70 42 2d 3e 61 43  nter));.  pB->aC
0a50: 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54  ounter[SQLITE_ST
0a60: 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50 41  MTSTATUS_REPREPA
0a70: 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  RE]++;.}../*.** 
0a80: 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e  Resize the Vdbe.
0a90: 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61  aOp array so tha
0aa0: 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74  t it is at least
0ab0: 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c 61   nOp elements la
0ac0: 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69 74  rger .** than it
0ad0: 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e 20  s current size. 
0ae0: 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65 65  nOp is guarantee
0af0: 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
0b00: 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f  n or equal.** to
0b10: 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29   1024/sizeof(Op)
0b20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75  ..**.** If an ou
0b30: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f  t-of-memory erro
0b40: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
0b50: 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61  esizing the arra
0b60: 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  y, return.** SQL
0b70: 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68  ITE_NOMEM. In th
0b80: 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70  is case Vdbe.aOp
0b90: 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41 6c   and Parse.nOpAl
0ba0: 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75  loc remain .** u
0bb0: 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20 69  nchanged (this i
0bc0: 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f 70  s so that any op
0bd0: 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c  codes already al
0be0: 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20 0a  located can be .
0bf0: 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61  ** correctly dea
0c00: 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
0c10: 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 20  ith the rest of 
0c20: 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74  the Vdbe)..*/.st
0c30: 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 41  atic int growOpA
0c40: 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69 6e  rray(Vdbe *v, in
0c50: 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f 70  t nOp){.  VdbeOp
0c60: 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 20   *pNew;.  Parse 
0c70: 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a  *p = v->pParse;.
0c80: 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45  .  /* The SQLITE
0c90: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
0ca0: 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  RESS compile-tim
0cb0: 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73 69  e option is desi
0cc0: 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20 20  gned to force.  
0cd0: 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e 74  ** more frequent
0ce0: 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68 65   reallocs and he
0cf0: 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72 65  nce provide more
0d00: 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20 66   opportunities f
0d10: 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61 74  or .  ** simulat
0d20: 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20 20  ed OOM faults.  
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67 65  LOC_STRESS is ge
0d50: 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20 2a  nerally used.  *
0d60: 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  * during testing
0d70: 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51 4c   only.  With SQL
0d80: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
0d90: 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68 65  _STRESS grow the
0da0: 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20 62   op array.  ** b
0db0: 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20 61  y the minimum* a
0dc0: 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20 75  mount required u
0dd0: 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72 65  ntil the size re
0de0: 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72 6d  aches 512.  Norm
0df0: 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  al.  ** operatio
0e00: 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49 54  n (without SQLIT
0e10: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0e20: 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f 75  TRESS) is to dou
0e30: 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ble the current.
0e40: 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
0e50: 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64 64   op array or add
0e60: 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20 77   1KB of space, w
0e70: 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c  hichever is smal
0e80: 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53  ler. */.#ifdef S
0e90: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0ea0: 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74 20  OC_STRESS.  int 
0eb0: 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c  nNew = (p->nOpAl
0ec0: 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e 4f  loc>=512 ? p->nO
0ed0: 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e 4f  pAlloc*2 : p->nO
0ee0: 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65 6c  pAlloc+nOp);.#el
0ef0: 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  se.  int nNew = 
0f00: 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70  (p->nOpAlloc ? p
0f10: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28  ->nOpAlloc*2 : (
0f20: 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f 66  int)(1024/sizeof
0f30: 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 44  (Op)));.  UNUSED
0f40: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 3b  _PARAMETER(nOp);
0f50: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
0f60: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 69  sure that the si
0f70: 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f 65  ze of a VDBE doe
0f80: 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20 6c  s not grow too l
0f90: 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e 4e  arge */.  if( nN
0fa0: 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69 6d  ew > p->db->aLim
0fb0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
0fc0: 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20 20  VDBE_OP] ){.    
0fd0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
0fe0: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  p->db);.    retu
0ff0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1000: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1010: 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 6f  nOp<=(1024/sizeo
1020: 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 65  f(Op)) );.  asse
1030: 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e 4f  rt( nNew>=(p->nO
1040: 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a 20  pAlloc+nOp) );. 
1050: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
1060: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20  bRealloc(p->db, 
1070: 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a  v->aOp, nNew*siz
1080: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20  eof(Op));.  if( 
1090: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 73  pNew ){.    p->s
10a0: 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74  zOpAlloc = sqlit
10b0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  e3DbMallocSize(p
10c0: 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ->db, pNew);.   
10d0: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70   p->nOpAlloc = p
10e0: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a 65  ->szOpAlloc/size
10f0: 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61  of(Op);.    v->a
1100: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  Op = pNew;.  }. 
1110: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20   return (pNew ? 
1120: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
1130: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1140: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1150: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
1160: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
1170: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
1180: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
1190: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
11a0: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
11b0: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
11c0: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
11d0: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
11e0: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
11f0: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
1200: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
1210: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
1220: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
1230: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
1240: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1250: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
1260: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
1270: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
1280: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
1290: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
12a0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
12b0: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
12c0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
12d0: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
12e0: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
12f0: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
1300: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
1310: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
1320: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
1330: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
1340: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
1350: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
1360: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
1370: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1380: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
1390: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
13a0: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
13b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
13c0: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
13d0: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
13e0: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
13f0: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  perand..*/.stati
1400: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
1410: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64  E int growOp3(Vd
1420: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
1430: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69  nt p1, int p2, i
1440: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74  nt p3){.  assert
1450: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
1460: 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b  Alloc<=p->nOp );
1470: 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72  .  if( growOpArr
1480: 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75 72  ay(p, 1) ) retur
1490: 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n 1;.  assert( p
14a0: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
14b0: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72  oc>p->nOp );.  r
14c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
14d0: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
14e0: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e  1, p2, p3);.}.in
14f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1500: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op3(Vdbe *p, int
1510: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1520: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20   p2, int p3){.  
1530: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
1540: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e  *pOp;..  i = p->
1550: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nOp;.  assert( p
1560: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1570: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
1580: 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f  sert( op>=0 && o
1590: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
15a0: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
15b0: 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65  loc<=i ){.    re
15c0: 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20  turn growOp3(p, 
15d0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
15e0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b  .  }.  p->nOp++;
15f0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
1600: 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  [i];.  pOp->opco
1610: 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70  de = (u8)op;.  p
1620: 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f  Op->p5 = 0;.  pO
1630: 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f  p->p1 = p1;.  pO
1640: 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f  p->p2 = p2;.  pO
1650: 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f  p->p3 = p3;.  pO
1660: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70  p->p4.p = 0;.  p
1670: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
1680: 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20  NOTUSED;.#ifdef 
1690: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
16a0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
16b0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d   pOp->zComment =
16c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   0;.#endif.#ifde
16d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
16e0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
16f0: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
1700: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
1710: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
1720: 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f  tOp(0, i, &p->aO
1730: 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f  p[i]);.    test_
1740: 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74  addop_breakpoint
1750: 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ();.  }.#endif.#
1760: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
1770: 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73  LE.  pOp->cycles
1780: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74   = 0;.  pOp->cnt
1790: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
17a0: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
17b0: 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e  COVERAGE.  pOp->
17c0: 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65  iSrcLine = 0;.#e
17d0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b  ndif.  return i;
17e0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
17f0: 62 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70  beAddOp0(Vdbe *p
1800: 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74  , int op){.  ret
1810: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1820: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20  ddOp3(p, op, 0, 
1830: 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  0, 0);.}.int sql
1840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56  ite3VdbeAddOp1(V
1850: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
1860: 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72  int p1){.  retur
1870: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
1880: 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30  Op3(p, op, p1, 0
1890: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
18a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64  te3VdbeAddOp2(Vd
18b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
18c0: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a  nt p1, int p2){.
18d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
18e0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
18f0: 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a  , p1, p2, 0);.}.
1900: 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  ./* Generate cod
1910: 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69  e for an uncondi
1920: 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69  tional jump to i
1930: 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74  nstruction iDest
1940: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1950: 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c  dbeGoto(Vdbe *p,
1960: 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72   int iDest){.  r
1970: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1980: 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f  eAddOp3(p, OP_Go
1990: 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29  to, 0, iDest, 0)
19a0: 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  ;.}../* Generate
19b0: 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74   code to cause t
19c0: 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74  he string zStr t
19d0: 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f  o be loaded into
19e0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65  .** register iDe
19f0: 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  st.*/.int sqlite
1a00: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28  3VdbeLoadString(
1a10: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1a20: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1a30: 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  zStr){.  return 
1a40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a50: 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  4(p, OP_String8,
1a60: 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53   0, iDest, 0, zS
1a70: 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tr, 0);.}../*.**
1a80: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1a90: 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  hat initializes 
1aa0: 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65  multiple registe
1ab0: 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20  rs to string or 
1ac0: 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74  integer.** const
1ad0: 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73  ants.  The regis
1ae0: 74 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20  ters begin with 
1af0: 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61  iDest and increa
1b00: 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79  se consecutively
1b10: 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65  ..** One registe
1b20: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
1b30: 20 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63   for each charac
1b40: 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d  gter in zTypes[]
1b50: 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22  .  For each.** "
1b60: 73 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  s" character in 
1b70: 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65  zTypes[], the re
1b80: 67 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69  gister is a stri
1b90: 6e 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  ng if the argume
1ba0: 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c  nt is.** not NUL
1bb0: 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66  L, or OP_Null if
1bc0: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20   the value is a 
1bd0: 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46  null pointer.  F
1be0: 6f 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72  or each "i" char
1bf0: 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70  acter.** in zTyp
1c00: 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74  es[], the regist
1c10: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
1c20: 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e  d to an integer.
1c30: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1c40: 70 75 74 20 73 74 72 69 6e 67 20 64 6f 65 73 20  put string does 
1c50: 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22 58 22  not end with "X"
1c60: 20 74 68 65 6e 20 61 6e 20 4f 50 5f 52 65 73 75   then an OP_Resu
1c70: 6c 74 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f  ltRow instructio
1c80: 6e 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65  n.** is generate
1c90: 64 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 73  d for the values
1ca0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f   inserted..*/.vo
1cb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75  id sqlite3VdbeMu
1cc0: 6c 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c  ltiLoad(Vdbe *p,
1cd0: 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73   int iDest, cons
1ce0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c 20  t char *zTypes, 
1cf0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1d00: 61 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  ap;.  int i;.  c
1d10: 68 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61 72  har c;.  va_star
1d20: 74 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20  t(ap, zTypes);. 
1d30: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
1d40: 54 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b  Types[i])!=0; i+
1d50: 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  +){.    if( c=='
1d60: 73 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  s' ){.      cons
1d70: 74 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61  t char *z = va_a
1d80: 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61  rg(ap, const cha
1d90: 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r*);.      sqlit
1da0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20  e3VdbeAddOp4(p, 
1db0: 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a  z==0 ? OP_Null :
1dc0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
1dd0: 69 44 65 73 74 2b 69 2c 20 30 2c 20 7a 2c 20 30  iDest+i, 0, z, 0
1de0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1df0: 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20   c=='i' ){.     
1e00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e10: 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(p, OP_Integer
1e20: 2c 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  , va_arg(ap, int
1e30: 29 2c 20 69 44 65 73 74 2b 69 29 3b 0a 20 20 20  ), iDest+i);.   
1e40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f   }else{.      go
1e50: 74 6f 20 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c  to skip_op_resul
1e60: 74 72 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  trow;.    }.  }.
1e70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1e80: 4f 70 32 28 70 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(p, OP_Result
1e90: 52 6f 77 2c 20 69 44 65 73 74 2c 20 69 29 3b 0a  Row, iDest, i);.
1ea0: 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f  skip_op_resultro
1eb0: 77 3a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  w:.  va_end(ap);
1ec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1ed0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1ee0: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1ef0: 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e  ue as a pointer.
1f00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1f10: 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62  dbeAddOp4(.  Vdb
1f20: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1f30: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
1f40: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
1f50: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
1f60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1f70: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
1f80: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
1f90: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
1fa0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc0: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
1fd0: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
1fe0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1ff0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
2000: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
2010: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
2020: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
2030: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
2040: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
2050: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
2060: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2070: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
2080: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
2090: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
20a0: 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34  p, addr, zP4, p4
20b0: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
20c0: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
20d0: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
20e0: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
20f0: 34 20 76 61 6c 75 65 20 77 69 74 68 20 61 20 50  4 value with a P
2100: 34 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34  4_INT64 or.** P4
2110: 5f 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69  _REAL type..*/.i
2120: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
2130: 64 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62 65  dOp4Dup8(.  Vdbe
2140: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2150: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64  /* Add the opcod
2160: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  e to this VM */.
2170: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
2180: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
2190: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74   opcode */.  int
21a0: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   p1,            
21b0: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61   /* The P1 opera
21c0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20  nd */.  int p2, 
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21e0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f  he P2 operand */
21f0: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20  .  int p3,      
2200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33         /* The P3
2210: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f   operand */.  co
2220: 6e 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20 20  nst u8 *zP4,    
2230: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72    /* The P4 oper
2240: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74  and */.  int p4t
2250: 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ype          /* 
2260: 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20  P4 operand type 
2270: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 34  */.){.  char *p4
2280: 63 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44 62  copy = sqlite3Db
2290: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69  MallocRawNN(sqli
22a0: 74 65 33 56 64 62 65 44 62 28 70 29 2c 20 38 29  te3VdbeDb(p), 8)
22b0: 3b 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20 29  ;.  if( p4copy )
22c0: 20 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c 20   memcpy(p4copy, 
22d0: 7a 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75 72  zP4, 8);.  retur
22e0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
22f0: 4f 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70  Op4(p, op, p1, p
2300: 32 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20 70  2, p3, p4copy, p
2310: 34 74 79 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e 64  4type);.}..#ifnd
2320: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2330: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74  XPLAIN./*.** Ret
2340: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
2350: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 45  of the current E
2360: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
2370: 4e 20 62 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20 30  N baseline..** 0
2380: 20 6d 65 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a 2a   means "none"..*
2390: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
23a0: 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28 50  eExplainParent(P
23b0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
23c0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
23d0: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72  if( pParse->addr
23e0: 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74  Explain==0 ) ret
23f0: 75 72 6e 20 30 3b 0a 20 20 70 4f 70 20 3d 20 73  urn 0;.  pOp = s
2400: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
2410: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
2420: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
2430: 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  in);.  return pO
2440: 70 2d 3e 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->p2;.}../*.** 
2450: 41 64 64 20 61 20 6e 65 77 20 4f 50 5f 45 78 70  Add a new OP_Exp
2460: 6c 61 69 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  lain opcode..**.
2470: 2a 2a 20 49 66 20 74 68 65 20 62 50 75 73 68 20  ** If the bPush 
2480: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
2490: 65 6e 20 6d 61 6b 65 20 74 68 69 73 20 6f 70 63  en make this opc
24a0: 6f 64 65 20 74 68 65 20 70 61 72 65 6e 74 20 66  ode the parent f
24b0: 6f 72 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74  or.** subsequent
24c0: 20 45 78 70 6c 61 69 6e 73 20 75 6e 74 69 6c 20   Explains until 
24d0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61  sqlite3VdbeExpla
24e0: 69 6e 50 6f 70 28 29 20 69 73 20 63 61 6c 6c 65  inPop() is calle
24f0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2500: 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28 50 61  e3VdbeExplain(Pa
2510: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 75 38 20  rse *pParse, u8 
2520: 62 50 75 73 68 2c 20 63 6f 6e 73 74 20 63 68 61  bPush, const cha
2530: 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
2540: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
2550: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
2560: 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 56  har *zMsg;.    V
2570: 64 62 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f 6c  dbe *v;.    va_l
2580: 69 73 74 20 61 70 3b 0a 20 20 20 20 69 6e 74 20  ist ap;.    int 
2590: 69 54 68 69 73 3b 0a 20 20 20 20 76 61 5f 73 74  iThis;.    va_st
25a0: 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
25b0: 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
25c0: 33 56 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  3VMPrintf(pParse
25d0: 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29 3b  ->db, zFmt, ap);
25e0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
25f0: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
2600: 3e 70 56 64 62 65 3b 0a 20 20 20 20 69 54 68 69  >pVdbe;.    iThi
2610: 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20  s = v->nOp;.    
2620: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2630: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
2640: 20 69 54 68 69 73 2c 20 70 50 61 72 73 65 2d 3e   iThis, pParse->
2650: 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c 0a  addrExplain, 0,.
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f 44        zMsg, P4_D
2680: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 69 66 28  YNAMIC);.    if(
2690: 20 62 50 75 73 68 29 20 70 50 61 72 73 65 2d 3e   bPush) pParse->
26a0: 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 69 54  addrExplain = iT
26b0: 68 69 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  his;.  }.}../*.*
26c0: 2a 20 50 6f 70 20 74 68 65 20 45 58 50 4c 41 49  * Pop the EXPLAI
26d0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 73 74 61  N QUERY PLAN sta
26e0: 63 6b 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f  ck one level..*/
26f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2700: 65 45 78 70 6c 61 69 6e 50 6f 70 28 50 61 72 73  eExplainPop(Pars
2710: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50  e *pParse){.  pP
2720: 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69  arse->addrExplai
2730: 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  n = sqlite3VdbeE
2740: 78 70 6c 61 69 6e 50 61 72 65 6e 74 28 70 50 61  xplainParent(pPa
2750: 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rse);.}.#endif /
2760: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
2770: 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PLAIN */../*.** 
2780: 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53  Add an OP_ParseS
2790: 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54  chema opcode.  T
27a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62  his routine is b
27b0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a  roken out from.*
27c0: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
27d0: 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e  Op4() since it n
27e0: 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65  eeds to also nee
27f0: 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62  ds to mark all b
2800: 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69  trees.** as havi
2810: 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a  ng been used..**
2820: 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73  .** The zWhere s
2830: 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20  tring must have 
2840: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
2850: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
2860: 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  c()..** This rou
2870: 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f  tine will take o
2880: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20  wnership of the 
2890: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
28a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
28b0: 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
28c0: 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69  emaOp(Vdbe *p, i
28d0: 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57  nt iDb, char *zW
28e0: 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a  here){.  int j;.
28f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2900: 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53  Op4(p, OP_ParseS
2910: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
2920: 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e  , zWhere, P4_DYN
2930: 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  AMIC);.  for(j=0
2940: 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20  ; j<p->db->nDb; 
2950: 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65  j++) sqlite3Vdbe
2960: 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b  UsesBtree(p, j);
2970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
2980: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
2990: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
29a0: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
29b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29c0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
29d0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
29e0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
29f0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
2a00: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
2a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a20: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
2a30: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
2a40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
2a50: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2a60: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
2a70: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
2a80: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2aa0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
2ab0: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
2ac0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
2ad0: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
2ae0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
2af0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
2b00: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
2b10: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
2b20: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
2b30: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  locFailed==0 ){.
2b40: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
2b50: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
2b60: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
2b70: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20   = P4_INT32;.   
2b80: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b   pOp->p4.i = p4;
2b90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64  .  }.  return ad
2ba0: 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74  dr;.}../* Insert
2bb0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f   the end of a co
2bc0: 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64  -routine.*/.void
2bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
2be0: 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76  oroutine(Vdbe *v
2bf0: 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b  , int regYield){
2c00: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2c10: 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
2c20: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
2c30: 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20  d);..  /* Clear 
2c40: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65  the temporary re
2c50: 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74 68  gister cache, th
2c60: 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74  ereby ensuring t
2c70: 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f  hat each.  ** co
2c80: 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73  -routine has its
2c90: 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74   own independent
2ca0: 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65 72   set of register
2cb0: 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f  s, because co-ro
2cc0: 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68  utines.  ** migh
2cd0: 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20 72  t expect their r
2ce0: 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20 70  egisters to be p
2cf0: 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73 20  reserved across 
2d00: 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64  an OP_Yield, and
2d10: 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64  .  ** that could
2d20: 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20   cause problems 
2d30: 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  if two or more c
2d40: 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  o-routines are u
2d50: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20  sing the same.  
2d60: 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ** temporary reg
2d70: 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d  ister..  */.  v-
2d80: 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  >pParse->nTempRe
2d90: 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72  g = 0;.  v->pPar
2da0: 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2db0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
2dc0: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
2dd0: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
2de0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
2df0: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
2e00: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
2e10: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
2e20: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
2e30: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
2e40: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
2e50: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
2e60: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
2e70: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
2e80: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
2e90: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
2ea0: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
2eb0: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
2ec0: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
2ed0: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
2ee0: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
2ef0: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
2f00: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
2f10: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
2f20: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
2f30: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
2f40: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
2f50: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
2f60: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
2f70: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
2f80: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
2f90: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
2fa0: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
2fb0: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
2fc0: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
2fd0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
2fe0: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
2ff0: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
3000: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
3010: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
3020: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
3030: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
3040: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76  akeLabel(Vdbe *v
3050: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20  ){.  Parse *p = 
3060: 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  v->pParse;.  int
3070: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
3080: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d  ;.  assert( v->m
3090: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
30a0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28  _INIT );.  if( (
30b0: 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b  i & (i-1))==0 ){
30c0: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  .    p->aLabel =
30d0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
30e0: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
30f0: 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20  ->aLabel, .     
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3120: 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66    (i*2+1)*sizeof
3130: 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b  (p->aLabel[0]));
3140: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c  .  }.  if( p->aL
3150: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
3160: 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20  Label[i] = -1;. 
3170: 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44 52   }.  return ADDR
3180: 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (i);.}../*.** Re
3190: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
31a0: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
31b0: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
31c0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
31d0: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
31e0: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
31f0: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
3200: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
3210: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
3220: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
3230: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  abel()..*/.void 
3240: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
3250: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c  veLabel(Vdbe *v,
3260: 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65   int x){.  Parse
3270: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
3280: 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28  .  int j = ADDR(
3290: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d  x);.  assert( v-
32a0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
32b0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
32c0: 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c  ert( j<p->nLabel
32d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
32e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
32f0: 4c 61 62 65 6c 20 29 7b 0a 23 69 66 64 65 66 20  Label ){.#ifdef 
3300: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
3310: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
3320: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
3330: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
3340: 20 20 20 70 72 69 6e 74 66 28 22 52 45 53 4f 4c     printf("RESOL
3350: 56 45 20 4c 41 42 45 4c 20 25 64 20 74 6f 20 25  VE LABEL %d to %
3360: 64 5c 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70 29  d\n", x, v->nOp)
3370: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
3380: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4c     assert( p->aL
3390: 61 62 65 6c 5b 6a 5d 3d 3d 28 2d 31 29 20 29 3b  abel[j]==(-1) );
33a0: 20 2f 2a 20 4c 61 62 65 6c 73 20 6d 61 79 20 6f   /* Labels may o
33b0: 6e 6c 79 20 62 65 20 72 65 73 6f 6c 76 65 64 20  nly be resolved 
33c0: 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 70 2d 3e 61  once */.    p->a
33d0: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f  Label[j] = v->nO
33e0: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p;.  }.}../*.** 
33f0: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73  Mark the VDBE as
3400: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e   one that can on
3410: 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69  ly be run one ti
3420: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
3430: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e  te3VdbeRunOnlyOn
3440: 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  ce(Vdbe *p){.  p
3450: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
3460: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
3470: 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65   the VDBE as one
3480: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62   that can only b
3490: 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20 74  e run multiple t
34a0: 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  imes..*/.void sq
34b0: 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c  lite3VdbeReusabl
34c0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  e(Vdbe *p){.  p-
34d0: 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30  >runOnlyOnce = 0
34e0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
34f0: 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69  TE_DEBUG /* sqli
3500: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
3510: 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a  t() logic */../*
3520: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
3530: 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74  g type and funct
3540: 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20  ion are used to 
3550: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
3560: 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69  all opcodes.** i
3570: 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72  n a Vdbe main pr
3580: 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f  ogram and each o
3590: 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  f the sub-progra
35a0: 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74  ms (triggers) it
35b0: 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20   may .** invoke 
35c0: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
35d0: 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c  rectly. It shoul
35e0: 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c  d be used as fol
35f0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70  lows:.**.**   Op
3600: 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65   *pOp;.**   Vdbe
3610: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a  OpIter sIter;.**
3620: 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49  .**   memset(&sI
3630: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ter, 0, sizeof(s
3640: 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74  Iter));.**   sIt
3650: 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20  er.v = v;       
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20       // v is of 
3680: 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20  type Vdbe* .**  
3690: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
36a0: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
36b0: 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20  )) ){.**     // 
36c0: 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  Do something wit
36d0: 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20  h pOp.**   }.** 
36e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
36f0: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
3700: 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65  ub);.** .*/.type
3710: 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f  def struct VdbeO
3720: 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72  pIter VdbeOpIter
3730: 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  ;.struct VdbeOpI
3740: 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b  ter {.  Vdbe *v;
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74     /* Vdbe to it
3770: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
3780: 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a  e opcodes of */.
3790: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
37a0: 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pSub;        /* 
37b0: 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  Array of subprog
37c0: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  rams */.  int nS
37d0: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
37e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
37f0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53  f entries in apS
3800: 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64  ub */.  int iAdd
3810: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3820: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
3830: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
3840: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  n to return */. 
3850: 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20   int iSub;      
3860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
3870: 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c   = main program,
3880: 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70   1 = first sub-p
3890: 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d  rogram etc. */.}
38a0: 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49  ;.static Op *opI
38b0: 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74  terNext(VdbeOpIt
38c0: 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a  er *p){.  Vdbe *
38d0: 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a  v = p->v;.  Op *
38e0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  pRet = 0;.  Op *
38f0: 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a  aOp;.  int nOp;.
3900: 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d  .  if( p->iSub<=
3910: 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20  p->nSub ){..    
3920: 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29  if( p->iSub==0 )
3930: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d  {.      aOp = v-
3940: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20  >aOp;.      nOp 
3950: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65  = v->nOp;.    }e
3960: 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  lse{.      aOp =
3970: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75   p->apSub[p->iSu
3980: 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20  b-1]->aOp;.     
3990: 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b   nOp = p->apSub[
39a0: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b  p->iSub-1]->nOp;
39b0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
39c0: 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20  t( p->iAddr<nOp 
39d0: 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26  );..    pRet = &
39e0: 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20  aOp[p->iAddr];. 
39f0: 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20     p->iAddr++;. 
3a00: 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d     if( p->iAddr=
3a10: 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  =nOp ){.      p-
3a20: 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >iSub++;.      p
3a30: 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  ->iAddr = 0;.   
3a40: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52   }.  .    if( pR
3a50: 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  et->p4type==P4_S
3a60: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
3a70: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
3a80: 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  p->nSub+1)*sizeo
3a90: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
3aa0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
3ab0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
3ac0: 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nSub; j++){.   
3ad0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75       if( p->apSu
3ae0: 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70  b[j]==pRet->p4.p
3af0: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
3b00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3b10: 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b  f( j==p->nSub ){
3b20: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75  .        p->apSu
3b30: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  b = sqlite3DbRea
3b40: 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62  llocOrFree(v->db
3b50: 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74  , p->apSub, nByt
3b60: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3b70: 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20  !p->apSub ){.   
3b80: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b         pRet = 0;
3b90: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
3ba0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53            p->apS
3bb0: 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20  ub[p->nSub++] = 
3bc0: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61  pRet->p4.pProgra
3bd0: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
3be0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
3bf0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3c00: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
3c10: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f   the program sto
3c20: 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73  red in the VM as
3c30: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
3c40: 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f  arse may.** thro
3c50: 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70  w an ABORT excep
3c60: 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68  tion (causing th
3c70: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  e statement, but
3c80: 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e   not entire tran
3c90: 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  saction.** to be
3ca0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54   rolled back). T
3cb0: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
3cc0: 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69   true if the mai
3cd0: 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79  n program or any
3ce0: 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  .** sub-programs
3cf0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66   contains any of
3d00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
3d10: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  **.**   *  OP_Ha
3d20: 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  lt with P1=SQLIT
3d30: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
3d40: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
3d50: 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e     *  OP_HaltIfN
3d60: 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49  ull with P1=SQLI
3d70: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
3d80: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
3d90: 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f  *   *  OP_Destro
3da0: 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70  y.**   *  OP_VUp
3db0: 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  date.**   *  OP_
3dc0: 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20  VRename.**   *  
3dd0: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74  OP_FkCounter wit
3de0: 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61  h P2==0 (immedia
3df0: 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
3e00: 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20  onstraint).**   
3e10: 2a 20 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65  *  OP_CreateBtre
3e20: 65 2f 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 61  e/BTREE_INTKEY a
3e30: 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  nd OP_InitCorout
3e40: 69 6e 65 20 0a 2a 2a 20 20 20 20 20 20 28 66 6f  ine .**      (fo
3e50: 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 41  r CREATE TABLE A
3e60: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a  S SELECT ...).**
3e70: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
3e80: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
3e90: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
3ea0: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
3eb0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
3ec0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
3ed0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
3ee0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
3ef0: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
3f00: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
3f10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3f20: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
3f30: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
3f40: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
3f50: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
3f60: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
3f70: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
3f80: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
3f90: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
3fa0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
3fb0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
3fc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
3fd0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
3fe0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
3ff0: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
4000: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
4010: 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65 72  int hasFkCounter
4020: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 43   = 0;.  int hasC
4030: 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b 0a  reateTable = 0;.
4040: 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f 72    int hasInitCor
4050: 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f 70  outine = 0;.  Op
4060: 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49   *pOp;.  VdbeOpI
4070: 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d  ter sIter;.  mem
4080: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
4090: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20  izeof(sIter));. 
40a0: 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20   sIter.v = v;.. 
40b0: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
40c0: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
40d0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
40e0: 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f   opcode = pOp->o
40f0: 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f  pcode;.    if( o
4100: 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f  pcode==OP_Destro
4110: 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  y || opcode==OP_
4120: 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64  VUpdate || opcod
4130: 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 20  e==OP_VRename . 
4140: 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d      || ((opcode=
4150: 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f  =OP_Halt || opco
4160: 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c  de==OP_HaltIfNul
4170: 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28 70  l) .      && ((p
4180: 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51  Op->p1&0xff)==SQ
4190: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
41a0: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41  && pOp->p2==OE_A
41b0: 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20  bort)).    ){.  
41c0: 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31      hasAbort = 1
41d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
41e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63     }.    if( opc
41f0: 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42 74  ode==OP_CreateBt
4200: 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ree && pOp->p3==
4210: 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20 68  BTREE_INTKEY ) h
4220: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  asCreateTable = 
4230: 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  1;.    if( opcod
4240: 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  e==OP_InitCorout
4250: 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72  ine ) hasInitCor
4260: 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e  outine = 1;.#ifn
4270: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4280: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20  FOREIGN_KEY.    
4290: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  if( opcode==OP_F
42a0: 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d  kCounter && pOp-
42b0: 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1==0 && pOp->p
42c0: 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61  2==1 ){.      ha
42d0: 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a  sFkCounter = 1;.
42e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
42f0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4300: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
4310: 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75  Sub);..  /* Retu
4320: 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62  rn true if hasAb
4330: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f  ort==mayAbort. O
4340: 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  r if a malloc fa
4350: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
4360: 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66    ** If malloc f
4370: 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ailed, then the 
4380: 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f  while() loop abo
4390: 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ve may not have 
43a0: 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68  iterated.  ** th
43b0: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65  rough all opcode
43c0: 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d  s and hasAbort m
43d0: 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72  ay be set incorr
43e0: 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20  ectly. Return.  
43f0: 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73  ** true for this
4400: 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74   case to prevent
4410: 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e   the assert() in
4420: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61   the callers fra
4430: 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69  me.  ** from fai
4440: 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75  ling.  */.  retu
4450: 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c  rn ( v->db->mall
4460: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41  ocFailed || hasA
4470: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c  bort==mayAbort |
4480: 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20  | hasFkCounter. 
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
44a0: 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20  (hasCreateTable 
44b0: 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74  && hasInitCorout
44c0: 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  ine) );.}.#endif
44d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
44e0: 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73   - the sqlite3As
44f0: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66  sertMayAbort() f
4500: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 64  unction */..#ifd
4510: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4520: 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
4530: 74 68 65 20 6e 57 72 69 74 65 20 63 6f 75 6e 74  the nWrite count
4540: 65 72 20 69 6e 20 74 68 65 20 56 44 42 45 20 69  er in the VDBE i
4550: 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
4560: 6e 6f 74 20 61 6e 0a 2a 2a 20 65 70 68 65 6d 65  not an.** epheme
4570: 72 61 6c 20 63 75 72 73 6f 72 2c 20 6f 72 20 69  ral cursor, or i
4580: 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 72 67  f the cursor arg
4590: 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a  ument is NULL..*
45a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
45b0: 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74  beIncrWriteCount
45c0: 65 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65  er(Vdbe *p, Vdbe
45d0: 43 75 72 73 6f 72 20 2a 70 43 29 7b 0a 20 20 69  Cursor *pC){.  i
45e0: 66 28 20 70 43 3d 3d 30 0a 20 20 20 7c 7c 20 28  f( pC==0.   || (
45f0: 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55  pC->eCurType!=CU
4600: 52 54 59 50 45 5f 53 4f 52 54 45 52 0a 20 20 20  RTYPE_SORTER.   
4610: 20 20 20 20 26 26 20 70 43 2d 3e 65 43 75 72 54      && pC->eCurT
4620: 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50 53 45  ype!=CURTYPE_PSE
4630: 55 44 4f 0a 20 20 20 20 20 20 20 26 26 20 21 70  UDO.       && !p
4640: 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 29 0a  C->isEphemeral).
4650: 20 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 57 72 69    ){.    p->nWri
4660: 74 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  te++;.  }.}.#end
4670: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
4680: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73  E_DEBUG./*.** As
4690: 73 65 72 74 20 69 66 20 61 6e 20 41 62 6f 72 74  sert if an Abort
46a0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   at this point i
46b0: 6e 20 74 69 6d 65 20 6d 69 67 68 74 20 72 65 73  n time might res
46c0: 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75 70 74  ult in a corrupt
46d0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  .** database..*/
46e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
46f0: 65 41 73 73 65 72 74 41 62 6f 72 74 61 62 6c 65  eAssertAbortable
4700: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
4710: 65 72 74 28 20 70 2d 3e 6e 57 72 69 74 65 3d 3d  ert( p->nWrite==
4720: 30 20 7c 7c 20 70 2d 3e 75 73 65 73 53 74 6d 74  0 || p->usesStmt
4730: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 7d 0a 23 65 6e  Journal );.}.#en
4740: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
4750: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4760: 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  d after all opco
4770: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
4780: 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70  serted.  It loop
4790: 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c  s.** through all
47a0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e 64   the opcodes and
47b0: 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20 64   fixes up some d
47c0: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  etails..**.** (1
47d0: 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70 20  ) For each jump 
47e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68  instruction with
47f0: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
4800: 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a  alue (a label).*
4810: 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74 68  *     resolve th
4820: 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61 6e  e P2 value to an
4830: 20 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 2e   actual address.
4840: 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75  .**.** (2) Compu
4850: 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  te the maximum n
4860: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4870: 74 73 20 75 73 65 64 20 62 79 20 61 6e 79 20 53  ts used by any S
4880: 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20  QL function.**  
4890: 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61     and store tha
48a0: 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78  t value in *pMax
48b0: 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20  FuncArgs..**.** 
48c0: 28 33 29 20 55 70 64 61 74 65 20 74 68 65 20 56  (3) Update the V
48d0: 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64  dbe.readOnly and
48e0: 20 56 64 62 65 2e 62 49 73 52 65 61 64 65 72 20   Vdbe.bIsReader 
48f0: 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61 74  flags to accurat
4900: 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63  ely.**     indic
4910: 61 74 65 20 77 68 61 74 20 74 68 65 20 70 72 65  ate what the pre
4920: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
4930: 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a  actually does..*
4940: 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61 6c  *.** (4) Initial
4950: 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76 61  ize the p4.xAdva
4960: 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f  nce pointer on o
4970: 70 63 6f 64 65 73 20 74 68 61 74 20 75 73 65 20  pcodes that use 
4980: 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65  it..**.** (5) Re
4990: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
49a0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 73   allocated for s
49b0: 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a  toring labels..*
49c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
49d0: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e 63  e will only func
49e0: 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79 20 69  tion correctly i
49f0: 66 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  f the mkopcodeh.
4a00: 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a  tcl generator.**
4a10: 20 73 63 72 69 70 74 20 6e 75 6d 62 65 72 73 20   script numbers 
4a20: 74 68 65 20 6f 70 63 6f 64 65 73 20 63 6f 72 72  the opcodes corr
4a30: 65 63 74 6c 79 2e 20 20 43 68 61 6e 67 65 73 20  ectly.  Changes 
4a40: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
4a50: 6d 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f 72 64  must be.** coord
4a60: 69 6e 61 74 65 64 20 77 69 74 68 20 63 68 61 6e  inated with chan
4a70: 67 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64 65 68  ges to mkopcodeh
4a80: 2e 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  .tcl..*/.static 
4a90: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61  void resolveP2Va
4aa0: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  lues(Vdbe *p, in
4ab0: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29  t *pMaxFuncArgs)
4ac0: 7b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73  {.  int nMaxArgs
4ad0: 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73   = *pMaxFuncArgs
4ae0: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50  ;.  Op *pOp;.  P
4af0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
4b00: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
4b10: 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73 65  *aLabel = pParse
4b20: 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72  ->aLabel;.  p->r
4b30: 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70  eadOnly = 1;.  p
4b40: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30 3b  ->bIsReader = 0;
4b50: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
4b60: 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77 68  [p->nOp-1];.  wh
4b70: 69 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f 2a 20  ile(1){..    /* 
4b80: 4f 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f 64 65  Only JUMP opcode
4b90: 73 20 61 6e 64 20 74 68 65 20 73 68 6f 72 74 20  s and the short 
4ba0: 6c 69 73 74 20 6f 66 20 73 70 65 63 69 61 6c 20  list of special 
4bb0: 6f 70 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73  opcodes in the s
4bc0: 77 69 74 63 68 0a 20 20 20 20 2a 2a 20 62 65 6c  witch.    ** bel
4bd0: 6f 77 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f  ow need to be co
4be0: 6e 73 69 64 65 72 65 64 2e 20 20 54 68 65 20 6d  nsidered.  The m
4bf0: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e  kopcodeh.tcl gen
4c00: 65 72 61 74 6f 72 20 73 63 72 69 70 74 20 67 72  erator script gr
4c10: 6f 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  oups.    ** all 
4c20: 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 74 6f  these opcodes to
4c30: 67 65 74 68 65 72 20 6e 65 61 72 20 74 68 65 20  gether near the 
4c40: 66 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f 70 63  front of the opc
4c50: 6f 64 65 20 6c 69 73 74 2e 20 20 53 6b 69 70 0a  ode list.  Skip.
4c60: 20 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63 6f 64      ** any opcod
4c70: 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
4c80: 6e 65 65 64 20 70 72 6f 63 65 73 73 69 6e 67 20  need processing 
4c90: 62 79 20 76 69 72 74 75 61 6c 20 6f 66 20 74 68  by virtual of th
4ca0: 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 20 20  e fact that.    
4cb0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
4cc0: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a  than SQLITE_MX_J
4cd0: 55 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73 20 61  UMP_OPCODE, as a
4ce0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
4cf0: 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  imization..    *
4d00: 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  /.    if( pOp->o
4d10: 70 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f 4d 58  pcode<=SQLITE_MX
4d20: 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29 7b 0a  _JUMP_OPCODE ){.
4d30: 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42        /* NOTE: B
4d40: 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65  e sure to update
4d50: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 77   mkopcodeh.tcl w
4d60: 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65  hen adding or re
4d70: 6d 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  moving.      ** 
4d80: 63 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20  cases from this 
4d90: 73 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 20  switch! */.     
4da0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70   switch( pOp->op
4db0: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  code ){.        
4dc0: 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74  case OP_Transact
4dd0: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ion: {.         
4de0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20   if( pOp->p2!=0 
4df0: 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ) p->readOnly = 
4e00: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;.          /* 
4e10: 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  fall thru */.   
4e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
4e30: 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  ase OP_AutoCommi
4e40: 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  t:.        case 
4e50: 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a  OP_Savepoint: {.
4e60: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73            p->bIs
4e70: 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  Reader = 1;.    
4e80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4e90: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
4ea0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
4eb0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43         case OP_C
4ec0: 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69  heckpoint:.#endi
4ed0: 66 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  f.        case O
4ee0: 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 20  P_Vacuum:.      
4ef0: 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61    case OP_Journa
4f00: 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20  lMode: {.       
4f10: 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d     p->readOnly =
4f20: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   0;.          p-
4f30: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a  >bIsReader = 1;.
4f40: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4f50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4f60: 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a     case OP_Next:
4f70: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
4f80: 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20  _SorterNext: {. 
4f90: 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34           pOp->p4
4fa0: 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69  .xAdvance = sqli
4fb0: 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20  te3BtreeNext;.  
4fc0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74          pOp->p4t
4fd0: 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45  ype = P4_ADVANCE
4fe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;.          /* T
4ff0: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
5000: 72 20 6e 65 76 65 72 20 63 6f 64 65 73 20 61 6e  r never codes an
5010: 79 20 6f 66 20 74 68 65 73 65 20 6f 70 63 6f 64  y of these opcod
5020: 65 73 20 61 73 20 61 20 6a 75 6d 70 0a 20 20 20  es as a jump.   
5030: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c         ** to a l
5040: 61 62 65 6c 2e 20 20 54 68 65 79 20 61 72 65 20  abel.  They are 
5050: 61 6c 77 61 79 73 20 63 6f 64 65 64 20 61 73 20  always coded as 
5060: 61 20 6a 75 6d 70 20 62 61 63 6b 77 61 72 64 73  a jump backwards
5070: 20 74 6f 20 61 20 0a 20 20 20 20 20 20 20 20 20   to a .         
5080: 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73   ** known addres
5090: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  s */.          a
50a0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d  ssert( pOp->p2>=
50b0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
50c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
50d0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
50e0: 50 72 65 76 3a 20 7b 0a 20 20 20 20 20 20 20 20  Prev: {.        
50f0: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
5100: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
5110: 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20  ePrevious;.     
5120: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
5130: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5150: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e  code generator n
5160: 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f  ever codes any o
5170: 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20  f these opcodes 
5180: 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20  as a jump.      
5190: 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65      ** to a labe
51a0: 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77  l.  They are alw
51b0: 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a  ays coded as a j
51c0: 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f  ump backwards to
51d0: 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   a .          **
51e0: 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a   known address *
51f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
5200: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29  rt( pOp->p2>=0 )
5210: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5220: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  k;.        }.#if
5230: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5240: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
5250: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55        case OP_VU
5260: 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20  pdate: {.       
5270: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e     if( pOp->p2>n
5280: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
5290: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  gs = pOp->p2;.  
52a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
52b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
52c0: 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72   case OP_VFilter
52d0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  : {.          in
52e0: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  t n;.          a
52f0: 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70 2d  ssert( (pOp - p-
5300: 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20  >aOp) >= 3 );.  
5310: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5320: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
5330: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
5340: 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b          n = pOp[
5350: 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20  -1].p1;.        
5360: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73    if( n>nMaxArgs
5370: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b   ) nMaxArgs = n;
5380: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61  .          /* Fa
5390: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
53a0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 73 65  the default case
53b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 23 65   */.        }.#e
53c0: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 65 66  ndif.        def
53d0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
53e0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3c 30 20    if( pOp->p2<0 
53f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
5400: 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  * The mkopcodeh.
5410: 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20 73  tcl script has s
5420: 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67  o arranged thing
5430: 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a  s that the only.
5440: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e              ** n
5450: 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20  on-jump opcodes 
5460: 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45  less than SQLITE
5470: 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72  _MX_JUMP_CODE ar
5480: 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a  e guaranteed to.
5490: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68              ** h
54a0: 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  ave non-negative
54b0: 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e 20   values for P2. 
54c0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  */.            a
54d0: 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 4f  ssert( (sqlite3O
54e0: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
54f0: 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  p->opcode] & OPF
5500: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 3b 0a 20  LG_JUMP)!=0 );. 
5510: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
5520: 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29  t( ADDR(pOp->p2)
5530: 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20  <pParse->nLabel 
5540: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
5550: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
5560: 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a  ADDR(pOp->p2)];.
5570: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
55a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70       /* The mkop
55b0: 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74  codeh.tcl script
55c0: 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64   has so arranged
55d0: 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68 65   things that the
55e0: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6e   only.      ** n
55f0: 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20  on-jump opcodes 
5600: 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45  less than SQLITE
5610: 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72  _MX_JUMP_CODE ar
5620: 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a  e guaranteed to.
5630: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f        ** have no
5640: 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  n-negative value
5650: 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20  s for P2. */.   
5660: 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69     assert( (sqli
5670: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
5680: 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26 4f  y[pOp->opcode]&O
5690: 50 46 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c 7c  PFLG_JUMP)==0 ||
56a0: 20 70 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20 20   pOp->p2>=0);.  
56b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 3d    }.    if( pOp=
56c0: 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b 3b  =p->aOp ) break;
56d0: 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a  .    pOp--;.  }.
56e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
56f0: 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  p->db, pParse->a
5700: 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65  Label);.  pParse
5710: 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20  ->aLabel = 0;.  
5720: 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d  pParse->nLabel =
5730: 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41   0;.  *pMaxFuncA
5740: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
5750: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
5760: 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d  Reader!=0 || DbM
5770: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74  askAllZero(p->bt
5780: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f  reeMask) );.}../
5790: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
57a0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
57b0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
57c0: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  to be inserted..
57d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
57e0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64  beCurrentAddr(Vd
57f0: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
5800: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
5810: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
5820: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a   return p->nOp;.
5830: 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20  }../*.** Verify 
5840: 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20  that at least N 
5850: 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65  opcode slots are
5860: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20   available in p 
5870: 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e  without.** havin
5880: 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20  g to malloc for 
5890: 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63 65  more space (exce
58a0: 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  pt when compiled
58b0: 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45   using.** SQLITE
58c0: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
58d0: 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74  RESS).  This int
58e0: 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20 64  erface is used d
58f0: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a  uring testing.**
5900: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
5910: 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f  certain calls to
5920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5930: 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65  pList() can neve
5940: 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f  r.** fail due to
5950: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64   a OOM fault and
5960: 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65 20   hence that the 
5970: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
5980: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
5990: 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c  AddOpList() will
59a0: 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e   always be non-N
59b0: 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ULL..*/.#if defi
59c0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
59d0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
59e0: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
59f0: 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73  C_STRESS).void s
5a00: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
5a10: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
5a20: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29  (Vdbe *p, int N)
5a30: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
5a40: 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50 61  Op + N <= p->pPa
5a50: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b  rse->nOpAlloc );
5a60: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5a70: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
5a80: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74 68   VM passed as th
5a90: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
5aa0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
5ab0: 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74  .** an OP_Result
5ac0: 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69 6c  Row opcode. Fail
5ad0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66 20   an assert() if 
5ae0: 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69 73  it does. This is
5af0: 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64 65   used.** by code
5b00: 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f 20   in pragma.c to 
5b10: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
5b20: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
5b30: 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72 61  f certain.** pra
5b40: 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77 69  gmas comports wi
5b50: 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70 65  th the flags spe
5b60: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 6b  cified in the mk
5b70: 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a 2a  pragmatab.tcl.**
5b80: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66 20   script..*/.#if 
5b90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
5ba0: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
5bb0: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  d(SQLITE_TEST_RE
5bc0: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f  ALLOC_STRESS).vo
5bd0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65  id sqlite3VdbeVe
5be0: 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28  rifyNoResultRow(
5bf0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
5c00: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5c10: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
5c20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
5c30: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52  [i].opcode!=OP_R
5c40: 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d 0a  esultRow );.  }.
5c50: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5c60: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 61  Generate code (a
5c70: 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72 74   single OP_Abort
5c80: 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68 61  able opcode) tha
5c90: 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66 79  t will.** verify
5ca0: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 70   that the VDBE p
5cb0: 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65 6c  rogram can safel
5cc0: 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e 20  y call Abort in 
5cd0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
5ce0: 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20 64  ontext..*/.#if d
5cf0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
5d00: 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  BUG).void sqlite
5d10: 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74  3VdbeVerifyAbort
5d20: 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  able(Vdbe *p, in
5d30: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69 66  t onError){.  if
5d40: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62  ( onError==OE_Ab
5d50: 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56 64 62  ort ) sqlite3Vdb
5d60: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41 62  eAddOp0(p, OP_Ab
5d70: 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e 64  ortable);.}.#end
5d80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
5d90: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
5da0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
5db0: 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65   array of opcode
5dc0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
5dd0: 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61  h.** the Vdbe pa
5de0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
5df0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69  t argument. It i
5e00: 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65  s the callers re
5e10: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
5e20: 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74  to arrange for t
5e30: 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61  he returned arra
5e40: 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c  y to be eventual
5e50: 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 74  ly freed using t
5e60: 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f  he .** vdbeFreeO
5e70: 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f  pArray() functio
5e80: 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  n..**.** Before 
5e90: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70  returning, *pnOp
5ea0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
5eb0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
5ec0: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64   in the returned
5ed0: 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c  .** array. Also,
5ee0: 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65   *pnMaxArg is se
5ef0: 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20  t to the larger 
5f00: 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  of its current v
5f10: 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65  alue and .** the
5f20: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
5f30: 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  es in the Vdbe.a
5f40: 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71  pArg[] array req
5f50: 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74 65  uired to execute
5f60: 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65   the .** returne
5f70: 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64  d program..*/.Vd
5f80: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
5f90: 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62  eTakeOpArray(Vdb
5fa0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c  e *p, int *pnOp,
5fb0: 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b   int *pnMaxArg){
5fc0: 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d  .  VdbeOp *aOp =
5fd0: 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72   p->aOp;.  asser
5fe0: 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62  t( aOp && !p->db
5ff0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6000: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
6010: 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  at sqlite3VdbeUs
6020: 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f  esBtree() was no
6030: 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73  t called on this
6040: 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   VM */.  assert(
6050: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
6060: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a  ->btreeMask) );.
6070: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
6080: 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b  es(p, pnMaxArg);
6090: 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f  .  *pnOp = p->nO
60a0: 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b  p;.  p->aOp = 0;
60b0: 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d  .  return aOp;.}
60c0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
60d0: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
60e0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
60f0: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
6100: 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  Return a.** poin
6110: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  ter to the first
6120: 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72   operation inser
6130: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a  ted..**.** Non-z
6140: 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74 73  ero P2 arguments
6150: 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   to jump instruc
6160: 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d 61  tions are automa
6170: 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65 64  tically adjusted
6180: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
6190: 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20 72  jump target is r
61a0: 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 66  elative to the f
61b0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69  irst operation i
61c0: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62 65  nserted..*/.Vdbe
61d0: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41  Op *sqlite3VdbeA
61e0: 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62 65  ddOpList(.  Vdbe
61f0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
6200: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
6210: 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20 70  opcodes to the p
6220: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
6230: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c 20  t */.  int nOp, 
6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6250: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6260: 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64 20   opcodes to add 
6270: 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74 20  */.  VdbeOpList 
6280: 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20 20  const *aOp,     
6290: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 73    /* The opcodes
62a0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a   to be added */.
62b0: 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20 20    int iLineno   
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
62d0: 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c 69  * Source-file li
62e0: 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72  ne number of fir
62f0: 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a  st opcode */.){.
6300: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
6310: 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73 74  p *pOut, *pFirst
6320: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e  ;.  assert( nOp>
6330: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6340: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
6350: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
6360: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
6370: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
6380: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
6390: 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20  ray(p, nOp) ){. 
63a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
63b0: 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f 75 74  .  pFirst = pOut
63c0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
63d0: 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  p];.  for(i=0; i
63e0: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b  <nOp; i++, aOp++
63f0: 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 70  , pOut++){.    p
6400: 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f  Out->opcode = aO
6410: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70  p->opcode;.    p
6420: 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70  Out->p1 = aOp->p
6430: 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32 20  1;.    pOut->p2 
6440: 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 61  = aOp->p2;.    a
6450: 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e 3d  ssert( aOp->p2>=
6460: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71  0 );.    if( (sq
6470: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
6480: 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d  rty[aOp->opcode]
6490: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
64a0: 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20 29  0 && aOp->p2>0 )
64b0: 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32  {.      pOut->p2
64c0: 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20   += p->nOp;.    
64d0: 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d  }.    pOut->p3 =
64e0: 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70 4f   aOp->p3;.    pO
64f0: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
6500: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 70 4f 75  NOTUSED;.    pOu
6510: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
6520: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
6530: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6540: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
6550: 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e 7a  ENTS.    pOut->z
6560: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e  Comment = 0;.#en
6570: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
6580: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
6590: 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69      pOut->iSrcLi
65a0: 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a  ne = iLineno+i;.
65b0: 23 65 6c 73 65 0a 20 20 20 20 28 76 6f 69 64 29  #else.    (void)
65c0: 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a  iLineno;.#endif.
65d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
65e0: 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 64  BUG.    if( p->d
65f0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6600: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
6610: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6620: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
6630: 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f  i+p->nOp, &p->aO
6640: 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20  p[i+p->nOp]);.  
6650: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
6660: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
6670: 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b    return pFirst;
6680: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
6690: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
66a0: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f  MT_SCANSTATUS)./
66b0: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72  *.** Add an entr
66c0: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  y to the array o
66d0: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67  f counters manag
66e0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74  ed by sqlite3_st
66f0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e  mt_scanstatus().
6700: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6710: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a  VdbeScanStatus(.
6720: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6740: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73    /* VM to add s
6750: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a  canstatus() to *
6760: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c  /.  int addrExpl
6770: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
6780: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
6790: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72  f OP_Explain (or
67a0: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64   0) */.  int add
67b0: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  rLoop,          
67c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
67d0: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e  ess of loop coun
67e0: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64  ter */ .  int ad
67f0: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20  drVisit,        
6800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
6810: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73  ress of rows vis
6820: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ited counter */.
6830: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20    LogEst nEst,  
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6850: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
6860: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
6870: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rows */.  const 
6880: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
6890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
68a0: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e  e of table or in
68b0: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  dex being scanne
68c0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  d */.){.  int nB
68d0: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b  yte = (p->nScan+
68e0: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e  1) * sizeof(Scan
68f0: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53  Status);.  ScanS
6900: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61  tatus *aNew;.  a
6910: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75  New = (ScanStatu
6920: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c  s*)sqlite3DbReal
6930: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53  loc(p->db, p->aS
6940: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  can, nByte);.  i
6950: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53  f( aNew ){.    S
6960: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20  canStatus *pNew 
6970: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e  = &aNew[p->nScan
6980: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ++];.    pNew->a
6990: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64  ddrExplain = add
69a0: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e  rExplain;.    pN
69b0: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61  ew->addrLoop = a
69c0: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65  ddrLoop;.    pNe
69d0: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61  w->addrVisit = a
69e0: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e  ddrVisit;.    pN
69f0: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b  ew->nEst = nEst;
6a00: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  .    pNew->zName
6a10: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
6a20: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  up(p->db, zName)
6a30: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d  ;.    p->aScan =
6a40: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   aNew;.  }.}.#en
6a50: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
6a60: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
6a70: 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20 50  the opcode, or P
6a80: 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50 35  1, P2, P3, or P5
6a90: 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f 72   operands.** for
6aa0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
6ab0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
6ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6ad0: 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70  geOpcode(Vdbe *p
6ae0: 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38 20 69  , u32 addr, u8 i
6af0: 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73 71  NewOpcode){.  sq
6b00: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
6b10: 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20 3d  ,addr)->opcode =
6b20: 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76   iNewOpcode;.}.v
6b30: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
6b40: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c  hangeP1(Vdbe *p,
6b50: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
6b60: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
6b70: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
6b80: 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p1 = val;.}.voi
6b90: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
6ba0: 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75  ngeP2(Vdbe *p, u
6bb0: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
6bc0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
6bd0: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70  GetOp(p,addr)->p
6be0: 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20  2 = val;.}.void 
6bf0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6c00: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP3(Vdbe *p, u32
6c10: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
6c20: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
6c30: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33 20  tOp(p,addr)->p3 
6c40: 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71  = val;.}.void sq
6c50: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6c60: 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36 20 70  5(Vdbe *p, u16 p
6c70: 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  5){.  assert( p-
6c80: 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62 2d  >nOp>0 || p->db-
6c90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6ca0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20  .  if( p->nOp>0 
6cb0: 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  ) p->aOp[p->nOp-
6cc0: 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f  1].p5 = p5;.}../
6cd0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
6ce0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  P2 operand of in
6cf0: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73  struction addr s
6d00: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
6d10: 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65   to.** the addre
6d20: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
6d30: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
6d40: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20   coded..*/.void 
6d50: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
6d60: 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ere(Vdbe *p, int
6d70: 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65   addr){.  sqlite
6d80: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
6d90: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
6da0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
6db0: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
6dc0: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
6dd0: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
6de0: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
6df0: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
6e00: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
6e10: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
6e20: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
6e30: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
6e40: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
6e50: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
6e60: 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
6e70: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
6e80: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
6e90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
6ea0: 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d  N(db, pDef);.  }
6eb0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
6ec0: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
6ed0: 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c  sqlite3 *, Op *,
6ee0: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65   int);../*.** De
6ef0: 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20  lete a P4 value 
6f00: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
6f10: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
6f20: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65  OINLINE void fre
6f30: 65 50 34 4d 65 6d 28 73 71 6c 69 74 65 33 20 2a  eP4Mem(sqlite3 *
6f40: 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69  db, Mem *p){.  i
6f50: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
6f60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6f70: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
6f80: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e    sqlite3DbFreeN
6f90: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74  N(db, p);.}.stat
6fa0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
6fb0: 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 46 75  NE void freeP4Fu
6fc0: 6e 63 43 74 78 28 73 71 6c 69 74 65 33 20 2a 64  ncCtx(sqlite3 *d
6fd0: 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  b, sqlite3_conte
6fe0: 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 45 70  xt *p){.  freeEp
6ff0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
7000: 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a 20  db, p->pFunc);. 
7010: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
7020: 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63  db, p);.}.static
7030: 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c   void freeP4(sql
7040: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34  ite3 *db, int p4
7050: 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b  type, void *p4){
7060: 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b  .  assert( db );
7070: 0a 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70  .  switch( p4typ
7080: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
7090: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20  _FUNCCTX: {.    
70a0: 20 20 66 72 65 65 50 34 46 75 6e 63 43 74 78 28    freeP4FuncCtx(
70b0: 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e  db, (sqlite3_con
70c0: 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20 20  text*)p4);.     
70d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
70e0: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a    case P4_REAL:.
70f0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
7100: 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44  4:.    case P4_D
7110: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73 65  YNAMIC:.    case
7120: 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20   P4_DYNBLOB:.   
7130: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
7140: 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y: {.      sqlit
7150: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29  e3DbFree(db, p4)
7160: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7170: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7180: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
7190: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
71a0: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
71b0: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
71c0: 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20  (KeyInfo*)p4);. 
71d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
71e0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
71f0: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
7200: 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f  NTS.    case P4_
7210: 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  EXPR: {.      sq
7220: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7230: 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b 0a  db, (Expr*)p4);.
7240: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7250: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
7260: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
7270: 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d  .      freeEphem
7280: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c  eralFunction(db,
7290: 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a   (FuncDef*)p4);.
72a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
72b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
72c0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EM: {.      if( 
72d0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
72e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
72f0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
7300: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
7310: 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p4);.      }else
7320: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 34  {.        freeP4
7330: 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70 34  Mem(db, (Mem*)p4
7340: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7360: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a    case P4_VTAB :
7370: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d   {.      if( db-
7380: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
7390: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e   ) sqlite3VtabUn
73a0: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70  lock((VTable *)p
73b0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
73c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
73d0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61  .** Free the spa
73e0: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
73f0: 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20   aOp and any p4 
7400: 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64  values allocated
7410: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f   for the.** opco
7420: 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  des contained wi
7430: 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20  thin. If aOp is 
7440: 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61  not NULL it is a
7450: 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
7460: 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65  n .** nOp entrie
7470: 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s. .*/.static vo
7480: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
7490: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ay(sqlite3 *db, 
74a0: 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70  Op *aOp, int nOp
74b0: 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a  ){.  if( aOp ){.
74c0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20      Op *pOp;.   
74d0: 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e 4f   for(pOp=&aOp[nO
74e0: 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b 20  p-1]; pOp>=aOp; 
74f0: 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  pOp--){.      if
7500: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c 3d  ( pOp->p4type <=
7510: 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20 29   P4_FREE_IF_LE )
7520: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
7530: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
7540: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  .p);.#ifdef SQLI
7550: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
7560: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
7570: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7580: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
7590: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
75a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
75b0: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f 70  DbFreeNN(db, aOp
75c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
75d0: 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67  Link the SubProg
75e0: 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ram object passe
75f0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
7600: 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68  argument into th
7610: 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74  e linked.** list
7620: 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f   at Vdbe.pSubPro
7630: 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20  gram. This list 
7640: 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74  is used to delet
7650: 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61  e all sub-progra
7660: 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65  m.** objects whe
7670: 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c  n the VM is no l
7680: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
7690: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
76a0: 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61  dbeLinkSubProgra
76b0: 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  m(Vdbe *pVdbe, S
76c0: 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20  ubProgram *p){. 
76d0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62   p->pNext = pVdb
76e0: 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70  e->pProgram;.  p
76f0: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d  Vdbe->pProgram =
7700: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   p;.}../*.** Cha
7710: 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61  nge the opcode a
7720: 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e  t addr into OP_N
7730: 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  oop.*/.int sqlit
7740: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
7750: 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  op(Vdbe *p, int 
7760: 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70 20  addr){.  VdbeOp 
7770: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 64  *pOp;.  if( p->d
7780: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7790: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
77a0: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26  sert( addr>=0 &&
77b0: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
77c0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
77d0: 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28  addr];.  freeP4(
77e0: 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  p->db, pOp->p4ty
77f0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
7800: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
7810: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 4f  P4_NOTUSED;.  pO
7820: 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20 70  p->p4.z = 0;.  p
7830: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
7840: 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 31  Noop;.  return 1
7850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
7860: 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73  e last opcode is
7870: 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20   "op" and it is 
7880: 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69  not a jump desti
7890: 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20  nation,.** then 
78a0: 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75  remove it.  Retu
78b0: 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f  rn true if and o
78c0: 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65  nly if an opcode
78d0: 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f   was removed..*/
78e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
78f0: 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64  DeletePriorOpcod
7900: 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70  e(Vdbe *p, u8 op
7910: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  ){.  if( p->nOp>
7920: 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 && p->aOp[p->n
7930: 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70  Op-1].opcode==op
7940: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
7950: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7960: 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70  ToNoop(p, p->nOp
7970: 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
7980: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7990: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
79a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
79b0: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
79c0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
79d0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
79e0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
79f0: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
7a00: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
7a10: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
7a20: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
7a30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
7a40: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
7a50: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
7a60: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
7a70: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
7a80: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
7a90: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
7aa0: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
7ab0: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
7ac0: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
7ad0: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
7ae0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
7af0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
7b00: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
7b10: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
7b20: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
7b30: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
7b40: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
7b50: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
7b60: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
7b70: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
7b80: 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c  ** .** Other val
7b90: 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41  ues of n (P4_STA
7ba0: 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20  TIC, P4_COLLSEQ 
7bb0: 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74  etc.) indicate t
7bc0: 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a  hat zP4 points.*
7bd0: 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72  * to a string or
7be0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7bf0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
7c00: 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c   exist for the l
7c10: 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  ifetime of.** th
7c20: 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65  e Vdbe. In these
7c30: 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75   cases we can ju
7c40: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
7c50: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64  ter..**.** If ad
7c60: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65  dr<0 then change
7c70: 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P4 on the most 
7c80: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
7c90: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
7ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51  /.static void SQ
7cb0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64  LITE_NOINLINE vd
7cc0: 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a  beChangeP4Full(.
7cd0: 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20    Vdbe *p,.  Op 
7ce0: 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *pOp,.  const ch
7cf0: 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e  ar *zP4,.  int n
7d00: 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  .){.  if( pOp->p
7d10: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65  4type ){.    fre
7d20: 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e  eP4(p->db, pOp->
7d30: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
7d40: 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  p);.    pOp->p4t
7d50: 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70  ype = 0;.    pOp
7d60: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a  ->p4.p = 0;.  }.
7d70: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
7d80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7d90: 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f  geP4(p, (int)(pO
7da0: 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34  p - p->aOp), zP4
7db0: 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , n);.  }else{. 
7dc0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
7dd0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7de0: 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  0(zP4);.    pOp-
7df0: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44  >p4.z = sqlite3D
7e00: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
7e10: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP4, n);.    pOp
7e20: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59  ->p4type = P4_DY
7e30: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  NAMIC;.  }.}.voi
7e40: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
7e50: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69  ngeP4(Vdbe *p, i
7e60: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
7e70: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29  har *zP4, int n)
7e80: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73  {.  Op *pOp;.  s
7e90: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
7ea0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
7eb0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
7ec0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
7ed0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
7ee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
7ef0: 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  aOp!=0 || db->ma
7f00: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
7f10: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7f20: 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20  iled ){.    if( 
7f30: 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65  n!=P4_VTAB ) fre
7f40: 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64  eP4(db, n, (void
7f50: 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29  *)*(char**)&zP4)
7f60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
7f70: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
7f80: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
7f90: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  ( addr<p->nOp );
7fa0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
7fb0: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
7fc0: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f  Op - 1;.  }.  pO
7fd0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
7fe0: 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c  ];.  if( n>=0 ||
7ff0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
8000: 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50 34      vdbeChangeP4
8010: 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34  Full(p, pOp, zP4
8020: 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , n);.    return
8030: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50  ;.  }.  if( n==P
8040: 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f  4_INT32 ){.    /
8050: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73  * Note: this cas
8060: 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75  t is safe, becau
8070: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61  se the origin da
8080: 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20  ta point was an 
8090: 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  int.    ** that 
80a0: 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63  was cast to a (c
80b0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f  onst char *). */
80c0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
80d0: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
80e0: 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  NT(zP4);.    pOp
80f0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e  ->p4type = P4_IN
8100: 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  T32;.  }else if(
8110: 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61   zP4!=0 ){.    a
8120: 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20  ssert( n<0 );.  
8130: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
8140: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
8150: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67  p->p4type = (sig
8160: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20  ned char)n;.    
8170: 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29  if( n==P4_VTAB )
8180: 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b   sqlite3VtabLock
8190: 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a  ((VTable*)zP4);.
81a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
81b0: 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72 61  nge the P4 opera
81c0: 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  nd of the most r
81d0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
81e0: 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74 6f  struction .** to
81f0: 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69 6e   the value defin
8200: 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d 65  ed by the argume
8210: 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61 20  nts.  This is a 
8220: 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 65  high-speed.** ve
8230: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
8240: 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e 0a  VdbeChangeP4()..
8250: 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70 65  **.** The P4 ope
8260: 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68 61  rand must not ha
8270: 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ve been previous
8280: 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e 64  ly defined.  And
8290: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20 6d   the new.** P4 m
82a0: 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49 4e  ust not be P4_IN
82b0: 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74 65  T32.  Use sqlite
82c0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20  3VdbeChangeP4() 
82d0: 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20  in either of.** 
82e0: 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f 0a  those cases..*/.
82f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8300: 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a 70  AppendP4(Vdbe *p
8310: 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e 74  , void *pP4, int
8320: 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70   n){.  VdbeOp *p
8330: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 21  Op;.  assert( n!
8340: 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21 3d  =P4_INT32 && n!=
8350: 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73 73  P4_VTAB );.  ass
8360: 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20 69  ert( n<=0 );.  i
8370: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
8380: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 72  Failed ){.    fr
8390: 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20 70  eeP4(p->db, n, p
83a0: 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  P4);.  }else{.  
83b0: 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d 30    assert( pP4!=0
83c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
83d0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20  p->nOp>0 );.    
83e0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d  pOp = &p->aOp[p-
83f0: 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73 73  >nOp-1];.    ass
8400: 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  ert( pOp->p4type
8410: 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b 0a  ==P4_NOTUSED );.
8420: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
8430: 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  = n;.    pOp->p4
8440: 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d 0a  .p = pP4;.  }.}.
8450: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50  ./*.** Set the P
8460: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
8470: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63  cently added opc
8480: 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e  ode to the KeyIn
8490: 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  fo for the.** in
84a0: 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  dex given..*/.vo
84b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
84c0: 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65  tP4KeyInfo(Parse
84d0: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
84e0: 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a  *pIdx){.  Vdbe *
84f0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8500: 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  e;.  KeyInfo *pK
8510: 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74  eyInfo;.  assert
8520: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
8530: 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
8540: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
8550: 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
8560: 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  x(pParse, pIdx);
8570: 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20  .  if( pKeyInfo 
8580: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70  ) sqlite3VdbeApp
8590: 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66  endP4(v, pKeyInf
85a0: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
85b0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
85c0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
85d0: 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43  COMMENTS./*.** C
85e0: 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e  hange the commen
85f0: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
8600: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
8610: 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a  truction.  Or.**
8620: 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20   insert a No-op 
8630: 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d  and add the comm
8640: 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20  ent to that new 
8650: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
8660: 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  is.** makes the 
8670: 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72  code easier to r
8680: 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67  ead during debug
8690: 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  ging.  None of t
86a0: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69  his happens.** i
86b0: 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62  n a production b
86c0: 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
86d0: 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e  void vdbeVCommen
86e0: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
86f0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
8700: 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61  va_list ap){.  a
8710: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
8720: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
8730: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
8740: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
8750: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
8760: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
8770: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
8780: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
8790: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
87a0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
87b0: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  bFree(p->db, p->
87c0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
87d0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e  omment);.    p->
87e0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
87f0: 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  omment = sqlite3
8800: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
8810: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
8820: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
8830: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
8840: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
8850: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
8860: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
8870: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f  if( p ){.    va_
8880: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
8890: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
88a0: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
88b0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
88c0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  (ap);.  }.}.void
88d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70   sqlite3VdbeNoop
88e0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
88f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
8900: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
8910: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
8920: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
8930: 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50  VdbeAddOp0(p, OP
8940: 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73  _Noop);.    va_s
8950: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
8960: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
8970: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
8980: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
8990: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ap);.  }.}.#endi
89a0: 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  f  /* NDEBUG */.
89b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
89c0: 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a  DBE_COVERAGE./*.
89d0: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
89e0: 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65   if the iSrcLine
89f0: 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70   field for the p
8a00: 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20  reviously coded 
8a10: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
8a20: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8a30: 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64  SetLineNumber(Vd
8a40: 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65  be *v, int iLine
8a50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
8a60: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72  GetOp(v,-1)->iSr
8a70: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d  cLine = iLine;.}
8a80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8a90: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20  E_VDBE_COVERAGE 
8aa0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
8ab0: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
8ac0: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
8ad0: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73    If the address
8ae0: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20   is -1, then.** 
8af0: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  return the most 
8b00: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
8b10: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  d opcode..**.** 
8b20: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
8b30: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
8b40: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
8b50: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f  to the calling o
8b60: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
8b70: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  e, then a pointe
8b80: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62  r to a dummy Vdb
8b90: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75  eOp will be retu
8ba0: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f  rned.  That opco
8bb0: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c  de.** is readabl
8bc0: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62  e but not writab
8bd0: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73  le, though it is
8be0: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61   cast to a writa
8bf0: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  ble value..** Th
8c00: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75  e return of a du
8c10: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77  mmy opcode allow
8c20: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  s the call to co
8c30: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69  ntinue functioni
8c40: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f  ng.** after an O
8c50: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
8c60: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
8c70: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
8c80: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
8c90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
8ca0: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
8cb0: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
8cc0: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
8cd0: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
8ce0: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
8cf0: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
8d00: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
8d10: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
8d20: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
8d30: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a  th Valgrind..*/.
8d40: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
8d50: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
8d60: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f  , int addr){.  /
8d70: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20  * C89 specifies 
8d80: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
8d90: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62  t "dummy" will b
8da0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
8db0: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c   all.  ** zeros,
8dc0: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63   which is correc
8dd0: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74  t.  MSVC generat
8de0: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65  es a warning, ne
8df0: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20  vertheless. */. 
8e00: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
8e10: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  ummy;  /* Ignore
8e20: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e   the MSVC warnin
8e30: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69  g about no initi
8e40: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65  alizer */.  asse
8e50: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
8e60: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
8e70: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
8e80: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
8e90: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73  Op - 1;.  }.  as
8ea0: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26  sert( (addr>=0 &
8eb0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c  & addr<p->nOp) |
8ec0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
8ed0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
8ee0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
8ef0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
8f00: 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79   (VdbeOp*)&dummy
8f10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
8f20: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64  eturn &p->aOp[ad
8f30: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  dr];.  }.}..#if 
8f40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8f50: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
8f60: 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65  MMENTS)./*.** Re
8f70: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
8f80: 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66  value for one of
8f90: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
8fa0: 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f  to the opcode pO
8fb0: 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  p.** determined 
8fc0: 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a  by character c..
8fd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  */.static int tr
8fe0: 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c  anslateP(char c,
8ff0: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b   const Op *pOp){
9000: 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20  .  if( c=='1' ) 
9010: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a  return pOp->p1;.
9020: 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72    if( c=='2' ) r
9030: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20  eturn pOp->p2;. 
9040: 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65   if( c=='3' ) re
9050: 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  turn pOp->p3;.  
9060: 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74  if( c=='4' ) ret
9070: 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  urn pOp->p4.i;. 
9080: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b   return pOp->p5;
9090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
90a0: 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74  e a string for t
90b0: 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65  he "comment" fie
90c0: 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63  ld of a VDBE opc
90d0: 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a  ode listing..**.
90e0: 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a  ** The Synopsis:
90f0: 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e   field in commen
9100: 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63  ts in the vdbe.c
9110: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74   source file get
9120: 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  s converted.** t
9130: 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e  o an extra strin
9140: 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64  g that is append
9150: 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
9160: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20  3OpcodeName().  
9170: 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63  In the.** absenc
9180: 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65  e of other comme
9190: 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73  nts, this synops
91a0: 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  is becomes the c
91b0: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70  omment on the op
91c0: 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72  code..** Some tr
91d0: 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73  anslation occurs
91e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50  :.**.**       "P
91f0: 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58  X"      ->  "r[X
9200: 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40  ]".**       "PX@
9210: 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY"   ->  "r[X..
9220: 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78  X+Y-1]"  or "r[x
9230: 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20  ]" if y is 0 or 
9240: 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  1.**       "PX@P
9250: 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y+1" ->  "r[X..X
9260: 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d  +Y]"    or "r[x]
9270: 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20  " if y is 0.**  
9280: 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d       "PY..PY"  -
9290: 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20  >  "r[X..Y]"    
92a0: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
92b0: 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  <=x.*/.static in
92c0: 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74  t displayComment
92d0: 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f  (.  const Op *pO
92e0: 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  p,     /* The op
92f0: 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65  code to be comme
9300: 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  nted */.  const 
9310: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20  char *zP4,   /* 
9320: 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69  Previously obtai
9330: 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34  ned value for P4
9340: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d   */.  char *zTem
9350: 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  p,       /* Writ
9360: 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  e result here */
9370: 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20  .  int nTemp    
9380: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
9390: 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d  vailable in zTem
93a0: 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  p[] */.){.  cons
93b0: 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b  t char *zOpName;
93c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
93d0: 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20  Synopsis;.  int 
93e0: 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69  nOpName;.  int i
93f0: 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a 41  i, jj;.  char zA
9400: 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d  lt[50];.  zOpNam
9410: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  e = sqlite3Opcod
9420: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
9430: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20  e);.  nOpName = 
9440: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9450: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zOpName);.  if( 
9460: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b  zOpName[nOpName+
9470: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  1] ){.    int se
9480: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63  enCom = 0;.    c
9490: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f  har c;.    zSyno
94a0: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b  psis = zOpName +
94b0: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20  = nOpName + 1;. 
94c0: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
94d0: 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c 33  Synopsis,"IF ",3
94e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
94f0: 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49  ( pOp->p5 & SQLI
9500: 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20  TE_STOREP2 ){.  
9510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
9520: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41  printf(sizeof(zA
9530: 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50 32  lt), zAlt, "r[P2
9540: 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e 6f  ] = (%s)", zSyno
9550: 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d  psis+3);.      }
9560: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
9570: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
9580: 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c  izeof(zAlt), zAl
9590: 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20 50  t, "if %s goto P
95a0: 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29  2", zSynopsis+3)
95b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
95c0: 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c 74  zSynopsis = zAlt
95d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
95e0: 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d  ii=jj=0; jj<nTem
95f0: 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e  p-1 && (c = zSyn
9600: 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69  opsis[ii])!=0; i
9610: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
9620: 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20  c=='P' ){.      
9630: 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b    c = zSynopsis[
9640: 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  ++ii];.        i
9650: 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20  f( c=='4' ){.   
9660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
9670: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
9680: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22  , zTemp+jj, "%s"
9690: 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20  , zP4);.        
96a0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27  }else if( c=='X'
96b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
96c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
96d0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
96e0: 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  j, "%s", pOp->zC
96f0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  omment);.       
9700: 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a     seenCom = 1;.
9710: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9720: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20           int v1 
9730: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20  = translateP(c, 
9740: 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pOp);.          
9750: 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20  int v2;.        
9760: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9770: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
9780: 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29  mp+jj, "%d", v1)
9790: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
97a0: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
97b0: 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29  s+ii+1, "@P", 2)
97c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
97d0: 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20     ii += 3;.    
97e0: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
97f0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
9800: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20  emp+jj);.       
9810: 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c       v2 = transl
9820: 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69  ateP(zSynopsis[i
9830: 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20  i], pOp);.      
9840: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
9850: 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31  p(zSynopsis+ii+1
9860: 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20  ,"+1",2)==0 ){. 
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20               ii 
9880: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20  += 2;.          
9890: 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20      v2++;.      
98a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
98b0: 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a      if( v2>1 ){.
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
98d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
98e0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
98f0: 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32  j, "..%d", v1+v2
9900: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1);.           
9910: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
9920: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
9930: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
9940: 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20  ..P3", 4)==0 && 
9950: 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20  pOp->p3==0 ){.  
9960: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
9970: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  4;.          }. 
9980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9990: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
99a0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
99b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
99c0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b         zTemp[jj+
99d0: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a  +] = c;.      }.
99e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73      }.    if( !s
99f0: 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65  eenCom && jj<nTe
9a00: 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f  mp-5 && pOp->zCo
9a10: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  mment ){.      s
9a20: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9a30: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
9a40: 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d  jj, "; %s", pOp-
9a50: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
9a60: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
9a70: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
9a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9a90: 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d   jj<nTemp ) zTem
9aa0: 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c  p[jj] = 0;.  }el
9ab0: 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d  se if( pOp->zCom
9ac0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ment ){.    sqli
9ad0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9ae0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c  mp, zTemp, "%s",
9af0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
9b00: 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65  .    jj = sqlite
9b10: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29  3Strlen30(zTemp)
9b20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
9b30: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
9b40: 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   jj = 0;.  }.  r
9b50: 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64  eturn jj;.}.#end
9b60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
9b70: 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f  UG */..#if VDBE_
9b80: 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65  DISPLAY_P4 && de
9b90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9ba0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
9bb0: 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  )./*.** Translat
9bc0: 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20 76  e the P4.pExpr v
9bd0: 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43  alue for an OP_C
9be0: 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65  ursorHint opcode
9bf0: 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68   into text.** th
9c00: 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61  at can be displa
9c10: 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f  yed in the P4 co
9c20: 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20  lumn of EXPLAIN 
9c30: 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  output..*/.stati
9c40: 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50 34  c void displayP4
9c50: 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a 70  Expr(StrAccum *p
9c60: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
9c70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
9c80: 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28  p = 0;.  switch(
9c90: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
9ca0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
9cb0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
9cc0: 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22  str_appendf(p, "
9cd0: 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %Q", pExpr->u.zT
9ce0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
9cf0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9d00: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73  INTEGER:.      s
9d10: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
9d20: 64 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78 70  df(p, "%d", pExp
9d30: 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20  r->u.iValue);.  
9d40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9d50: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20  ase TK_NULL:.   
9d60: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
9d70: 70 70 65 6e 64 66 28 70 2c 20 22 4e 55 4c 4c 22  ppendf(p, "NULL"
9d80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9d90: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49      case TK_REGI
9da0: 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  STER: {.      sq
9db0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
9dc0: 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45  f(p, "r[%d]", pE
9dd0: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
9de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9df0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
9e00: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
9e10: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
9e20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
9e30: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
9e40: 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20  (p, "rowid");.  
9e50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9e60: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
9e70: 70 70 65 6e 64 66 28 70 2c 20 22 63 25 64 22 2c  ppendf(p, "c%d",
9e80: 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f   (int)pExpr->iCo
9e90: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lumn);.      }. 
9ea0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9eb0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
9ec0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54  :      zOp = "LT
9ed0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9ee0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
9ef0: 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20      zOp = "LE"; 
9f00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9f10: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
9f20: 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20   zOp = "GT";    
9f30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9f40: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f  e TK_GE:      zO
9f50: 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62  p = "GE";      b
9f60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9f70: 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_NE:      zOp =
9f80: 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61   "NE";      brea
9f90: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
9fa0: 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45  Q:      zOp = "E
9fb0: 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  Q";      break;.
9fc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20      case TK_IS: 
9fd0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b       zOp = "IS";
9fe0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9ff0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
a000: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b    zOp = "ISNOT";
a010: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a020: 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a  se TK_AND:     z
a030: 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20  Op = "AND";     
a040: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a050: 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20  TK_OR:      zOp 
a060: 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65  = "OR";      bre
a070: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
a080: 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22  PLUS:    zOp = "
a090: 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ADD";     break;
a0a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
a0b0: 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c  R:    zOp = "MUL
a0c0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
a0d0: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
a0e0: 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20     zOp = "SUB"; 
a0f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
a100: 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20  ase TK_REM:     
a110: 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20  zOp = "REM";    
a120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
a130: 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70   TK_BITAND:  zOp
a140: 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72   = "BITAND";  br
a150: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
a160: 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20  _BITOR:   zOp = 
a170: 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b  "BITOR";   break
a180: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  ;.    case TK_SL
a190: 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49  ASH:   zOp = "DI
a1a0: 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  V";     break;. 
a1b0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
a1c0: 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46  T:  zOp = "LSHIF
a1d0: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
a1e0: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
a1f0: 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b   zOp = "RSHIFT";
a200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
a210: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f  e TK_CONCAT:  zO
a220: 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62  p = "CONCAT";  b
a230: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
a240: 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d  K_UMINUS:  zOp =
a250: 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61   "MINUS";   brea
a260: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
a270: 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50  PLUS:   zOp = "P
a280: 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  LUS";    break;.
a290: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
a2a0: 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e  OT:  zOp = "BITN
a2b0: 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  OT";  break;.   
a2c0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
a2d0: 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20    zOp = "NOT";  
a2e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
a2f0: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a  se TK_ISNULL:  z
a300: 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20  Op = "ISNULL";  
a310: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
a320: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20  TK_NOTNULL: zOp 
a330: 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65  = "NOTNULL"; bre
a340: 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
a350: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
a360: 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22  str_appendf(p, "
a370: 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20  %s", "expr");.  
a380: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
a390: 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20    if( zOp ){.   
a3a0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70   sqlite3_str_app
a3b0: 65 6e 64 66 28 70 2c 20 22 25 73 28 22 2c 20 7a  endf(p, "%s(", z
a3c0: 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79  Op);.    display
a3d0: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d  P4Expr(p, pExpr-
a3e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28  >pLeft);.    if(
a3f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
a400: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
a410: 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22 2c  str_append(p, ",
a420: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69 73  ", 1);.      dis
a430: 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45  playP4Expr(p, pE
a440: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
a450: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
a460: 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22 29  str_append(p, ")
a470: 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", 1);.  }.}.#en
a480: 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50  dif /* VDBE_DISP
a490: 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65  LAY_P4 && define
a4a0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
a4b0: 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f  CURSOR_HINTS) */
a4c0: 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50  ...#if VDBE_DISP
a4d0: 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d  LAY_P4./*.** Com
a4e0: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68  pute a string th
a4f0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
a500: 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f   P4 parameter fo
a510: 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  r an opcode..** 
a520: 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e  Use zTemp for an
a530: 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f  y required tempo
a540: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63  rary buffer spac
a550: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
a560: 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20  r *displayP4(Op 
a570: 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  *pOp, char *zTem
a580: 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20  p, int nTemp){. 
a590: 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65   char *zP4 = zTe
a5a0: 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78  mp;.  StrAccum x
a5b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
a5c0: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74  p>=20 );.  sqlit
a5d0: 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26  e3StrAccumInit(&
a5e0: 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65  x, 0, zTemp, nTe
a5f0: 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68  mp, 0);.  switch
a600: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
a610: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
a620: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
a630: 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  t j;.      KeyIn
a640: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
a650: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
a660: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a670: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
a680: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
a690: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
a6a0: 6e 64 66 28 26 78 2c 20 22 6b 28 25 64 22 2c 20  ndf(&x, "k(%d", 
a6b0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69  pKeyInfo->nKeyFi
a6c0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  eld);.      for(
a6d0: 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d  j=0; j<pKeyInfo-
a6e0: 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b 29  >nKeyField; j++)
a6f0: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
a700: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
a710: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
a720: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
a730: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  r *zColl = pColl
a740: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
a750: 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66  : "";.        if
a760: 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20  ( strcmp(zColl, 
a770: 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a  "BINARY")==0 ) z
a780: 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20  Coll = "B";.    
a790: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
a7a0: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 73  appendf(&x, ",%s
a7b0: 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %s", .          
a7c0: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
a7d0: 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20 22  SortOrder[j] ? "
a7e0: 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b  -" : "", zColl);
a7f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a800: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
a810: 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20  d(&x, ")", 1);. 
a820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a830: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
a840: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
a850: 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f  NTS.    case P4_
a860: 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64 69  EXPR: {.      di
a870: 73 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c 20  splayP4Expr(&x, 
a880: 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a  pOp->p4.pExpr);.
a890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a8a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
a8b0: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
a8c0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
a8d0: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
a8e0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
a8f0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
a900: 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c 20  (&x, "(%.20s)", 
a910: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
a920: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a930: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  }.    case P4_FU
a940: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
a950: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
a960: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
a970: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
a980: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73 28  appendf(&x, "%s(
a990: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
a9a0: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
a9b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a9c0: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53   }.#if defined(S
a9d0: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
a9e0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
a9f0: 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20 50  FILE).    case P
aa00: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
aa10: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
aa20: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d   = pOp->p4.pCtx-
aa30: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  >pFunc;.      sq
aa40: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64  lite3_str_append
aa50: 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20  f(&x, "%s(%d)", 
aa60: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65  pDef->zName, pDe
aa70: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  f->nArg);.      
aa80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
aa90: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
aaa0: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73  INT64: {.      s
aab0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e  qlite3_str_appen
aac0: 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 2a  df(&x, "%lld", *
aad0: 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20  pOp->p4.pI64);. 
aae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aaf0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
ab00: 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T32: {.      sql
ab10: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66  ite3_str_appendf
ab20: 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  (&x, "%d", pOp->
ab30: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
ab40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ab50: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
ab60: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
ab70: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e 31  appendf(&x, "%.1
ab80: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
ab90: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
aba0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
abb0: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
abc0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
abd0: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
abe0: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
abf0: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
ac00: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
ac10: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
ac20: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
ac30: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
ac40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
ac50: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22  tr_appendf(&x, "
ac60: 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69  %lld", pMem->u.i
ac70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
ac80: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
ac90: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
aca0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
acb0: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e  _appendf(&x, "%.
acc0: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29  16g", pMem->u.r)
acd0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ace0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
acf0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
ad00: 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22      zP4 = "NULL"
ad10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ad20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ad30: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
ad40: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
ad50: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
ad60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
ad70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
ad80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ad90: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
ada0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
adb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
adc0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
add0: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
ade0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
adf0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c  _str_appendf(&x,
ae00: 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61   "vtab:%p", pVta
ae10: 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  b);.      break;
ae20: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
ae30: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
ae40: 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  AY: {.      int 
ae50: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69  i;.      int *ai
ae60: 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20   = pOp->p4.ai;. 
ae70: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b       int n = ai[
ae80: 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  0];   /* The fir
ae90: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e  st element of an
aea0: 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c 77   INTARRAY is alw
aeb0: 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  ays the.        
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
aed0: 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * count of the n
aee0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
aef0: 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20  s to follow */. 
af00: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
af10: 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =n; i++){.      
af20: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
af30: 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22 2c  pendf(&x, ",%d",
af40: 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d   ai[i]);.      }
af50: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  .      zTemp[0] 
af60: 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c  = '[';.      sql
af70: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28  ite3_str_append(
af80: 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20  &x, "]", 1);.   
af90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
afa0: 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50      case P4_SUBP
afb0: 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20  ROGRAM: {.      
afc0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65  sqlite3_str_appe
afd0: 6e 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61 6d  ndf(&x, "program
afe0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
aff0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b000: 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20  P4_DYNBLOB:.    
b010: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a  case P4_ADVANCE:
b020: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   {.      zTemp[0
b030: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
b040: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b050: 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20  se P4_TABLE: {. 
b060: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72       sqlite3_str
b070: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73  _appendf(&x, "%s
b080: 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d  ", pOp->p4.pTab-
b090: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
b0a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b0b0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
b0c0: 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a   zP4 = pOp->p4.z
b0d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d  ;.      if( zP4=
b0e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  =0 ){.        zP
b0f0: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  4 = zTemp;.     
b100: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
b110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b120: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41   }.  sqlite3StrA
b130: 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a  ccumFinish(&x);.
b140: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
b150: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
b160: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44  ;.}.#endif /* VD
b170: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f  BE_DISPLAY_P4 */
b180: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
b190: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74  to the Vdbe that
b1a0: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63   the BTree objec
b1b0: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20  t at db->aDb[i] 
b1c0: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
b1d0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
b1e0: 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b  ements need to k
b1f0: 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74  now in advance t
b200: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20  he complete set 
b210: 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  of.** attached d
b220: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
b230: 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61  ll be use.  A ma
b240: 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61  sk of these data
b250: 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e  bases.** is main
b260: 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72  tained in p->btr
b270: 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e  eeMask.  The p->
b280: 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69  lockMask value i
b290: 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a  s the subset of.
b2a0: 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ** p->btreeMask 
b2b0: 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61  of databases tha
b2c0: 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  t will require a
b2d0: 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   lock..*/.void s
b2e0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
b2f0: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
b300: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   i){.  assert( i
b310: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e  >=0 && i<p->db->
b320: 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69  nDb && i<(int)si
b330: 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20  zeof(yDbMask)*8 
b340: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28  );.  assert( i<(
b350: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74  int)sizeof(p->bt
b360: 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  reeMask)*8 );.  
b370: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72  DbMaskSet(p->btr
b380: 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66  eeMask, i);.  if
b390: 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65  ( i!=1 && sqlite
b3a0: 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70  3BtreeSharable(p
b3b0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ->db->aDb[i].pBt
b3c0: 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53  ) ){.    DbMaskS
b3d0: 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20  et(p->lockMask, 
b3e0: 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21  i);.  }.}..#if !
b3f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b400: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
b410: 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  )./*.** If SQLit
b420: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
b430: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
b440: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
b450: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
b460: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
b470: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
b480: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
b490: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
b4a0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
b4b0: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
b4c0: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
b4d0: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
b4e0: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
b4f0: 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20  it also.** sets 
b500: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
b510: 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f  member of each o
b520: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  f the BtShared s
b530: 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72  tructures, ensur
b540: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ing.** that the 
b550: 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e  correct busy-han
b560: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  dler callback is
b570: 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75   invoked if requ
b580: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ired..**.** If S
b590: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
b5a0: 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73  eadsafe but does
b5b0: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
b5c0: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
b5d0: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
b5e0: 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b  Enter() is invok
b5f0: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
b600: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
b610: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
b620: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
b630: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
b640: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
b650: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
b660: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
b670: 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  VM..**.** If SQL
b680: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
b690: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
b6a0: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
b6b0: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
b6c0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
b6d0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
b6e0: 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73   The p->btreeMas
b6f0: 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74  k field is a bit
b700: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65  mask of all btre
b710: 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70  es that the prep
b720: 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65  ared .** stateme
b730: 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75  nt p will ever u
b740: 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68  se.  Let N be th
b750: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
b760: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
b770: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
b780: 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74  g to btrees that
b790: 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
b7a0: 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e  e.  Then the run
b7b0: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  time of.** this 
b7c0: 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20  routine is N*N. 
b7d0: 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72   But as N is rar
b7e0: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c  ely more than 1,
b7f0: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
b800: 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  .** be a problem
b810: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b820: 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20  3VdbeEnter(Vdbe 
b830: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
b840: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
b850: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
b860: 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  b;.  if( DbMaskA
b870: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
b880: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
b890: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
b8a0: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
b8b0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
b8c0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
b8d0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
b8e0: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
b8f0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
b900: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
b910: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
b920: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
b930: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b940: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69  BtreeEnter(aDb[i
b950: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
b960: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
b970: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b980: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
b990: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
b9a0: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
b9b0: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68  Unlock all of th
b9c0: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75  e btrees previou
b9d0: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20  sly locked by a 
b9e0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
b9f0: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73  dbeEnter()..*/.s
ba00: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
ba10: 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c  NLINE void vdbeL
ba20: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
ba30: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
ba40: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
ba50: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64  ;.  int nDb;.  d
ba60: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62  b = p->db;.  aDb
ba70: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44   = db->aDb;.  nD
ba80: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66  b = db->nDb;.  f
ba90: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69  or(i=0; i<nDb; i
baa0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d  ++){.    if( i!=
bab0: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28  1 && DbMaskTest(
bac0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26  p->lockMask,i) &
bad0: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
bae0: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
baf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
bb00: 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  ve(aDb[i].pBt);.
bb10: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64      }.  }.}.void
bb20: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
bb30: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
bb40: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
bb50: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
bb60: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
bb70: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
bb80: 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a  vdbeLeave(p);.}.
bb90: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
bba0: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
bbb0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
bbc0: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
bbd0: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
bbe0: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
bbf0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
bc00: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
bc10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
bc20: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c  3VdbePrintOp(FIL
bc30: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c  E *pOut, int pc,
bc40: 20 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a 20   VdbeOp *pOp){. 
bc50: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
bc60: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63  ar zPtr[50];.  c
bc70: 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20  har zCom[100];. 
bc80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
bc90: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
bca0: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
bcb0: 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58  d %4d %-13s %.2X
bcc0: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f   %s\n";.  if( pO
bcd0: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73  ut==0 ) pOut = s
bce0: 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64  tdout;.  zP4 = d
bcf0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50  isplayP4(pOp, zP
bd00: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29  tr, sizeof(zPtr)
bd10: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
bd20: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
bd30: 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c  COMMENTS.  displ
bd40: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
bd50: 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66  P4, zCom, sizeof
bd60: 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20  (zCom));.#else. 
bd70: 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65   zCom[0] = 0;.#e
bd80: 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54  ndif.  /* NB:  T
bd90: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
bda0: 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Name() function 
bdb0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
bdc0: 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20  y code created. 
bdd0: 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63   ** by the mkopc
bde0: 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f  odeh.awk and mko
bdf0: 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70  pcodec.awk scrip
be00: 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74  ts which extract
be10: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d   the.  ** inform
be20: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76  ation from the v
be30: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78  dbe.c source tex
be40: 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70  t */.  fprintf(p
be50: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70  Out, zFormat1, p
be60: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c, .      sqlite
be70: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
be80: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70  >opcode), pOp->p
be90: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d  1, pOp->p2, pOp-
bea0: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70  >p3, zP4, pOp->p
beb0: 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20  5,.      zCom.  
bec0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
bed0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
bee0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
bef0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
bf00: 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  element..*/.stat
bf10: 69 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d 41  ic void initMemA
bf20: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
bf30: 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c   N, sqlite3 *db,
bf40: 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20 77   u16 flags){.  w
bf50: 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29 7b  hile( (N--)>0 ){
bf60: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
bf70: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
bf80: 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73 7a  flags;.    p->sz
bf90: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66 64  Malloc = 0;.#ifd
bfa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
bfb0: 20 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72 6f      p->pScopyFro
bfc0: 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  m = 0;.#endif.  
bfd0: 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a    p++;.  }.}../*
bfe0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
bff0: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
c000: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
c010: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
c020: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
c030: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
c040: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   N ){.    Mem *p
c050: 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20  End = &p[N];.   
c060: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
c070: 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62  ->db;.    if( db
c080: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29  ->pnBytesFreed )
c090: 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  {.      do{.    
c0a0: 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c      if( p->szMal
c0b0: 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46  loc ) sqlite3DbF
c0c0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
c0d0: 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  oc);.      }whil
c0e0: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b  e( (++p)<pEnd );
c0f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
c100: 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
c110: 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31     assert( (&p[1
c120: 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d  ])==pEnd || p[0]
c130: 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a  .db==p[1].db );.
c140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
c150: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65  lite3VdbeCheckMe
c160: 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29  mInvariants(p) )
c170: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ;..      /* This
c180: 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79   block is really
c190: 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73   an inlined vers
c1a0: 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
c1b0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20  beMemRelease(). 
c1c0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b       ** that tak
c1d0: 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  es advantage of 
c1e0: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
c1f0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61  e memory cell va
c200: 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  lue is .      **
c210: 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55   being set to NU
c220: 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69  LL after releasi
c230: 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72  ng any dynamic r
c240: 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20  esources..      
c250: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  **.      ** The 
c260: 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f  justification fo
c270: 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f  r duplicating co
c280: 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72  de is that accor
c290: 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a  ding to .      *
c2a0: 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69  * callgrind, thi
c2b0: 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61  s causes a certa
c2c0: 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20  in test case to 
c2d0: 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20  hit the CPU 4.7 
c2e0: 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e  .      ** percen
c2f0: 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75  t less (x86 linu
c300: 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34  x, gcc version 4
c310: 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20  .1.2, -O6) than 
c320: 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  if .      ** sql
c330: 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29  ite3MemRelease()
c340: 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f   were called fro
c350: 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32  m here. With -O2
c360: 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20  , this jumps.   
c370: 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72     ** to 6.6 per
c380: 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63  cent. The test c
c390: 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67  ase is inserting
c3a0: 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20   1000 rows into 
c3b0: 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a  a table .      *
c3c0: 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65  * with no indexe
c3d0: 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  s using a single
c3e0: 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54   prepared INSERT
c3f0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64   statement, bind
c400: 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  () .      ** and
c410: 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74   reset(). Insert
c420: 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e  s are grouped in
c430: 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  to a transaction
c440: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
c450: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
c460: 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b  ags & MEM_Agg );
c470: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
c480: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
c490: 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Dyn );.      tes
c4a0: 74 63 61 73 65 28 20 70 2d 3e 78 44 65 6c 3d 3d  tcase( p->xDel==
c4b0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
c4c0: 4d 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 20 20  MemDel );.      
c4d0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
c4e0: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20 29  M_Agg|MEM_Dyn) )
c4f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c500: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
c510: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  p);.      }else 
c520: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
c530: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c540: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70  e3DbFreeNN(db, p
c550: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
c560: 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20      p->szMalloc 
c570: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
c580: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d      p->flags = M
c590: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20  EM_Undefined;.  
c5a0: 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c    }while( (++p)<
c5b0: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  pEnd );.  }.}..#
c5c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
c5d0: 55 47 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20  UG./*.** Verify 
c5e0: 74 68 61 74 20 70 46 72 61 6d 65 20 69 73 20 61  that pFrame is a
c5f0: 20 76 61 6c 69 64 20 56 64 62 65 46 72 61 6d 65   valid VdbeFrame
c600: 20 70 6f 69 6e 74 65 72 2e 20 20 52 65 74 75 72   pointer.  Retur
c610: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 0a  n true if it is.
c620: 2a 2a 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  ** and false if 
c630: 73 6f 6d 65 74 68 69 6e 67 20 69 73 20 77 72 6f  something is wro
c640: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ng..**.** This r
c650: 6f 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e 64  outine is intend
c660: 65 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69 64  ed for use insid
c670: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
c680: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 0a 2a  atements only..*
c690: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
c6a0: 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28 56 64  eFrameIsValid(Vd
c6b0: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  beFrame *pFrame)
c6c0: 7b 0a 20 20 69 66 28 20 70 46 72 61 6d 65 2d 3e  {.  if( pFrame->
c6d0: 69 46 72 61 6d 65 4d 61 67 69 63 21 3d 53 51 4c  iFrameMagic!=SQL
c6e0: 49 54 45 5f 46 52 41 4d 45 5f 4d 41 47 49 43 20  ITE_FRAME_MAGIC 
c6f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
c700: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
c710: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
c720: 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 6f 6e   a destructor on
c730: 20 61 20 4d 65 6d 20 6f 62 6a 65 63 74 20 28 77   a Mem object (w
c740: 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61  hich is really a
c750: 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 29  n sqlite3_value)
c760: 0a 2a 2a 20 74 68 61 74 20 64 65 6c 65 74 65 73  .** that deletes
c770: 20 74 68 65 20 46 72 61 6d 65 20 6f 62 6a 65 63   the Frame objec
c780: 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68  t that is attach
c790: 65 64 20 74 6f 20 69 74 20 61 73 20 61 20 62 6c  ed to it as a bl
c7a0: 6f 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ob..**.** This r
c7b0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
c7c0: 64 65 6c 65 74 65 20 74 68 65 20 46 72 61 6d 65  delete the Frame
c7d0: 20 72 69 67 68 74 20 61 77 61 79 2e 20 20 49 74   right away.  It
c7e0: 20 6d 65 72 65 6c 79 20 61 64 64 73 20 74 68 65   merely adds the
c7f0: 0a 2a 2a 20 66 72 61 6d 65 20 74 6f 20 61 20 6c  .** frame to a l
c800: 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f  ist of frames to
c810: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
c820: 20 74 68 65 20 56 64 62 65 20 68 61 6c 74 73 2e   the Vdbe halts.
c830: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c840: 56 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c 28  VdbeFrameMemDel(
c850: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 56  void *pArg){.  V
c860: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
c870: 20 3d 20 28 56 64 62 65 46 72 61 6d 65 2a 29 70   = (VdbeFrame*)p
c880: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Arg;.  assert( s
c890: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49  qlite3VdbeFrameI
c8a0: 73 56 61 6c 69 64 28 70 46 72 61 6d 65 29 20 29  sValid(pFrame) )
c8b0: 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  ;.  pFrame->pPar
c8c0: 65 6e 74 20 3d 20 70 46 72 61 6d 65 2d 3e 76 2d  ent = pFrame->v-
c8d0: 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 70 46  >pDelFrame;.  pF
c8e0: 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72 61  rame->v->pDelFra
c8f0: 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 7d 0a 0a  me = pFrame;.}..
c900: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
c910: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
c920: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
c930: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
c940: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
c950: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
c960: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
c970: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
c980: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
c990: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
c9a0: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
c9b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
c9c0: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
c9d0: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
c9e0: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
c9f0: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
ca00: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
ca10: 4d 65 6d 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  Mem];.  assert( 
ca20: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
ca30: 49 73 56 61 6c 69 64 28 70 29 20 29 3b 0a 20 20  IsValid(p) );.  
ca40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
ca50: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
ca60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
ca70: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
ca80: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
ca90: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
caa0: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
cab0: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  em);.  sqlite3Vd
cac0: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
cad0: 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41  p->v->db, &p->pA
cae0: 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a  uxData, -1, 0);.
caf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
cb00: 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a  p->v->db, p);.}.
cb10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cb20: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
cb30: 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e  ** Give a listin
cb40: 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  g of the program
cb50: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
cb60: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  machine..**.** T
cb70: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
cb80: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
cb90: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
cba0: 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  But instead of.*
cbb0: 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f  * running the co
cbc0: 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74  de, it invokes t
cbd0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65  he callback once
cbe0: 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75   for each instru
cbf0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66  ction..** This f
cc00: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74  eature is used t
cc10: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50  o implement "EXP
cc20: 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LAIN"..**.** Whe
cc30: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
cc40: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
cc50: 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68  n is listed.  Wh
cc60: 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e  en.** p->explain
cc70: 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70  ==2, only OP_Exp
cc80: 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
cc90: 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64  s are listed and
cca0: 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68   these.** are sh
ccb0: 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65  own in a differe
ccc0: 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65  nt format.  p->e
ccd0: 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65  xplain==2 is use
cce0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
ccf0: 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  * EXPLAIN QUERY 
cd00: 50 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38 2d 30 34  PLAN..** 2018-04
cd10: 2d 32 34 3a 20 20 49 6e 20 70 2d 3e 65 78 70 6c  -24:  In p->expl
cd20: 61 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20 74 68 65  ain==2 mode, the
cd30: 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65 73   OP_Init opcodes
cd40: 20 6f 66 20 74 72 69 67 67 65 72 73 0a 2a 2a 20   of triggers.** 
cd50: 61 72 65 20 61 6c 73 6f 20 73 68 6f 77 6e 2c 20  are also shown, 
cd60: 73 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75 6e  so that the boun
cd70: 64 61 72 69 65 73 20 62 65 74 77 65 65 6e 20 74  daries between t
cd80: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
cd90: 61 6e 64 0a 2a 2a 20 65 61 63 68 20 74 72 69 67  and.** each trig
cda0: 67 65 72 20 61 72 65 20 63 6c 65 61 72 2e 0a 2a  ger are clear..*
cdb0: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
cdc0: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
cdd0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
cde0: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
cdf0: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
ce00: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
ce10: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
ce20: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
ce30: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
ce40: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ce60: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
ce70: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
cea0: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
ceb0: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
cec0: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cef0: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
cf00: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
cf10: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
cf20: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
cf30: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
cf40: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
cf50: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
cf80: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
cf90: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
cfa0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
cfb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cfc0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
cfd0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
cfe0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d010: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
d020: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
d050: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
d060: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20   &p->aMem[1];   
d070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d080: 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74  st Mem of result
d090: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62 4c   set */.  int bL
d0a0: 69 73 74 53 75 62 70 72 6f 67 73 20 3d 20 28 70  istSubprogs = (p
d0b0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 7c 7c 20  ->explain==1 || 
d0c0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
d0d0: 49 54 45 5f 54 72 69 67 67 65 72 45 51 50 29 21  ITE_TriggerEQP)!
d0e0: 3d 30 29 3b 0a 20 20 4f 70 20 2a 70 4f 70 20 3d  =0);.  Op *pOp =
d0f0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
d100: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
d110: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
d120: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
d130: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
d140: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
d150: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
d160: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
d170: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
d180: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
d190: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
d1a0: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
d1b0: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
d1c0: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
d1d0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
d1e0: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
d1f0: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
d200: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
d210: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
d220: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
d230: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
d240: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
d250: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
d260: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
d270: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
d280: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
d290: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
d2a0: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
d2b0: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
d2c0: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
d2d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d2e0: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
d2f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d300: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
d310: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
d320: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20  OomFault(db);.  
d330: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d340: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
d350: 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
d360: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
d370: 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68  reaches nRow, th
d380: 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a  at means the.  *
d390: 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69  * listing has fi
d3a0: 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74  nished and sqlit
d3b0: 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64  e3_step() should
d3c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
d3d0: 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69  ONE..  ** nRow i
d3e0: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
d3f0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
d400: 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  in the main prog
d410: 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74  ram, plus.  ** t
d420: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75  he sum of the nu
d430: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
d440: 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70  all trigger subp
d450: 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65  rograms encounte
d460: 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e  red.  ** so far.
d470: 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65    The nRow value
d480: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61   will increase a
d490: 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75  s new trigger su
d4a0: 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20  bprograms are.  
d4b0: 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  ** encountered, 
d4c0: 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65  but p->pc will e
d4d0: 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20  ventually catch 
d4e0: 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f  up to nRow..  */
d4f0: 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70  .  nRow = p->nOp
d500: 3b 0a 20 20 69 66 28 20 62 4c 69 73 74 53 75 62  ;.  if( bListSub
d510: 70 72 6f 67 73 20 29 7b 0a 20 20 20 20 2f 2a 20  progs ){.    /* 
d520: 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f  The first 8 memo
d530: 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65  ry cells are use
d540: 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  d for the result
d550: 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c   set.  So we wil
d560: 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  l.    ** command
d570: 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c  eer the 9th cell
d580: 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61   to use as stora
d590: 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20  ge for an array 
d5a0: 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20  of pointers.    
d5b0: 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75  ** to trigger su
d5c0: 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20  bprograms.  The 
d5d0: 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65  VDBE is guarante
d5e0: 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65  ed to have at le
d5f0: 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c  ast 9.    ** cel
d600: 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ls.  */.    asse
d610: 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b  rt( p->nMem>9 );
d620: 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e  .    pSub = &p->
d630: 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28  aMem[9];.    if(
d640: 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d   pSub->flags&MEM
d650: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f  _Blob ){.      /
d660: 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63  * On the first c
d670: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
d680: 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c  tep(), pSub will
d690: 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49   hold a NULL.  I
d6a0: 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t is.      ** in
d6b0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42  itialized to a B
d6c0: 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55  LOB by the P4_SU
d6d0: 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73  BPROGRAM process
d6e0: 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20  ing logic below 
d6f0: 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20  */.      nSub = 
d700: 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56  pSub->n/sizeof(V
d710: 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53  dbe*);.      apS
d720: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
d730: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
d740: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
d750: 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20  i<nSub; i++){.  
d760: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75      nRow += apSu
d770: 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d  b[i]->nOp;.    }
d780: 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 31 29  .  }..  while(1)
d790: 7b 20 20 2f 2a 20 4c 6f 6f 70 20 65 78 69 74 73  {  /* Loop exits
d7a0: 20 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a 20 20   via break */.  
d7b0: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
d7c0: 20 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29     if( i>=nRow )
d7d0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
d7e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
d7f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
d800: 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E;.      break;.
d810: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
d820: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
d830: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
d840: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
d850: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
d860: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
d870: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
d880: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
d890: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
d8a0: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
d8b0: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
d8c0: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
d8d0: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
d8e0: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
d8f0: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
d900: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
d910: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
d920: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
d930: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
d940: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
d950: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
d960: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
d970: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
d980: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
d990: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
d9a0: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
d9b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 68 65     }..    /* Whe
d9c0: 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20  n an OP_Program 
d9d0: 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e  opcode is encoun
d9e0: 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70  ter (the only op
d9f0: 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20  code that has.  
da00: 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f    ** a P4_SUBPRO
da10: 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20  GRAM argument), 
da20: 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20  expand the size 
da30: 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  of the array of 
da40: 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20  subprograms.    
da50: 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d  ** kept in p->aM
da60: 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20  em[9].z to hold 
da70: 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20  the new program 
da80: 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20  - assuming this 
da90: 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 2a  subprogram.    *
daa0: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  * has not alread
dab0: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20  y been seen..   
dac0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c 69 73   */.    if( bLis
dad0: 74 53 75 62 70 72 6f 67 73 20 26 26 20 70 4f 70  tSubprogs && pOp
dae0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
daf0: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
db00: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53   int nByte = (nS
db10: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
db20: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
db30: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
db40: 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a  r(j=0; j<nSub; j
db50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
db60: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
db70: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
db80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
db90: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 29     if( j==nSub )
dba0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
dbb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
dbc0: 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65  Grow(pSub, nByte
dbd0: 2c 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20 20 20  , nSub!=0);.    
dbe0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53      if( p->rc!=S
dbf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dc00: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
dc10: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
dc20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
dc30: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 53 75    }.        apSu
dc40: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
dc50: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
dc60: 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b      apSub[nSub++
dc70: 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  ] = pOp->p4.pPro
dc80: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 70 53  gram;.        pS
dc90: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
dca0: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 70  _Blob;.        p
dcb0: 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69  Sub->n = nSub*si
dcc0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
dcd0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20  );.        nRow 
dce0: 2b 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  += pOp->p4.pProg
dcf0: 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  ram->nOp;.      
dd00: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
dd10: 70 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29 20 62  p->explain<2 ) b
dd20: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 4f  reak;.    if( pO
dd30: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 78  p->opcode==OP_Ex
dd40: 70 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b 0a 20  plain ) break;. 
dd50: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
dd60: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
dd70: 2d 3e 70 63 3e 31 20 29 20 62 72 65 61 6b 3b 0a  ->pc>1 ) break;.
dd80: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
dd90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dda0: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
ddb0: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20  errupted ){.    
ddc0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
ddd0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
dde0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
ddf0: 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ROR;.      sqlit
de00: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73  e3VdbeError(p, s
de10: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
de20: 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rc));.    }else{
de30: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 34  .      char *zP4
de40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  ;.      if( p->e
de50: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
de60: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
de70: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
de80: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
de90: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75    /* Program cou
dec0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  nter */.        
ded0: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20 20 20  pMem++;.    .   
dee0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
def0: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   = MEM_Static|ME
df00: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
df10: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20          pMem->z 
df20: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
df30: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
df40: 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f  opcode); /* Opco
df50: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  de */.        as
df60: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
df70: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   );.        pMem
df80: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
df90: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
dfa0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
dfb0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
dfc0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  .        pMem++;
dfd0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
dfe0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
dff0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
e000: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
e010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
e030: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
e040: 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ;..      pMem->f
e050: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
e060: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
e070: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20  = pOp->p2;      
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20      /* P2 */.   
e0a0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
e0b0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e0c0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
e0d0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
e0e0: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e100: 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P3 */.      pMem
e110: 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73  ++;..      if( s
e120: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
e130: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
e140: 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20  , 100) ){ /* P4 
e150: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
e160: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
e170: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
e180: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e190: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
e1a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e1b0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
e1c0: 65 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34 20 3d  erm;.      zP4 =
e1d0: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
e1e0: 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73  pMem->z, pMem->s
e1f0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
e200: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
e210: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
e220: 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ->n = 0;.       
e230: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
e240: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c  etStr(pMem, zP4,
e250: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
e260: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
e270: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
e280: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
e290: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
e2a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e2b0: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
e2c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
e2d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
e2e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
e2f0: 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ++;..      if( p
e300: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
e310: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
e320: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
e330: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34  ndResize(pMem, 4
e340: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
e350: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
e360: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
e370: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e380: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
e390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
e3a0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e3b0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
e3c0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d         pMem->n =
e3d0: 20 32 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   2;.        sqli
e3e0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
e3f0: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
e400: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
e410: 50 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d  P5 */.        pM
e420: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
e430: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70  _UTF8;.        p
e440: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69 66 64  Mem++;.    .#ifd
e450: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e460: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
e470: 53 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  S.        if( sq
e480: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
e490: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
e4a0: 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20   500) ){.       
e4b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
e4c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e4d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
e4e0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
e4f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e500: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e510: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
e520: 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  m;.        pMem-
e530: 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d  >n = displayComm
e540: 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d  ent(pOp, zP4, pM
e550: 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20  em->z, 500);.   
e560: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
e570: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
e580: 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  lse.        pMem
e590: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
e5a0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
e5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
e5c0: 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ment */.#endif. 
e5d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
e5e0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20  >nResColumn = 8 
e5f0: 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d  - 4*(p->explain-
e600: 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65  1);.      p->pRe
e610: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d  sultSet = &p->aM
e620: 65 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  em[1];.      p->
e630: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
e640: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e650: 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20 20 7d  E_ROW;.    }.  }
e660: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e670: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e680: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
e690: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e6a0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
e6b0: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77  t the SQL that w
e6c0: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  as used to gener
e6d0: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72  ate a VDBE progr
e6e0: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
e6f0: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
e700: 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73  Vdbe *p){.  cons
e710: 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20  t char *z = 0;. 
e720: 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
e730: 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b      z = p->zSql;
e740: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
e750: 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f  nOp>=1 ){.    co
e760: 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  nst VdbeOp *pOp 
e770: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
e780: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
e790: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
e7a0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
e7b0: 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e      z = pOp->p4.
e7c0: 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  z;.      while( 
e7d0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a  sqlite3Isspace(*
e7e0: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a  z) ) z++;.    }.
e7f0: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72    }.  if( z ) pr
e800: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c  intf("SQL: [%s]\
e810: 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66  n", z);.}.#endif
e820: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
e830: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
e840: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
e850: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
e860: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
e870: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
e880: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
e890: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
e8a0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
e8b0: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
e8c0: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
e8d0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
e8e0: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
e8f0: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74  IoTrace==0 ) ret
e900: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  urn;.  if( nOp<1
e910: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
e920: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
e930: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
e940: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
e950: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
e960: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
e970: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
e980: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
e990: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
e9a0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
e9b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73  ;.    for(i=0; s
e9c0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
e9d0: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
e9e0: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
e9f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
ea00: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
ea10: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
ea20: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
ea30: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
ea40: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
ea50: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
ea60: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
ea70: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
ea80: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
ea90: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
eaa0: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  oTrace("SQL %s\n
eab0: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
eac0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
ead0: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
eae0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
eaf0: 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73  CE */../* An ins
eb00: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
eb10: 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20 62  ject describes b
eb20: 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c  ulk memory avail
eb30: 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20  able for use.** 
eb40: 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73  by subcomponents
eb50: 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 73   of a prepared s
eb60: 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65  tatement.  Space
eb70: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75   is allocated ou
eb80: 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62  t.** of a Reusab
eb90: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62  leSpace object b
eba0: 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65  y the allocSpace
ebb0: 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77  () routine below
ebc0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73  ..*/.struct Reus
ebd0: 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38  ableSpace {.  u8
ebe0: 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
ebf0: 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20     /* Available 
ec00: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
ec10: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
ec20: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61   /* Bytes of ava
ec30: 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f  ilable memory */
ec40: 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20  .  int nNeeded; 
ec50: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
ec60: 20 62 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c   bytes that coul
ec70: 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  d not be allocat
ec80: 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79  ed */.};../* Try
ec90: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79   to allocate nBy
eca0: 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79  te bytes of 8-by
ecb0: 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20  te aligned bulk 
ecc0: 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a  memory for pBuf.
ecd0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73  ** from the Reus
ece0: 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74  ableSpace object
ecf0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
ed00: 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
ed10: 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f  ated.** memory o
ed20: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 69  n success.  If i
ed30: 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f  nsufficient memo
ed40: 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ry is available 
ed50: 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62  in the.** Reusab
ed60: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20  leSpace object, 
ed70: 69 6e 63 72 65 61 73 65 20 74 68 65 20 52 65 75  increase the Reu
ed80: 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64  sableSpace.nNeed
ed90: 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74  ed.** value by t
eda0: 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64  he amount needed
edb0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
edc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20  ..**.** If pBuf 
edd0: 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79  is not initially
ede0: 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e   NULL, that mean
edf0: 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  s that the memor
ee00: 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  y has already.**
ee10: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
ee20: 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  by a prior call 
ee30: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  to this routine,
ee40: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
ee50: 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75  a copy.** of pBu
ee60: 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73  f and leave Reus
ee70: 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e  ableSpace unchan
ee80: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ged..**.** This 
ee90: 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70  allocator is emp
eea0: 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f  loyed to repurpo
eeb0: 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20  se unused slots 
eec0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
eed0: 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61  e.** opcode arra
eee0: 79 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  y of prepared st
eef0: 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65  ate for other me
ef00: 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68  mory needs of th
ef10: 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  e prepared.** st
ef20: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
ef30: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
ef40: 61 63 65 28 0a 20 20 73 74 72 75 63 74 20 52 65  ace(.  struct Re
ef50: 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20  usableSpace *p, 
ef60: 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20   /* Bulk memory 
ef70: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
ef80: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  location */.  vo
ef90: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
efa0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
efb0: 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c  er to a prior al
efc0: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  location */.  in
efd0: 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
efe0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
eff0: 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65   of memory neede
f000: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
f010: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
f020: 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65  GNMENT(p->pSpace
f030: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d  ) );.  if( pBuf=
f040: 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  =0 ){.    nByte 
f050: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
f060: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c  .    if( nByte <
f070: 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  = p->nFree ){.  
f080: 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20      p->nFree -= 
f090: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75  nByte;.      pBu
f0a0: 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70  f = &p->pSpace[p
f0b0: 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65  ->nFree];.    }e
f0c0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e  lse{.      p->nN
f0d0: 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a  eeded += nByte;.
f0e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
f0f0: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
f100: 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29  LIGNMENT(pBuf) )
f110: 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b  ;.  return pBuf;
f120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64  .}../*.** Rewind
f130: 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74   the VDBE back t
f140: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
f150: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
f160: 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74  or.** running it
f170: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f180: 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65  3VdbeRewind(Vdbe
f190: 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65   *p){.#if define
f1a0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
f1b0: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
f1c0: 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69  PROFILE).  int i
f1d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
f1e0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
f1f0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
f200: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c  DBE_MAGIC_INIT |
f210: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
f220: 5f 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a  _MAGIC_RESET );.
f230: 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75  .  /* There shou
f240: 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ld be at least o
f250: 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ne opcode..  */.
f260: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
f270: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  >0 );..  /* Set 
f280: 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42  the magic to VDB
f290: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e  E_MAGIC_RUN soon
f2a0: 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
f2b0: 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61  ater. */.  p->ma
f2c0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
f2d0: 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51  _RUN;..#ifdef SQ
f2e0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72  LITE_DEBUG.  for
f2f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b  (i=0; i<p->nMem;
f300: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
f310: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62  t( p->aMem[i].db
f320: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23  ==p->db );.  }.#
f330: 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20  endif.  p->pc = 
f340: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  -1;.  p->rc = SQ
f350: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72  LITE_OK;.  p->er
f360: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
f370: 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  bort;.  p->nChan
f380: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
f390: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
f3a0: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
f3b0: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69  at = 255;.  p->i
f3c0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
f3d0: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
f3e0: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
f3f0: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72  BE_PROFILE.  for
f400: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
f410: 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  i++){.    p->aOp
f420: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
f430: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
f440: 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  s = 0;.  }.#endi
f450: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  f.}../*.** Prepa
f460: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
f470: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
f480: 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  on for the first
f490: 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63   time after.** c
f4a0: 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74  reating the virt
f4b0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68  ual machine.  Th
f4c0: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
f4d0: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
f4e0: 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65  locating registe
f4f0: 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  rs and initializ
f500: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
f510: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
f520: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
f530: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
f540: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
f550: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
f560: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
f570: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
f580: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
f590: 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
f5a0: 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20  exactly once on 
f5b0: 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63  each virtual mac
f5c0: 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74  hine..** After t
f5d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
f5e0: 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73  alled the VM has
f5f0: 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22   been "packaged"
f600: 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a   and is ready.**
f610: 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20   to run.  After 
f620: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f630: 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20  called, further 
f640: 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
f650: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20  ite3VdbeAddOp() 
f660: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72  functions are pr
f670: 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20  ohibited.  This 
f680: 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65  routine disconne
f690: 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  cts.** the Vdbe 
f6a0: 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f  from the Parse o
f6b0: 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65  bject that helpe
f6c0: 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f  d generate it so
f6d0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65   that the.** the
f6e0: 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e   Vdbe becomes an
f6f0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74   independent ent
f700: 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73  ity and the Pars
f710: 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a  e object can be.
f720: 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  ** destroyed..**
f730: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
f740: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20  te3VdbeRewind() 
f750: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73  procedure to res
f760: 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  tore a virtual m
f770: 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74  achine back.** t
f780: 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74  o its initial st
f790: 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73  ate after it has
f7a0: 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f   been run..*/.vo
f7b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
f7c0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
f7d0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
f7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
f7f0: 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65   VDBE */.  Parse
f800: 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20   *pParse        
f810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
f820: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
f830: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
f840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f850: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
f860: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
f870: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f8a0: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
f8b0: 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  int nMem;       
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f8d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d  * Number of VM m
f8e0: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20  emory registers 
f8f0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72  */.  int nCursor
f900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f910: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f920: 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65   cursors require
f930: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b  d */.  int nArg;
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
f960: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20  of arguments in 
f970: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
f980: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
f9b0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75 73  */.  struct Reus
f9c0: 61 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20  ableSpace x;    
f9d0: 20 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20      /* Reusable 
f9e0: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a  bulk memory */..
f9f0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
fa00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
fa10: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
fa20: 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
fa30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
fa40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
fa50: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
fa60: 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73  pParse==p->pPars
fa70: 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e );.  db = p->d
fa80: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  b;.  assert( db-
fa90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
faa0: 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61   );.  nVar = pPa
fab0: 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65  rse->nVar;.  nMe
fac0: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
fad0: 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50  ;.  nCursor = pP
fae0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41  arse->nTab;.  nA
faf0: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61  rg = pParse->nMa
fb00: 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61  xArg;.  .  /* Ea
fb10: 63 68 20 63 75 72 73 6f 72 20 75 73 65 73 20 61  ch cursor uses a
fb20: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54   memory cell.  T
fb30: 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
fb40: 28 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20  (cursor 0) can. 
fb50: 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20   ** use aMem[0] 
fb60: 77 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68  which is not oth
fb70: 65 72 77 69 73 65 20 75 73 65 64 20 62 79 20 74  erwise used by t
fb80: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e  he VDBE program.
fb90: 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20    Allocate.  ** 
fba0: 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
fbb0: 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63   of aMem[] for c
fbc0: 75 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65  ursors 1 and gre
fbd0: 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61  ater..  ** See a
fbe0: 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72  lso: allocateCur
fbf0: 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  sor()..  */.  nM
fc00: 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  em += nCursor;. 
fc10: 20 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20   if( nCursor==0 
fc20: 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d  && nMem>0 ) nMem
fc30: 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f  ++;  /* Space fo
fc40: 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69  r aMem[0] even i
fc50: 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20  f not used */.. 
fc60: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
fc70: 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65  ow much reusable
fc80: 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c   memory is avail
fc90: 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20  able at the end 
fca0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f  of the.  ** opco
fcb0: 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20  de array.  This 
fcc0: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c  extra memory wil
fcd0: 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64  l be reallocated
fce0: 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65   for other eleme
fcf0: 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  nts.  ** of the 
fd00: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
fd10: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52  nt..  */.  n = R
fd20: 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29  OUND8(sizeof(Op)
fd30: 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20  *p->nOp);       
fd40: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
fd50: 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79  of opcode memory
fd60: 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70   used */.  x.pSp
fd70: 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e  ace = &((u8*)p->
fd80: 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20  aOp)[n];        
fd90: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
fda0: 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a   opcode memory *
fdb0: 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  /.  assert( EIGH
fdc0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
fdd0: 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20  (x.pSpace) );.  
fde0: 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44  x.nFree = ROUNDD
fdf0: 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f  OWN8(pParse->szO
fe00: 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a  pAlloc - n);  /*
fe10: 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   Bytes of unused
fe20: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73   memory */.  ass
fe30: 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20  ert( x.nFree>=0 
fe40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
fe50: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
fe60: 54 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46  T(&x.pSpace[x.nF
fe70: 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f  ree]) );..  reso
fe80: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26  lveP2Values(p, &
fe90: 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73  nArg);.  p->uses
fea0: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  StmtJournal = (u
feb0: 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c  8)(pParse->isMul
fec0: 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73  tiWrite && pPars
fed0: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20  e->mayAbort);.  
fee0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
fef0: 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29  ain && nMem<10 )
ff00: 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b  {.    nMem = 10;
ff10: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65  .  }.  p->expire
ff20: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d  d = 0;..  /* Mem
ff30: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72  ory for register
ff40: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63  s, parameters, c
ff50: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61  ursor, etc, is a
ff60: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20  llocated in one 
ff70: 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73  or two.  ** pass
ff80: 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  es.  On the firs
ff90: 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74  t pass, we try t
ffa0: 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d  o reuse unused m
ffb0: 65 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20  emory at the .  
ffc0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
ffd0: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
ffe0: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
fff0: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
10000 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
10010 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
10020 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
10030 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
10040 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
10050 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
10060 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69  he remainder usi
10070 6e 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72  ng a fresh memor
10080 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a  y allocation.  .
10090 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74    **.  ** This t
100a0 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  wo-pass approach
100b0 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20   that reuses as 
100c0 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
100d0 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a  ossible from.  *
100e0 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d  * the leftover m
100f0 65 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64  emory at the end
10100 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
10110 72 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20  rray.  This can 
10120 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
10130 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d  ** reduce the am
10140 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  ount of memory h
10150 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65  eld by a prepare
10160 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
10170 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e  /.  do {.    x.n
10180 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 20 20  Needed = 0;.    
10190 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
101a0 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d  pace(&x, p->aMem
101b0 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
101c0 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72  m));.    p->aVar
101d0 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
101e0 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a  , p->aVar, nVar*
101f0 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20  sizeof(Mem));.  
10200 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
10210 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
10220 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  pArg, nArg*sizeo
10230 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d  f(Mem*));.    p-
10240 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70  >apCsr = allocSp
10250 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72  ace(&x, p->apCsr
10260 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  , nCursor*sizeof
10270 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a  (VdbeCursor*));.
10280 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10290 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
102a0 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78  ATUS.    p->anEx
102b0 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ec = allocSpace(
102c0 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70  &x, p->anExec, p
102d0 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34  ->nOp*sizeof(i64
102e0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  ));.#endif.    i
102f0 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20  f( x.nNeeded==0 
10300 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70  ) break;.    x.p
10310 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65  Space = p->pFree
10320 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
10330 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e  ocRawNN(db, x.nN
10340 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46  eeded);.    x.nF
10350 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b  ree = x.nNeeded;
10360 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e  .  }while( !db->
10370 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
10380 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70  .  p->pVList = p
10390 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20  Parse->pVList;. 
103a0 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20   pParse->pVList 
103b0 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  =  0;.  p->expla
103c0 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70  in = pParse->exp
103d0 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  lain;.  if( db->
103e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
103f0 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b      p->nVar = 0;
10400 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  .    p->nCursor 
10410 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  = 0;.    p->nMem
10420 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
10430 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
10440 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e  nCursor;.    p->
10450 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
10460 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41  ar;.    initMemA
10470 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56  rray(p->aVar, nV
10480 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  ar, db, MEM_Null
10490 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  );.    p->nMem =
104a0 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d   nMem;.    initM
104b0 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
104c0 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55   nMem, db, MEM_U
104d0 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d  ndefined);.    m
104e0 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20  emset(p->apCsr, 
104f0 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  0, nCursor*sizeo
10500 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b  f(VdbeCursor*));
10510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10520 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
10530 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74  TATUS.    memset
10540 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70  (p->anExec, 0, p
10550 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34  ->nOp*sizeof(i64
10560 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  ));.#endif.  }. 
10570 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
10580 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nd(p);.}../*.** 
10590 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
105a0 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
105b0 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
105c0 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
105d0 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
105e0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
105f0 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
10600 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
10610 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
10620 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
10630 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
10640 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d  sert( pCx->pBtx=
10650 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54  =0 || pCx->eCurT
10660 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
10670 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  EE );.  switch( 
10680 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b  pCx->eCurType ){
10690 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
106a0 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20  E_SORTER: {.    
106b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72    sqlite3VdbeSor
106c0 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20  terClose(p->db, 
106d0 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  pCx);.      brea
106e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
106f0 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a  e CURTYPE_BTREE:
10700 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78   {.      if( pCx
10710 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  ->isEphemeral ){
10720 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 78  .        if( pCx
10730 2d 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65 33  ->pBtx ) sqlite3
10740 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
10750 70 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f  pBtx);.        /
10760 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
10770 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
10780 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
10790 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
107a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
107b0 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
107c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
107d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d      assert( pCx-
107e0 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29  >uc.pCursor!=0 )
107f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10800 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
10810 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f  r(pCx->uc.pCurso
10820 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
10830 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
10840 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10850 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
10860 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
10870 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
10880 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
10890 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d  or *pVCur = pCx-
108a0 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20  >uc.pVCur;.     
108b0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
108c0 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
108d0 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70   pVCur->pVtab->p
108e0 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73  Module;.      as
108f0 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74  sert( pVCur->pVt
10900 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  ab->nRef>0 );.  
10910 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62      pVCur->pVtab
10920 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20  ->nRef--;.      
10930 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
10940 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72  pVCur);.      br
10950 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
10960 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  f.  }.}../*.** C
10970 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
10980 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
10990 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  frame..*/.static
109a0 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f   void closeCurso
109b0 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a  rsInFrame(Vdbe *
109c0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  p){.  if( p->apC
109d0 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
109e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
109f0 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
10a00 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
10a10 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
10a20 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
10a30 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
10a40 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
10a50 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
10a60 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
10a70 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
10a80 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
10a90 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
10aa0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
10ab0 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
10ac0 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
10ad0 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
10ae0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
10af0 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
10b00 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
10b10 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
10b20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
10b30 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
10b40 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
10b50 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
10b60 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
10b70 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
10b80 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75  me->v;.  closeCu
10b90 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b  rsorsInFrame(v);
10ba0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10bb0 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
10bc0 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65  TATUS.  v->anExe
10bd0 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78  c = pFrame->anEx
10be0 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e  ec;.#endif.  v->
10bf0 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
10c00 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
10c10 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
10c20 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
10c30 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
10c40 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
10c50 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
10c60 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
10c70 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
10c80 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
10c90 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
10ca0 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
10cb0 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
10cc0 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
10cd0 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61  e;.  v->db->nCha
10ce0 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44  nge = pFrame->nD
10cf0 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74  bChange;.  sqlit
10d00 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
10d10 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70  ata(v->db, &v->p
10d20 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
10d30 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d  .  v->pAuxData =
10d40 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74   pFrame->pAuxDat
10d50 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75  a;.  pFrame->pAu
10d60 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74  xData = 0;.  ret
10d70 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
10d80 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10d90 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
10da0 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
10db0 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
10dc0 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
10dd0 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
10de0 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
10df0 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
10e00 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
10e10 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
10e20 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
10e30 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
10e40 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
10e50 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
10e60 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
10e70 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
10e80 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
10e90 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
10ea0 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
10eb0 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
10ec0 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
10ed0 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
10ee0 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
10ef0 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
10f00 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
10f10 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
10f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
10f30 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
10f40 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61  me);.    p->pFra
10f50 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  me = 0;.    p->n
10f60 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Frame = 0;.  }. 
10f70 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61   assert( p->nFra
10f80 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65  me==0 );.  close
10f90 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70  CursorsInFrame(p
10fa0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
10fb0 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
10fc0 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
10fd0 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
10fe0 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
10ff0 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
11000 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
11010 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
11020 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
11030 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
11040 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
11050 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
11060 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
11070 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
11080 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
11090 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28   the VM */.  if(
110a0 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73   p->pAuxData ) s
110b0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
110c0 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26  AuxData(p->db, &
110d0 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c  p->pAuxData, -1,
110e0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
110f0 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
11100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
11110 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
11120 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
11130 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
11140 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
11150 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
11160 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
11170 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
11180 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
11190 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
111a0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
111b0 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
111c0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
111d0 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
111e0 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
111f0 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
11200 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
11210 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
11220 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
11230 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
11240 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
11250 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
11260 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65  b;..  if( p->nRe
11270 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72  sColumn ){.    r
11280 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
11290 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
112a0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
112b0 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  E_N);.    sqlite
112c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
112d0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ColName);.  }.  
112e0 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
112f0 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
11300 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
11310 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
11320 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  ->aColName = (Me
11330 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
11340 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
11350 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
11360 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
11370 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e  0 ) return;.  in
11380 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  itMemArray(p->aC
11390 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d  olName, n, db, M
113a0 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  EM_Null);.}../*.
113b0 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
113c0 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
113d0 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
113e0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
113f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
11400 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
11410 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
11420 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
11430 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
11440 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
11450 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
11460 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
11470 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
11480 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
11490 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
114a0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
114b0 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
114c0 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
114d0 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
114e0 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
114f0 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
11500 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
11510 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
11520 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
11530 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
11540 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
11550 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
11560 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
11570 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
11580 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
11590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
115a0 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
115b0 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
115c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
115d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
115e0 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
115f0 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
11600 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11620 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
11630 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
11640 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
11650 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
11660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
11670 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
11680 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
11690 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
116a0 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
116b0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
116c0 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
116d0 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
116e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
116f0 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
11700 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
11710 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
11720 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
11730 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
11740 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
11750 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
11760 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
11770 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
11780 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
11790 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
117a0 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
117b0 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
117c0 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
117d0 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
117e0 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
117f0 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
11800 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
11810 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
11820 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
11830 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
11840 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
11850 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
11860 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
11870 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
11880 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11890 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
118a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
118b0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
118c0 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
118d0 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
118e0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
118f0 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
11900 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
11910 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
11920 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
11930 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
11940 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
11950 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
11960 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
11970 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11980 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
11990 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
119a0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
119b0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
119c0 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
119d0 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
119e0 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
119f0 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
11a00 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e-transaction.  
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e   ** that are can
11a30 64 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77  didates for a tw
11a40 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75  o-phase commit u
11a50 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20  sing a.         
11a60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73            ** mas
11a70 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter-journal */. 
11a80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11a90 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
11aa0 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
11ab0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11ac0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
11ad0 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
11ae0 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
11af0 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
11b00 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
11b10 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
11b20 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
11b30 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
11b40 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
11b50 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
11b60 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
11b70 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
11b80 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
11b90 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
11ba0 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
11bb0 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
11bc0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
11bd0 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
11be0 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
11bf0 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
11c00 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
11c10 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
11c20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
11c30 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
11c40 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
11c50 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
11c60 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
11c70 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
11c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
11c90 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20  bSync(db, p);.. 
11ca0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
11cb0 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
11cc0 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
11cd0 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
11ce0 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
11cf0 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
11d00 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
11d10 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
11d20 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
11d30 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
11d40 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
11d50 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
11d60 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
11d70 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
11d80 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
11d90 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
11da0 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
11db0 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
11dc0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
11dd0 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
11de0 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
11df0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
11e00 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
11e10 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
11e20 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
11e30 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
11e40 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
11e50 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
11e60 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
11e70 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62  r or not a datab
11e80 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61  ase might need a
11e90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11ea0 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20  depends upon.   
11eb0 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61     ** its journa
11ec0 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74  l mode (among ot
11ed0 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68  her things).  Th
11ee0 69 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d  is matrix determ
11ef0 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ines which.     
11f00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65   ** journal mode
11f10 73 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a  s use a master j
11f20 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68  ournal and which
11f30 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20   do not */.     
11f40 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
11f50 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b   aMJNeeded[] = {
11f60 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45  .        /* DELE
11f70 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20  TE   */  1,.    
11f80 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20      /* PERSIST  
11f90 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
11fa0 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30  * OFF       */ 0
11fb0 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  ,.        /* TRU
11fc0 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20  NCATE  */ 1,.   
11fd0 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20       /* MEMORY  
11fe0 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20    */ 0,.        
11ff0 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20  /* WAL       */ 
12000 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  0.      };.     
12010 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
12020 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63    /* Pager assoc
12030 69 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a  iated with pBt *
12040 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  /.      needXcom
12050 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  mit = 1;.      s
12060 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12070 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61  (pBt);.      pPa
12080 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
12090 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
120a0 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
120b0 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21  i].safety_level!
120c0 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
120d0 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26  US_OFF.       &&
120e0 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74   aMJNeeded[sqlit
120f0 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61  e3PagerGetJourna
12100 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20  lMode(pPager)]. 
12110 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
12120 50 61 67 65 72 49 73 4d 65 6d 64 62 28 70 50 61  PagerIsMemdb(pPa
12130 67 65 72 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  ger)==0.      ){
12140 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
12150 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i!=1 );.      
12160 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20    nTrans++;.    
12170 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
12180 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
12190 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
121a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
121b0 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
121c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
121d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
121e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
121f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
12200 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
12210 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
12220 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
12230 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
12240 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
12250 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
12260 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
12270 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
12280 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
12290 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
122a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
122b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
122c0 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
122d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
122e0 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
122f0 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
12300 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
12310 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
12320 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
12330 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
12340 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
12350 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
12360 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
12370 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
12380 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
12390 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
123a0 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
123b0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
123c0 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
123d0 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
123e0 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
123f0 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
12400 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
12410 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
12420 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
12430 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
12440 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
12450 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
12460 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
12470 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
12480 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
12490 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
124a0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
124b0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
124c0 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
124d0 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
124e0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
124f0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
12500 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
12510 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
12520 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
12530 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
12540 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
12550 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
12560 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
12570 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
12580 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
12590 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
125a0 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
125b0 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
125c0 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
125d0 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
125e0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
125f0 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
12600 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
12610 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
12620 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
12630 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
12640 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
12650 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
12660 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
12670 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
12680 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
12690 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
126a0 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
126b0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
126c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
126d0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
126e0 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
126f0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12700 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
12710 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
12720 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12730 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
12740 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
12750 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
12760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12770 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
12780 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
12790 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
127a0 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
127b0 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
127c0 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
127d0 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
127e0 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
127f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
12800 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
12810 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12820 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
12830 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  ed atomically.. 
12840 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
12850 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
12860 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
12870 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
12880 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61  b->pVfs;.    cha
12890 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
128a0 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
128b0 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
128c0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
128d0 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
128e0 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
128f0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
12900 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
12910 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
12920 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
12930 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
12940 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
12950 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74    int retryCount
12960 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
12970 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a  ainFile;..    /*
12980 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
12990 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
129a0 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46  me */.    nMainF
129b0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ile = sqlite3Str
129c0 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29  len30(zMainFile)
129d0 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
129e0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
129f0 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39  b, "%s-mjXXXXXX9
12a00 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29  XXz", zMainFile)
12a10 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65  ;.    if( zMaste
12a20 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
12a30 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
12a40 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
12a50 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
12a60 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
12a70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
12a80 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
12a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12aa0 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
12ab0 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
12ac0 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
12ad0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12ae0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
12af0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
12b00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
12b10 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12b20 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
12b30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12b40 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
12b50 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
12b60 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
12b70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12b80 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
12b90 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
12ba0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
12bb0 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
12bc0 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
12bd0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
12be0 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
12bf0 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
12c00 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
12c30 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
12c40 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
12c50 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
12c60 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
12c70 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
12c80 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
12c90 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
12ca0 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
12cb0 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
12cc0 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
12cd0 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
12ce0 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
12cf0 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
12d00 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
12d10 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
12d20 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
12d30 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
12d40 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
12d50 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
12d60 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
12d70 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
12d80 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
12d90 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
12da0 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
12db0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
12dc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12dd0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
12de0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
12df0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12e00 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
12e10 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
12e20 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
12e30 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
12e40 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
12e50 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
12e60 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
12e70 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
12e80 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
12e90 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
12ea0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
12eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12ec0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
12ed0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
12ee0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
12ef0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
12f00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
12f10 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
12f20 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
12f30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
12f40 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
12f50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12f60 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
12f70 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
12f80 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
12f90 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
12fa0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12fb0 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
12fc0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
12fd0 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
12fe0 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
12ff0 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
13000 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
13010 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
13020 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
13030 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
13040 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
13050 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
13060 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
13070 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
13080 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
13090 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
130a0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
130b0 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
130c0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
130d0 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
130e0 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
130f0 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
13100 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
13110 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13120 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
13130 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
13140 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
13150 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
13160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
13170 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
13180 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13190 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
131a0 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
131b0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
131c0 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
131d0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
131e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
131f0 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
13200 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13210 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
13220 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
13230 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
13240 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
13250 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
13260 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
13270 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13280 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
13290 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
132a0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
132b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
132c0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
132d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
132e0 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
132f0 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
13300 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
13310 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
13320 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
13330 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c  .    if( 0==(sql
13340 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
13350 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
13360 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
13370 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
13380 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
13390 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
133a0 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
133b0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
133c0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
133d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
133e0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
133f0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
13400 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
13410 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
13420 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
13430 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
13440 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
13450 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
13460 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
13470 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
13480 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
13490 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
134a0 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
134b0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
134c0 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
134d0 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
134e0 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
134f0 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
13500 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
13510 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13520 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13530 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
13540 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
13550 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
13560 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
13570 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
13580 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
13590 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
135a0 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
135b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
135c0 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
135d0 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
135e0 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
135f0 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
13600 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
13610 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
13620 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
13630 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
13640 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
13650 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
13660 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
13670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
13680 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
13690 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
136a0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
136b0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
136c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
136d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
136e0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
136f0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
13700 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
13710 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
13720 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
13730 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
13740 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
13750 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13760 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13770 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
13780 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
13790 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
137a0 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
137b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
137c0 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
137d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
137e0 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
137f0 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
13800 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
13810 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
13820 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
13830 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13840 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
13850 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
13860 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
13870 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
13880 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
13890 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
138a0 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
138b0 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
138c0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
138d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
138e0 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
138f0 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
13900 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
13910 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
13920 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
13930 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
13940 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
13950 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
13960 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
13970 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
13980 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
13990 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
139a0 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
139b0 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
139c0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
139d0 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
139e0 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
139f0 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
13a00 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
13a10 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
13a20 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
13a30 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
13a40 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
13a50 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
13a60 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
13a70 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
13a80 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
13a90 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
13aa0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
13ab0 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
13ac0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
13ad0 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
13ae0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
13af0 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
13b00 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
13b10 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
13b20 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
13b30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
13b40 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
13b50 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
13b60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
13b70 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
13b80 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
13b90 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
13ba0 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
13bb0 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
13bc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
13bd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
13be0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13bf0 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
13c00 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
13c10 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
13c20 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
13c30 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
13c40 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
13c50 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
13c60 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
13c70 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
13c80 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
13c90 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
13ca0 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
13cb0 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
13cc0 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
13cd0 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
13ce0 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
13cf0 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
13d00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
13d10 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
13d20 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
13d30 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13d40 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
13d50 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
13d60 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
13d70 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
13d80 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
13d90 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
13da0 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
13db0 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
13dc0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
13dd0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
13de0 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  sy((sqlite3_stmt
13df0 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  *)p) ){.      cn
13e00 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
13e10 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
13e20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20  nWrite++;.      
13e30 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
13e40 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20   ) nRead++;.    
13e50 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
13e60 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
13e70 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65  ( cnt==db->nVdbe
13e80 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65  Active );.  asse
13e90 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
13ea0 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
13eb0 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64  assert( nRead==d
13ec0 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
13ed0 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
13ee0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
13ef0 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
13f00 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
13f10 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
13f20 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
13f30 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
13f40 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
13f50 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
13f60 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
13f70 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
13f80 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
13f90 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
13fa0 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
13fb0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13fc0 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
13fd0 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
13fe0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
13ff0 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
14000 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
14010 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
14020 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
14030 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
14040 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
14050 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
14060 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
14070 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
14080 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
14090 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
140a0 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  _OK..*/.static S
140b0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
140c0 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74  nt vdbeCloseStat
140d0 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
140e0 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
140f0 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
14100 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
14110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
14120 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  t i;.  const int
14130 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
14140 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
14150 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
14160 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14170 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
14180 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
14190 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
141a0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
141b0 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
141c0 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
141d0 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
141e0 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28 69  int) );..  for(i
141f0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
14200 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63  ++){ .    int rc
14210 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
14220 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
14230 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
14240 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
14250 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
14260 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
14270 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20   ){.        rc2 
14280 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
14290 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
142a0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
142b0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
142c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
142d0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
142e0 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20  {.        rc2 = 
142f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
14300 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
14310 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
14320 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
14330 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
14340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14350 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
14360 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14370 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  }.  db->nStateme
14380 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61 74  nt--;.  p->iStat
14390 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66  ement = 0;..  if
143a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
143b0 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  ){.    if( eOp==
143c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
143d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
143e0 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
143f0 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
14400 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
14410 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d  avepoint);.    }
14420 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14430 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14440 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
14450 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
14460 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
14470 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
14480 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
14490 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
144a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
144b0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
144c0 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
144d0 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
144e0 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
144f0 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
14500 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
14510 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
14520 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
14530 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
14540 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
14550 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
14560 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
14570 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
14580 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
14590 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d 3e  efCons;.    db->
145a0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
145b0 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
145c0 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65 74  mCons;.  }.  ret
145d0 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
145e0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
145f0 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
14600 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66 28   int eOp){.  if(
14610 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d 65   p->db->nStateme
14620 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
14630 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ent ){.    retur
14640 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65  n vdbeCloseState
14650 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20 20  ment(p, eOp);.  
14660 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14670 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
14680 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
14690 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
146a0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
146b0 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
146c0 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
146d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
146e0 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
146f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
14700 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
14710 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
14720 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
14730 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
14740 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
14750 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
14760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
14770 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
14780 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
14790 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
147a0 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
147b0 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
147c0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
147d0 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
147e0 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
147f0 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
14800 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
14810 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20  T_FOREIGNKEY.** 
14820 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72  and write an err
14830 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
14840 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
14850 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
14860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14870 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
14880 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
14890 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
148a0 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
148b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
148c0 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
148d0 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65  rred && (db->nDe
148e0 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e  ferredCons+db->n
148f0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29  DeferredImmCons)
14900 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66  >0) .   || (!def
14910 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
14920 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20  onstraint>0) .  
14930 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
14940 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
14950 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
14960 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
14970 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
14980 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
14990 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  (p, "FOREIGN KEY
149a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
149b0 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
149c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
149d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
149e0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
149f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14a00 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
14a10 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
14a20 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
14a30 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
14a40 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
14a50 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
14a60 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
14a70 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
14a80 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
14a90 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
14aa0 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
14ab0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
14ac0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
14ad0 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
14ae0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
14af0 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
14b00 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
14b10 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
14b20 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
14b30 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
14b40 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
14b50 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
14b60 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
14b70 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
14b80 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
14b90 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
14ba0 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
14bb0 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
14bc0 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
14bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
14be0 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
14bf0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
14c00 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
14c10 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
14c20 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
14c30 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
14c40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
14c50 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
14c60 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c80 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
14c90 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
14ca0 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
14cb0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
14cc0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
14cd0 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
14ce0 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
14cf0 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
14d00 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
14d10 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
14d20 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
14d30 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
14d40 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
14d50 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
14d60 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
14d70 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
14d80 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
14d90 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
14da0 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
14db0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
14dc0 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
14dd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
14de0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
14df0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
14e00 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
14e10 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
14e20 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
14e30 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
14e40 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
14e50 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
14e60 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
14e70 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
14e80 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
14e90 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
14ea0 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
14eb0 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
14ec0 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
14ed0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
14ee0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
14ef0 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
14f00 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
14f10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
14f20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
14f30 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
14f40 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
14f50 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
14f60 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  KPT;.  }.  close
14f70 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
14f80 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
14f90 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
14fa0 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
14fb0 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
14fc0 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
14fd0 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74   started or if t
14fe0 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  he.  ** SQL stat
14ff0 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72  ement does not r
15000 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64  ead or write a d
15010 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a  atabase file.  *
15020 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
15030 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72   && p->bIsReader
15040 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
15050 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
15060 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
15070 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
15080 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
15090 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
150a0 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
150b0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
150c0 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
150d0 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
150e0 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
150f0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
15100 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
15110 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
15120 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
15130 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
15140 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
15150 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
15160 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
15170 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
15180 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
15190 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
151a0 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
151c0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
151d0 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
151e0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
151f0 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
15200 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
15210 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
15220 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
15230 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
15240 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
15250 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
15260 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
15270 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
15280 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
15290 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
152a0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
152b0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
152c0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
152d0 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
152e0 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
152f0 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
15300 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
15310 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
15320 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
15330 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
15340 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
15350 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
15360 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
15370 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
15380 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
15390 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
153a0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
153b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
153c0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
153d0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
153e0 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
153f0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
15400 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
15410 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
15420 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
15430 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
15440 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
15450 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
15460 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
15470 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
15480 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
15490 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
154a0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
154b0 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
154c0 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
154d0 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
154e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
154f0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
15500 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
15510 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
15520 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
15530 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
15540 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
15550 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
15560 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
15570 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
15580 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
15590 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
155a0 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
155b0 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
155c0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
155d0 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
155e0 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
155f0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
15600 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15610 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
15620 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
15630 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
15640 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
15650 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
15660 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
15670 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
15680 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
15690 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
156a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
156b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
156c0 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
156d0 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
156e0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
156f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15710 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
15720 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
15730 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
15740 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
15750 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
15760 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
15770 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
15780 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
15790 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
157a0 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
157b0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
157c0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
157d0 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
157e0 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
157f0 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
15800 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
15810 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
15820 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
15830 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
15840 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
15850 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
15860 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
15870 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
15880 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
15890 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
158a0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
158b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
158c0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
158d0 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
158e0 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
158f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15900 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
15910 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15920 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15930 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
15940 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
15950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15960 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
15970 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
15980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
15990 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
159a0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
159b0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
159c0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
159d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
159e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
159f0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
15a00 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
15a10 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
15a20 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
15a30 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
15a40 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
15a50 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
15a60 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
15a70 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
15a80 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
15a90 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
15aa0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15ab0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
15ac0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
15ad0 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
15ae0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
15af0 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
15b00 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
15b10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
15b20 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
15b30 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
15b40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15b50 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
15b60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
15b70 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
15b80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
15b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15ba0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
15bb0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
15bc0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
15bd0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
15be0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
15bf0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
15c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15c10 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
15c20 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
15c30 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
15c40 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
15c50 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
15c60 67 73 20 26 3d 20 7e 28 75 36 34 29 53 51 4c 49  gs &= ~(u64)SQLI
15c70 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20  TE_DeferFKs;.   
15c80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
15c90 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
15ca0 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
15cb0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
15cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
15cd0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
15ce0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
15cf0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
15d00 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
15d10 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
15d20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
15d30 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
15d40 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
15d50 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15d60 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
15d70 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
15d80 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
15d90 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
15da0 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
15db0 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
15dc0 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
15dd0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
15de0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
15df0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
15e00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15e10 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
15e20 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
15e30 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
15e40 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
15e50 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
15e60 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
15e70 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
15e80 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
15e90 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
15ea0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
15eb0 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
15ec0 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
15ed0 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
15ee0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
15ef0 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
15f00 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
15f10 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
15f20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
15f30 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
15f40 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
15f50 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
15f60 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
15f70 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
15f80 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
15f90 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
15fa0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
15fb0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
15fc0 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
15fd0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
15fe0 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
15ff0 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
16000 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
16010 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
16020 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
16030 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
16040 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
16050 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
16060 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
16070 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
16080 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
16090 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
160a0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
160b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
160c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
160d0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
160e0 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
160f0 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
16100 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
16110 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
16120 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
16130 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
16140 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
16150 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
16160 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
16170 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
16180 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
16190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
161a0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
161b0 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
161c0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
161d0 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
161e0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
161f0 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
16200 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
16210 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
16220 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
16230 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
16240 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
16250 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
16260 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
16270 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
16280 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
16290 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
162a0 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
162b0 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
162c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
162d0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
162e0 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
162f0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
16300 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
16310 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
16320 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
16330 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
16340 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(p);.  }..  /* 
16350 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
16360 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
16370 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
16380 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
16390 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
163a0 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >=0 ){.    db->n
163b0 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20  VdbeActive--;.  
163c0 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
163d0 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72  ly ) db->nVdbeWr
163e0 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ite--;.    if( p
163f0 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62  ->bIsReader ) db
16400 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20  ->nVdbeRead--;. 
16410 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
16420 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e  VdbeActive>=db->
16430 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20  nVdbeRead );.   
16440 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
16450 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62  beRead>=db->nVdb
16460 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73  eWrite );.    as
16470 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57  sert( db->nVdbeW
16480 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  rite>=0 );.  }. 
16490 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
164a0 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
164b0 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
164c0 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d  t(db);.  if( db-
164d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
164e0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
164f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
16500 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
16510 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
16520 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
16530 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
16540 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
16550 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
16560 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
16570 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
16580 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
16590 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
165a0 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
165b0 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
165c0 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
165d0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
165e0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
165f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
16600 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
16610 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
16620 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
16630 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
16640 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
16650 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
16660 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
16670 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
16680 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
16690 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
166a0 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
166b0 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
166c0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
166d0 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
166e0 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
166f0 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
16700 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
16710 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
16720 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
16730 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
16740 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
16750 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
16760 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16770 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
16780 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
16790 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
167a0 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
167b0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
167c0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
167d0 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
167e0 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
167f0 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
16800 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
16810 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
16820 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
16830 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
16840 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
16850 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
16860 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
16870 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
16880 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
16890 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
168a0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
168b0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
168c0 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
168d0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
168e0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
168f0 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
16900 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
16910 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  ){.    db->bBeni
16920 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20  gnMalloc++;.    
16930 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
16940 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
16950 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
16960 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
16970 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
16980 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
16990 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
169a0 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
169b0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
169c0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
169d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
169e0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
169f0 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e  .    db->bBenign
16a00 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73  Malloc--;.  }els
16a10 65 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29  e if( db->pErr )
16a20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
16a30 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45  ueSetNull(db->pE
16a40 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65  rr);.  }.  db->e
16a50 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72  rrCode = rc;.  r
16a60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
16a70 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16a80 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49  E_SQLLOG./*.** I
16a90 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  f an SQLITE_CONF
16aa0 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69  IG_SQLLOG hook i
16ab0 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64  s registered and
16ac0 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
16ad0 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65   run, .** invoke
16ae0 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
16af0 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  oid vdbeInvokeSq
16b00 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20  llog(Vdbe *v){. 
16b10 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
16b20 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
16b30 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54   && v->rc==SQLIT
16b40 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20  E_OK && v->zSql 
16b50 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && v->pc>=0 ){. 
16b60 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64     char *zExpand
16b70 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ed = sqlite3Vdbe
16b80 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e  ExpandSql(v, v->
16b90 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  zSql);.    asser
16ba0 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  t( v->db->init.b
16bb0 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  usy==0 );.    if
16bc0 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20  ( zExpanded ){. 
16bd0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
16be0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
16bf0 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  (.          sqli
16c00 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16c10 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64  pSqllogArg, v->d
16c20 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a  b, zExpanded, 1.
16c30 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
16c40 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
16c50 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a  db, zExpanded);.
16c60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
16c70 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49  e.# define vdbeI
16c80 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23  nvokeSqllog(x).#
16c90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
16ca0 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
16cb0 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
16cc0 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
16cd0 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
16ce0 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
16cf0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
16d00 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
16d10 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
16d20 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
16d30 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
16d40 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
16d50 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
16d60 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
16d70 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
16d80 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
16d90 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
16da0 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
16db0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
16dc0 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
16dd0 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
16de0 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
16df0 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
16e00 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
16e10 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
16e20 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
16e30 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
16e40 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
16e50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
16e60 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
16e70 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71   i;.#endif..  sq
16e80 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
16e90 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
16ea0 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
16eb0 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
16ec0 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
16ed0 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
16ee0 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
16ef0 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
16f00 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
16f10 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
16f20 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
16f30 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
16f40 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
16f50 65 20 56 44 42 45 20 68 61 73 20 62 65 65 6e 20  e VDBE has been 
16f60 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
16f70 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
16f80 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
16f90 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
16fa0 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
16fb0 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
16fc0 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
16fd0 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
16fe0 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
16ff0 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
17000 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
17010 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
17020 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
17030 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
17040 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
17050 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
17060 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
17070 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
17080 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
17090 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
170a0 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
170b0 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
170c0 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  r(p);.    if( p-
170d0 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
170e0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
170f0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
17100 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
17110 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
17120 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
17130 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
17140 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
17150 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
17160 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
17170 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
17180 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
17190 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
171a0 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
171b0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
171c0 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
171d0 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
171e0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
171f0 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
17200 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
17210 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
17220 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  );.  }..  /* Res
17230 65 74 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74  et register cont
17240 65 6e 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d  ents and reclaim
17250 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d   error message m
17260 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64  emory..  */.#ifd
17270 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
17280 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73    /* Execute ass
17290 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
172a0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
172b0 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d  the Vdbe.apCsr[]
172c0 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e   and .  ** Vdbe.
172d0 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61  aMem[] arrays ha
172e0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
172f0 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a  cleaned up.  */.
17300 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29    if( p->apCsr )
17310 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
17320 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73  Cursor; i++) ass
17330 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d  ert( p->apCsr[i]
17340 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
17350 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28  aMem ){.    for(
17360 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=0; i<p->nMem; 
17370 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
17380 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
17390 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a  EM_Undefined );.
173a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
173b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
173c0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
173d0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
173e0 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
173f0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
17400 5f 44 45 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69  _DEBUG.  p->nWri
17410 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  te = 0;.#endif..
17420 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
17430 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
17440 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
17450 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
17460 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
17470 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
17480 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
17490 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
174a0 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
174b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
174c0 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20  t, "---- ");.   
174d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
174e0 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
174f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17500 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b   "%02x", p->aOp[
17510 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20  i].opcode);.    
17520 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
17530 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
17540 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20      if( p->zSql 
17550 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
17560 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20  c, pc = 0;.     
17570 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
17580 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
17590 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d  for(i=0; (c = p-
175a0 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b  >zSql[i])!=0; i+
175b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
175c0 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc=='\n' ) fpr
175d0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
175e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63  ;.          putc
175f0 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  (c, out);.      
17600 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20      pc = c;.    
17610 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
17620 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc!='\n' ) fpr
17630 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
17640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
17650 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
17660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
17670 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a  char zHdr[100];.
17680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
17690 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
176a0 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36  zHdr), zHdr, "%6
176b0 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22  u %12llu %8llu "
176c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
176d0 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
176e0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
176f0 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
17700 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
17710 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
17720 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
17730 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
17740 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   );.        fpri
17750 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
17760 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Hdr);.        sq
17770 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
17780 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
17790 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
177a0 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
177b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
177c0 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
177d0 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b  DBE_MAGIC_RESET;
177e0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
177f0 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
17800 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
17810 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
17820 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
17830 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
17840 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
17850 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
17860 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
17870 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
17880 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
17890 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
178a0 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
178b0 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
178c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
178d0 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
178e0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
178f0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
17900 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
17910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
17920 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
17930 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
17940 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
17950 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
17960 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
17970 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17980 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  /*.** If paramet
17990 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74  er iOp is less t
179a0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  han zero, then i
179b0 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
179c0 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  ctor for.** all 
179d0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
179e0 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c  ointers currentl
179f0 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20  y cached by the 
17a00 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20  VM passed as.** 
17a10 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
17a20 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  nt..**.** Or, if
17a30 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20   iOp is greater 
17a40 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
17a50 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
17a60 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a  destructor is.**
17a70 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f   only invoked fo
17a80 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72  r those auxiliar
17a90 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
17aa0 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75  created by the u
17ab0 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ser .** function
17ac0 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
17ad0 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f  OP_Function opco
17ae0 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  de at instructio
17af0 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20  n iOp of .** VM 
17b00 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20  pVdbe, and only 
17b10 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  then if:.**.**  
17b20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74    * the associat
17b30 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ed function para
17b40 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e  meter is the 32n
17b50 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e  d or later (coun
17b60 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f  ting.**      fro
17b70 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29  m left to right)
17b80 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  , or.**.**    * 
17b90 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
17ba0 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e  g bit in argumen
17bb0 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20  t mask is clear 
17bc0 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74  (where the first
17bd0 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f  .**      functio
17be0 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72  n parameter corr
17bf0 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30  esponds to bit 0
17c00 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20   etc.)..*/.void 
17c10 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
17c20 65 41 75 78 44 61 74 61 28 73 71 6c 69 74 65 33  eAuxData(sqlite3
17c30 20 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a   *db, AuxData **
17c40 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74  pp, int iOp, int
17c50 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28   mask){.  while(
17c60 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44   *pp ){.    AuxD
17c70 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b  ata *pAux = *pp;
17c80 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29  .    if( (iOp<0)
17c90 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e  .     || (pAux->
17ca0 69 41 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20  iAuxOp==iOp.    
17cb0 20 20 20 20 20 20 26 26 20 70 41 75 78 2d 3e 69        && pAux->i
17cc0 41 75 78 41 72 67 3e 3d 30 0a 20 20 20 20 20 20  AuxArg>=0.      
17cd0 20 20 20 20 26 26 20 28 70 41 75 78 2d 3e 69 41      && (pAux->iA
17ce0 75 78 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61  uxArg>31 || !(ma
17cf0 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70  sk & MASKBIT32(p
17d00 41 75 78 2d 3e 69 41 75 78 41 72 67 29 29 29 29  Aux->iAuxArg))))
17d10 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
17d20 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41  stcase( pAux->iA
17d30 75 78 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20  uxArg==31 );.   
17d40 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
17d50 6c 65 74 65 41 75 78 20 29 7b 0a 20 20 20 20 20  leteAux ){.     
17d60 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
17d70 41 75 78 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  Aux(pAux->pAux);
17d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
17d90 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74  pp = pAux->pNext
17da0 41 75 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Aux;.      sqlit
17db0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 75  e3DbFree(db, pAu
17dc0 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
17dd0 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e       pp= &pAux->
17de0 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a  pNextAux;.    }.
17df0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
17e00 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
17e10 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
17e20 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
17e30 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
17e40 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
17e50 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
17e60 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
17e70 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
17e80 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
17e90 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
17ea0 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
17eb0 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
17ec0 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
17ed0 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
17ee0 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
17ef0 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
17f00 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
17f10 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
17f20 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
17f30 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
17f40 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
17f50 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
17f60 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
17f70 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
17f80 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
17f90 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
17fa0 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
17fb0 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
17fc0 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
17fd0 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
17fe0 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
17ff0 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e  ;.  for(pSub=p->
18000 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20  pProgram; pSub; 
18010 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20  pSub=pNext){.   
18020 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70   pNext = pSub->p
18030 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72  Next;.    vdbeFr
18040 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53  eeOpArray(db, pS
18050 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e  ub->aOp, pSub->n
18060 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
18070 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29  DbFree(db, pSub)
18080 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d  ;.  }.  if( p->m
18090 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
180a0 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c  _INIT ){.    rel
180b0 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
180c0 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
180d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
180e0 65 28 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29  e(db, p->pVList)
180f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
18100 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65  ree(db, p->pFree
18110 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65  );.  }.  vdbeFre
18120 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
18130 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
18140 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18150 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
18160 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
18170 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69  db, p->zSql);.#i
18180 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18190 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 73  LE_NORMALIZE.  s
181a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
181b0 20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 29 3b 0a 23   p->zNormSql);.#
181c0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
181d0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
181e0 53 43 41 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20  SCANSTATUS.  {. 
181f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
18200 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61  r(i=0; i<p->nSca
18210 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  n; i++){.      s
18220 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18230 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61   p->aScan[i].zNa
18240 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
18250 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18260 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a   p->aScan);.  }.
18270 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
18280 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
18290 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
182a0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
182b0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
182c0 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 61 73 73  ite3 *db;..  ass
182d0 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
182e0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
182f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
18300 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
18310 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  x) );.  sqlite3V
18320 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64  dbeClearObject(d
18330 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  b, p);.  if( p->
18340 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
18350 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
18360 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
18370 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
18380 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20  ->pVdbe==p );.  
18390 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d    db->pVdbe = p-
183a0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
183b0 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
183c0 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
183d0 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
183e0 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
183f0 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
18400 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73    p->db = 0;.  s
18410 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64  qlite3DbFreeNN(d
18420 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
18430 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68  The cursor "p" h
18440 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65  as a pending see
18450 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  k operation that
18460 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
18470 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74  n.** carried out
18480 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73  .  Seek the curs
18490 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65  or now.  If an e
184a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
184b0 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  urn.** the appro
184c0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
184d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
184e0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
184f0 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
18500 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
18510 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c   *p){.  int res,
18520 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
18530 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e  TE_TEST.  extern
18540 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
18550 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
18560 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  f.  assert( p->d
18570 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b  eferredMoveto );
18580 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73  .  assert( p->is
18590 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  Table );.  asser
185a0 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
185b0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
185c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
185d0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
185e0 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
185f0 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
18600 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
18610 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
18620 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21  n rc;.  if( res!
18630 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18640 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18650 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
18660 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65  EST.  sqlite3_se
18670 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
18680 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72  ndif.  p->deferr
18690 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
186a0 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
186b0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
186c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
186d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74  ;.}../*.** Somet
186e0 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63  hing has moved c
186f0 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66  ursor "p" out of
18700 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74   place.  Maybe t
18710 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a  he row it was.**
18720 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20   pointed to was 
18730 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
18740 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d   under it.  Or m
18750 61 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77  aybe the btree w
18760 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64  as.** rebalanced
18770 2e 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20  .  Whatever the 
18780 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65  cause, try to re
18790 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65  store "p" to the
187a0 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20   place it.** is 
187b0 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70  supposed to be p
187c0 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65  ointing.  If the
187d0 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64   row was deleted
187e0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
187f0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73  the.** cursor, s
18800 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  et the cursor to
18810 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c   point to a NULL
18820 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
18830 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
18840 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43  INE handleMovedC
18850 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72  ursor(VdbeCursor
18860 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69   *p){.  int isDi
18870 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a  fferentRow, rc;.
18880 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
18890 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
188a0 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74  TREE );.  assert
188b0 28 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21  ( p->uc.pCursor!
188c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
188d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
188e0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
188f0 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72  .pCursor) );.  r
18900 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
18910 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d  CursorRestore(p-
18920 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69 73  >uc.pCursor, &is
18930 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20  DifferentRow);. 
18940 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
18950 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
18960 20 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74   if( isDifferent
18970 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77  Row ) p->nullRow
18980 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
18990 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
189a0 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  k to ensure that
189b0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
189c0 61 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74  alid.  Restore t
189d0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20  he cursor.** if 
189e0 6e 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e  need be.  Return
189f0 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66   any I/O error f
18a00 72 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20  rom the restore 
18a10 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  operation..*/.in
18a20 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
18a30 73 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43  sorRestore(VdbeC
18a40 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73  ursor *p){.  ass
18a50 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
18a60 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
18a70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
18a80 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
18a90 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
18aa0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
18ab0 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
18ac0 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  or(p);.  }.  ret
18ad0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
18ae0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
18af0 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
18b00 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
18b10 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
18b20 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
18b30 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
18b40 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
18b50 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
18b60 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
18b70 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
18b80 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
18b90 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
18ba0 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
18bb0 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
18bc0 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
18bd0 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
18be0 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
18bf0 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
18c00 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
18c10 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
18c20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
18c30 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
18c40 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
18c50 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
18c60 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
18c70 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
18c80 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
18c90 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
18ca0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
18cb0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
18cc0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
18cd0 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
18ce0 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
18cf0 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
18d00 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
18d10 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
18d20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18d30 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
18d40 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
18d50 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
18d60 6f 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69  or **pp, int *pi
18d70 43 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72 73  Col){.  VdbeCurs
18d80 6f 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 61  or *p = *pp;.  a
18d90 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
18da0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
18db0 45 20 7c 7c 20 70 2d 3e 65 43 75 72 54 79 70 65  E || p->eCurType
18dc0 3d 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f  ==CURTYPE_PSEUDO
18dd0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66   );.  if( p->def
18de0 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
18df0 20 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20 20     int iMap;.   
18e00 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20   if( p->aAltMap 
18e10 26 26 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41  && (iMap = p->aA
18e20 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29  ltMap[1+*piCol])
18e30 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20  >0 ){.      *pp 
18e40 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b  = p->pAltCursor;
18e50 0a 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20  .      *piCol = 
18e60 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20  iMap - 1;.      
18e70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
18e90 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65  rn handleDeferre
18ea0 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a  dMoveto(p);.  }.
18eb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
18ec0 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
18ed0 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
18ee0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
18ef0 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
18f00 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
18f10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18f20 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
18f30 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
18f40 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
18f50 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
18f60 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18f70 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
18f80 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
18f90 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
18fa0 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
18fb0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18fc0 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
18fd0 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
18fe0 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
18ff0 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
19000 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
19010 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
19020 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
19030 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
19040 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
19050 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
19060 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
19070 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
19080 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
19090 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
190a0 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
190b0 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
190c0 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
190d0 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
190e0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
190f0 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
19100 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
19110 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
19120 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
19130 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
19140 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
19150 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
19160 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
19170 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
19180 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
19190 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
191a0 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
191b0 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
191c0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
191d0 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
191e0 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
191f0 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79   blob separately
19200 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
19210 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
19220 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
19230 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
19240 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
19250 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
19260 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
19270 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
19280 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
19290 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
192a0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
192b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
192c0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
192d0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
192e0 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
192f0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
19300 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
19310 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
19320 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19340 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
19350 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
19360 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
19370 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
19380 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
19390 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
193a0 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
193b0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
193c0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
193d0 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
19400 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
19410 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
19420 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
19430 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
19440 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
19470 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
19480 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
19490 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
194a0 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
194b0 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
194c0 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
194d0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
194e0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
194f0 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
19500 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19520 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
19530 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
19540 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
19550 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
19560 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
19570 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
19580 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
19590 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
195a0 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
195b0 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
195c0 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
195d0 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
195e0 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
195f0 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
19600 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
19610 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
19620 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19630 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
19640 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
19650 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
19660 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19670 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
19680 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
19690 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20  t, u32 *pLen){. 
196a0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
196b0 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20  m->flags;.  u32 
196c0 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  n;..  assert( pL
196d0 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66  en!=0 );.  if( f
196e0 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
196f0 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a  .    *pLen = 0;.
19700 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19710 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
19720 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
19730 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
19740 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
19750 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
19760 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
19770 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
19780 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
19790 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
197a0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
197b0 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69  u64 u;.    if( i
197c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20  <0 ){.      u = 
197d0 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ~i;.    }else{. 
197e0 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20       u = i;.    
197f0 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  }.    if( u<=127
19800 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
19810 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66  &1)==i && file_f
19820 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20  ormat>=4 ){.    
19830 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20      *pLen = 0;. 
19840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b         return 8+
19850 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65  (u32)u;.      }e
19860 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  lse{.        *pL
19870 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
19880 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
19890 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
198a0 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65  u<=32767 ){ *pLe
198b0 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b  n = 2; return 2;
198c0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33   }.    if( u<=83
198d0 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  88607 ){ *pLen =
198e0 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a   3; return 3; }.
198f0 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
19900 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  83647 ){ *pLen =
19910 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a   4; return 4; }.
19920 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
19930 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  BYTE ){ *pLen = 
19940 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20  6; return 5; }. 
19950 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
19960 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
19970 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
19980 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65  Real ){.    *pLe
19990 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72  n = 8;.    retur
199a0 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
199b0 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  t( pMem->db->mal
199c0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61  locFailed || fla
199d0 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
199e0 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72  Blob) );.  asser
199f0 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b  t( pMem->n>=0 );
19a00 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d  .  n = (u32)pMem
19a10 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
19a20 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
19a30 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
19a40 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c  nZero;.  }.  *pL
19a50 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  en = n;.  return
19a60 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28   ((n*2) + 12 + (
19a70 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21  (flags&MEM_Str)!
19a80 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  =0));.}../*.** T
19a90 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72  he sizes for ser
19aa0 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74  ial types less t
19ab0 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69  han 128.*/.stati
19ac0 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74  c const u8 sqlit
19ad0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
19ae0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
19af0 2a 20 20 30 20 20 20 31 20 20 20 32 20 20 20 33  *  0   1   2   3
19b00 20 20 20 34 20 20 20 35 20 20 20 36 20 20 20 37     4   5   6   7
19b10 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f     8   9 */   ./
19b20 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20 31  *   0 */   0,  1
19b30 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 36  ,  2,  3,  4,  6
19b40 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30  ,  8,  8,  0,  0
19b50 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c  ,./*  10 */   0,
19b60 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c    0,  0,  0,  1,
19b70 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c    1,  2,  2,  3,
19b80 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20    3,./*  20 */  
19b90 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c 20   4,  4,  5,  5, 
19ba0 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c 20   6,  6,  7,  7, 
19bb0 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a   8,  8,./*  30 *
19bc0 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20 31  /   9,  9, 10, 1
19bd0 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20 31  0, 11, 11, 12, 1
19be0 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34  2, 13, 13,./*  4
19bf0 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31 35  0 */  14, 14, 15
19c00 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31 37  , 15, 16, 16, 17
19c10 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a  , 17, 18, 18,./*
19c20 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c    50 */  19, 19,
19c30 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c   20, 20, 21, 21,
19c40 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c   22, 22, 23, 23,
19c50 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c 20  ./*  60 */  24, 
19c60 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c 20  24, 25, 25, 26, 
19c70 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c 20  26, 27, 27, 28, 
19c80 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32  28,./*  70 */  2
19c90 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20 33  9, 29, 30, 30, 3
19ca0 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20 33  1, 31, 32, 32, 3
19cb0 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f  3, 33,./*  80 */
19cc0 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33 35    34, 34, 35, 35
19cd0 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33 37  , 36, 36, 37, 37
19ce0 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30  , 38, 38,./*  90
19cf0 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30 2c   */  39, 39, 40,
19d00 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c   40, 41, 41, 42,
19d10 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20   42, 43, 43,./* 
19d20 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20  100 */  44, 44, 
19d30 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c 20  45, 45, 46, 46, 
19d40 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a  47, 47, 48, 48,.
19d50 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20 34  /* 110 */  49, 4
19d60 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20 35  9, 50, 50, 51, 5
19d70 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20 35  1, 52, 52, 53, 5
19d80 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34  3,./* 120 */  54
19d90 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35 36  , 54, 55, 55, 56
19da0 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a  , 56, 57, 57.};.
19db0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19dc0 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
19dd0 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
19de0 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
19df0 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
19e00 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
19e10 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
19e20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
19e30 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
19e40 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20  ype>=128 ){.    
19e50 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
19e60 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
19e70 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
19e80 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a  serial_type<12 .
19e90 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
19ea0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
19eb0 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
19ec0 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ]==(serial_type 
19ed0 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20 72  - 12)/2 );.    r
19ee0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
19ef0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
19f00 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
19f10 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e  u8 sqlite3VdbeOn
19f20 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c  eByteSerialTypeL
19f30 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79 70  en(u8 serial_typ
19f40 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 65  e){.  assert( se
19f50 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b  rial_type<128 );
19f60 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
19f70 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
19f80 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a  serial_type];  .
19f90 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
19fa0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
19fb0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
19fc0 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
19fd0 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
19fe0 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
19ff0 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
1a000 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
1a010 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
1a020 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
1a030 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
1a040 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
1a050 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
1a060 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
1a070 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
1a080 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
1a090 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
1a0a0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
1a0b0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
1a0c0 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
1a0d0 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
1a0e0 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
1a0f0 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
1a100 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
1a110 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
1a120 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
1a130 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
1a140 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
1a150 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
1a160 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
1a170 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
1a180 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
1a190 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
1a1a0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
1a1b0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
1a1c0 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
1a1d0 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
1a1e0 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
1a1f0 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
1a200 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
1a210 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
1a220 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
1a230 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
1a240 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
1a250 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
1a260 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
1a270 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
1a280 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
1a290 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
1a2a0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
1a2b0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
1a2c0 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
1a2d0 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
1a2e0 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
1a2f0 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
1a300 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
1a310 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
1a320 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
1a330 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
1a340 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
1a350 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
1a360 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
1a370 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
1a380 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
1a390 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
1a3a0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
1a3b0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
1a3c0 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
1a3d0 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
1a3e0 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
1a3f0 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
1a400 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
1a410 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
1a420 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
1a430 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
1a440 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
1a450 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
1a460 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
1a470 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
1a480 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
1a490 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
1a4a0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
1a4b0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
1a4c0 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
1a4d0 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
1a4e0 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
1a4f0 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
1a500 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
1a510 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
1a520 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
1a530 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
1a540 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
1a550 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
1a560 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
1a570 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
1a580 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
1a590 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
1a5a0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
1a5b0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
1a5c0 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
1a5d0 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
1a5e0 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
1a5f0 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
1a600 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
1a610 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
1a620 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
1a630 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
1a640 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
1a650 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
1a660 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
1a670 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
1a680 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
1a690 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
1a6a0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
1a6b0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
1a6c0 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
1a6d0 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
1a6e0 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
1a6f0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
1a700 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
1a710 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
1a720 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
1a730 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
1a740 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
1a750 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
1a760 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
1a770 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
1a780 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
1a790 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
1a7a0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
1a7b0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
1a7c0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
1a7d0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
1a7e0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1a7f0 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
1a800 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
1a810 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
1a820 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63  in buf[].  The c
1a830 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1a840 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f  ible.** for allo
1a850 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70  cating enough sp
1a860 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20  ace to buf[] to 
1a870 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
1a880 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65  field, exclusive
1a890 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d  .** of the pMem-
1a8a0 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66  >u.nZero bytes f
1a8b0 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61  or a MEM_Zero va
1a8c0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lue..**.** Retur
1a8d0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a8e0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
1a8f0 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
1a900 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
1a910 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
1a920 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
1a930 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
1a940 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
1a950 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
1a960 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
1a970 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
1a980 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
1a990 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
1a9a0 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  *buf, Mem *pMem,
1a9b0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1a9c0 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  ){.  u32 len;.. 
1a9d0 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
1a9e0 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
1a9f0 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
1aa00 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
1aa10 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
1aa20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
1aa30 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
1aa40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
1aa50 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
1aa60 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20  (pMem->u.r) );. 
1aa70 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
1aa80 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65  &pMem->u.r, size
1aa90 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77  of(v));.      sw
1aaa0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
1aab0 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  at(v);.    }else
1aac0 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d  {.      v = pMem
1aad0 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  ->u.i;.    }.   
1aae0 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
1aaf0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
1ab00 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
1ab10 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
1ab20 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
1ab30 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28  buf[--i] = (u8)(
1ab40 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
1ab50 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69   >>= 8;.    }whi
1ab60 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74  le( i );.    ret
1ab70 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
1ab80 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
1ab90 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
1aba0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
1abb0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
1abc0 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
1abd0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
1abe0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
1ac00 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
1ac10 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
1ac20 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
1ac30 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
1ac40 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20      if( len>0 ) 
1ac50 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
1ac60 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72  ->z, len);.    r
1ac70 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
1ac80 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
1ac90 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
1aca0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1acb0 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20  /* Input "x" is 
1acc0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e  a sequence of un
1acd0 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72  signed character
1ace0 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  s that represent
1acf0 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e   a.** big-endian
1ad00 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72   integer.  Retur
1ad10 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
1ad20 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a   native integer.
1ad30 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42  */.#define ONE_B
1ad40 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28  YTE_INT(x)    ((
1ad50 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69  i8)(x)[0]).#defi
1ad60 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  ne TWO_BYTE_INT(
1ad70 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28  x)    (256*(i8)(
1ad80 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a  (x)[0])|(x)[1]).
1ad90 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59  #define THREE_BY
1ada0 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33  TE_INT(x)  (6553
1adb0 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
1adc0 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32  (x)[1]<<8)|(x)[2
1add0 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
1ade0 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28  BYTE_UINT(x)  ((
1adf0 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29  (u32)(x)[0]<<24)
1ae00 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
1ae10 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
1ae20 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
1ae30 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37  YTE_INT(x) (1677
1ae40 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  7216*(i8)((x)[0]
1ae50 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
1ae60 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
1ae70 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  ])../*.** Deseri
1ae80 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
1ae90 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
1aea0 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
1aeb0 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
1aec0 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
1aed0 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
1aee0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
1aef0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
1af00 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ad..**.** This f
1af10 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
1af20 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65  mented as two se
1af30 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20  parate routines 
1af40 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  for performance.
1af50 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65  .** The few case
1af60 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c  s that require l
1af70 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  ocal variables a
1af80 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  re broken out in
1af90 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a  to a separate.**
1afa0 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74   routine so that
1afb0 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74   in most cases t
1afc0 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d  he overhead of m
1afd0 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20  oving the stack 
1afe0 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76  pointer.** is av
1aff0 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69  oided..*/ .stati
1b000 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49  c u32 SQLITE_NOI
1b010 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28  NLINE serialGet(
1b020 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1b030 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
1b040 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
1b050 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
1b060 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
1b070 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
1b080 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
1b090 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
1b0a0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0c0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
1b0d0 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
1b0e0 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36   into */.){.  u6
1b0f0 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
1b100 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32  UINT(buf);.  u32
1b110 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1b120 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20  INT(buf+4);.  x 
1b130 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20  = (x<<32) + y;. 
1b140 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1b150 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ==6 ){.    /* EV
1b160 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38  IDENCE-OF: R-298
1b170 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69  51-52272 Value i
1b180 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36  s a big-endian 6
1b190 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f  4-bit.    ** two
1b1a0 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
1b1b0 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65  eger. */.    pMe
1b1c0 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
1b1d0 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  &x;.    pMem->fl
1b1e0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
1b1f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1b200 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65  m->u.i<0 );.  }e
1b210 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
1b220 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33  ENCE-OF: R-57343
1b230 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20  -49114 Value is 
1b240 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45  a big-endian IEE
1b250 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69  E 754-2008 64-bi
1b260 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e  t.    ** floatin
1b270 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20  g point number. 
1b280 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1b290 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
1b2a0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1b2b0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
1b2c0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
1b2d0 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
1b2e0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
1b2f0 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
1b300 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  me.    ** byte o
1b310 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
1b320 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
1b330 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
1b340 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66  AT is.    ** def
1b350 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
1b360 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
1b370 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
1b380 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65  e mixed.    ** e
1b390 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndian..    */.  
1b3a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1b3b0 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
1b3c0 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
1b3d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1b3e0 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
1b3f0 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31  .    u64 t2 = t1
1b400 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45  ;.    swapMixedE
1b410 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
1b420 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
1b430 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
1b440 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
1b450 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
1b460 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
1b470 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
1b480 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
1b490 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38  of(pMem->u.r)==8
1b4a0 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65   );.    swapMixe
1b4b0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b  dEndianFloat(x);
1b4c0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65  .    memcpy(&pMe
1b4d0 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65  m->u.r, &x, size
1b4e0 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d  of(x));.    pMem
1b4f0 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
1b500 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72  3IsNaN(pMem->u.r
1b510 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
1b520 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72  EM_Real;.  }.  r
1b530 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73  eturn 8;.}.u32 s
1b540 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b550 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
1b560 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
1b570 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
1b580 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
1b590 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
1b5a0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
1b5b0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
1b5c0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
1b5d0 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
1b5e0 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
1b5f0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
1b600 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
1b610 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
1b620 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
1b630 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
1b640 65 20 31 30 3a 20 7b 20 2f 2a 20 49 6e 74 65 72  e 10: { /* Inter
1b650 6e 61 6c 20 75 73 65 20 6f 6e 6c 79 3a 20 4e 55  nal use only: NU
1b660 4c 4c 20 77 69 74 68 20 76 69 72 74 75 61 6c 20  LL with virtual 
1b670 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  table.          
1b680 20 20 20 20 20 2a 2a 20 55 50 44 41 54 45 20 6e       ** UPDATE n
1b690 6f 2d 63 68 61 6e 67 65 20 66 6c 61 67 20 73 65  o-change flag se
1b6a0 74 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  t */.      pMem-
1b6b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
1b6c0 6c 7c 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 20 20  l|MEM_Zero;.    
1b6d0 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20    pMem->n = 0;. 
1b6e0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65       pMem->u.nZe
1b6f0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  ro = 0;.      br
1b700 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1b710 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
1b720 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
1b730 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
1b740 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a   0: {  /* Null *
1b750 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1b760 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d  NCE-OF: R-24078-
1b770 30 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61  09375 Value is a
1b780 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20   NULL. */.      
1b790 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1b7a0 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
1b7b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1b7c0 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f  ase 1: {.      /
1b7d0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1b7e0 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c  -44885-25196 Val
1b7f0 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74  ue is an 8-bit t
1b800 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20  wos-complement. 
1b810 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
1b820 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1b830 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49  u.i = ONE_BYTE_I
1b840 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
1b850 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1b860 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1b870 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1b880 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1b890 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
1b8a0 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
1b8b0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1b8c0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1b8d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37  IDENCE-OF: R-497
1b8e0 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69  94-35026 Value i
1b8f0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31  s a big-endian 1
1b900 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  6-bit.      ** t
1b910 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1b920 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1b930 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f   pMem->u.i = TWO
1b940 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1b950 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1b960 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1b970 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1b980 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1b990 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
1b9a0 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
1b9b0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
1b9c0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1b9d0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1b9e0 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20  : R-37839-54301 
1b9f0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1ba00 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20  ndian 24-bit.   
1ba10 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1ba20 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1ba30 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1ba40 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  i = THREE_BYTE_I
1ba50 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
1ba60 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1ba70 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
1ba80 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
1ba90 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1baa0 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 3;.    }.    c
1bab0 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
1bac0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1bad0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
1bae0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38  IDENCE-OF: R-018
1baf0 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69  49-26079 Value i
1bb00 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33  s a big-endian 3
1bb10 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  2-bit.      ** t
1bb20 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
1bb30 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
1bb40 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
1bb50 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  R_BYTE_INT(buf);
1bb60 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63 20  .#ifdef __HP_cc 
1bb70 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61  .      /* Work a
1bb80 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78 74  round a sign-ext
1bb90 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74 68  ension bug in th
1bba0 65 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f  e HP compiler fo
1bbb0 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20  r HP/UX */.     
1bbc0 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30   if( buf[0]&0x80
1bbd0 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20   ) pMem->u.i |= 
1bbe0 30 78 66 66 66 66 66 66 66 66 38 30 30 30 30 30  0xffffffff800000
1bbf0 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  00LL;.#endif.   
1bc00 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1bc10 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1bc20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1bc30 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1bc40 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20  eturn 4;.    }. 
1bc50 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
1bc60 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
1bc70 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1bc80 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1bc90 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c  -50385-09674 Val
1bca0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1bcb0 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20  an 48-bit.      
1bcc0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1bcd0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1bce0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1bcf0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1bd00 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29  buf+2) + (((i64)
1bd10 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1bd20 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
1bd30 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1bd40 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
1bd50 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1bd60 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
1bd70 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 6;.    }.   
1bd80 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d   case 6:   /* 8-
1bd90 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1bda0 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ger */.    case 
1bdb0 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f  7: { /* IEEE flo
1bdc0 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20  ating point */. 
1bdd0 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73       /* These us
1bde0 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  e local variable
1bdf0 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e  s, so do them in
1be00 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74   a separate rout
1be10 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ine.      ** to 
1be20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20  avoid having to 
1be30 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70  move the frame p
1be40 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f  ointer in the co
1be50 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20  mmon case */.   
1be60 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c     return serial
1be70 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74  Get(buf,serial_t
1be80 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d  ype,pMem);.    }
1be90 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20  .    case 8:    
1bea0 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a  /* Integer 0 */.
1beb0 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f      case 9: {  /
1bec0 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20  * Integer 1 */. 
1bed0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1bee0 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38  -OF: R-12976-228
1bef0 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20  93 Value is the 
1bf00 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20  integer 0. */.  
1bf10 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1bf20 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32  OF: R-18143-1212
1bf30 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  1 Value is the i
1bf40 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20  nteger 1. */.   
1bf50 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
1bf60 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
1bf70 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1bf80 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1bf90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1bfa0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
1bfb0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1bfc0 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31  E-OF: R-14606-31
1bfd0 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42  564 Value is a B
1bfe0 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31  LOB that is (N-1
1bff0 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20  2)/2 bytes in.  
1c000 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20      ** length.. 
1c010 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
1c020 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31  -OF: R-28401-001
1c030 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74  40 Value is a st
1c040 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74  ring in the text
1c050 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20   encoding and.  
1c060 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20      ** (N-13)/2 
1c070 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
1c080 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
1c090 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67   const u16 aFlag
1c0a0 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c  [] = { MEM_Blob|
1c0b0 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53  MEM_Ephem, MEM_S
1c0c0 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a  tr|MEM_Ephem };.
1c0d0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
1c0e0 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
1c0f0 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65     pMem->n = (se
1c100 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
1c110 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1c120 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61  gs = aFlag[seria
1c130 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20  l_type&1];.     
1c140 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b   return pMem->n;
1c150 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1c160 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54  urn 0;.}./*.** T
1c170 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1c180 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
1c190 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
1c1a0 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64   for an Unpacked
1c1b0 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74  Record.** struct
1c1c0 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ure large enough
1c1d0 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
1c1e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1c1f0 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a  rdUnpack() if.**
1c200 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1c210 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
1c220 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75   to KeyInfo stru
1c230 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a  cture pKeyInfo..
1c240 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20  **.** The space 
1c250 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61  is either alloca
1c260 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
1c270 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f  3DbMallocRaw() o
1c280 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a  r from within.**
1c290 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62   the unaligned b
1c2a0 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61  uffer passed via
1c2b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20   the second and 
1c2c0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20  third arguments 
1c2d0 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73  (presumably.** s
1c2e0 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20  tack space). If 
1c2f0 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e  the former, then
1c300 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
1c310 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61  to a pointer tha
1c320 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65  t should.** be e
1c330 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
1c340 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
1c350 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
1c360 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20  e(). Or, if the 
1c370 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  .** allocation c
1c380 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53  omes from the pS
1c390 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66  pace/szSpace buf
1c3a0 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20  fer, *ppFree is 
1c3b0 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62  set to NULL.** b
1c3c0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1c3d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
1c3e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
1c3f0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
1c400 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f  .*/.UnpackedReco
1c410 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41  rd *sqlite3VdbeA
1c420 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f  llocUnpackedReco
1c430 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  rd(.  KeyInfo *p
1c440 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 20 20  KeyInfo         
1c450 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70        /* Descrip
1c460 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f  tion of the reco
1c470 72 64 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  rd */.){.  Unpac
1c480 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
1c490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1c4a0 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
1c4b0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
1c4c0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1c4f0 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20  required for *p 
1c500 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  */.  nByte = ROU
1c510 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
1c520 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69  kedRecord)) + si
1c530 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49  zeof(Mem)*(pKeyI
1c540 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 31  nfo->nKeyField+1
1c550 29 3b 0a 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  );.  p = (Unpack
1c560 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74  edRecord *)sqlit
1c570 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b  e3DbMallocRaw(pK
1c580 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74  eyInfo->db, nByt
1c590 65 29 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72  e);.  if( !p ) r
1c5a0 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d  eturn 0;.  p->aM
1c5b0 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68  em = (Mem*)&((ch
1c5c0 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69  ar*)p)[ROUND8(si
1c5d0 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
1c5e0 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74  ord))];.  assert
1c5f0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1c600 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70  tOrder!=0 );.  p
1c610 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1c620 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65  yInfo;.  p->nFie
1c630 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
1c640 4b 65 79 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20  KeyField + 1;.  
1c650 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1c660 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65  ** Given the nKe
1c670 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20  y-byte encoding 
1c680 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70  of a record in p
1c690 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20  Key[], populate 
1c6a0 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64  the .** Unpacked
1c6b0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
1c6c0 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
1c6d0 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e  e fourth argumen
1c6e0 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f  t with the.** co
1c6f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65  ntents of the de
1c700 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f  coded record..*/
1c710 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64   .void sqlite3Vd
1c720 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a  beRecordUnpack(.
1c730 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1c740 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f  nfo,     /* Info
1c750 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
1c760 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20  e record format 
1c770 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20  */.  int nKey,  
1c780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c790 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72  ize of the binar
1c7a0 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  y record */.  co
1c7b0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1c7c0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61       /* The bina
1c7d0 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55  ry record */.  U
1c7e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1c7f0 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
1c800 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
1c810 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1c820 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  g. */.){.  const
1c830 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1c840 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
1c850 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1c860 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20  ey;.  int d; .  
1c870 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20  u32 idx;        
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c890 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65  /* Offset in aKe
1c8a0 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  y[] to read from
1c8b0 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20   */.  u16 u;    
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8d0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1c8e0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1c8f0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
1c900 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e   Mem *pMem = p->
1c910 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61  aMem;..  p->defa
1c920 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73  ult_rc = 0;.  as
1c930 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
1c940 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
1c950 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
1c960 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
1c970 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
1c980 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
1c990 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
1c9a0 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  & d<=nKey ){.   
1c9b0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1c9c0 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ;..    idx += ge
1c9d0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
1c9e0 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx], serial_typ
1c9f0 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  e);.    pMem->en
1ca00 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1ca10 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
1ca20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1ca30 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61      /* pMem->fla
1ca40 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74  gs = 0; // sqlit
1ca50 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1ca60 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20  ) will set this 
1ca70 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d  for us */.    pM
1ca80 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em->szMalloc = 0
1ca90 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  ;.    pMem->z = 
1caa0 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69  0;.    d += sqli
1cab0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1cac0 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61  (&aKey[d], seria
1cad0 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20  l_type, pMem);. 
1cae0 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69     pMem++;.    i
1caf0 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69  f( (++u)>=p->nFi
1cb00 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  eld ) break;.  }
1cb10 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b  .  assert( u<=pK
1cb20 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c  eyInfo->nKeyFiel
1cb30 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46  d + 1 );.  p->nF
1cb40 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66  ield = u;.}..#if
1cb50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1cb60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1cb70 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77  tion compares tw
1cb80 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  o index or table
1cb90 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20   record keys in 
1cba0 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20  the same way.** 
1cbb0 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  as the sqlite3Vd
1cbc0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1cbd0 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b  ) routine. Unlik
1cbe0 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
1cbf0 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66  are(),.** this f
1cc00 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
1cc10 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65  izes and compare
1cc20 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74  s values using t
1cc30 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  he.** sqlite3Vdb
1cc40 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64  eSerialGet() and
1cc50 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1cc60 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  re() functions. 
1cc70 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e  It is used.** in
1cc80 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1cc90 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
1cca0 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
1ccb0 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c  d code in.** sql
1ccc0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1ccd0 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20  mpare() returns 
1cce0 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65  results with the
1ccf0 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65  se two primitive
1cd00 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
1cd10 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75  true if the resu
1cd20 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
1cd30 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1cd40 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e  o desiredResult.
1cd50 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
1cd60 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
1cd70 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a  isagreement..*/.
1cd80 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
1cd90 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1cda0 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
1cdb0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1cdc0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1cdd0 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b  /.  const Unpack
1cde0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1cdf0 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a  , /* Right key *
1ce00 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52  /.  int desiredR
1ce10 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
1ce20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73    /* Correct ans
1ce30 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  wer */.){.  u32 
1ce40 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
1ce50 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
1ce60 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
1ce70 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
1ce80 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
1ce90 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1cea0 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1ceb0 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
1cec0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
1ced0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1cee0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
1cef0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
1cf00 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   0;.  int rc = 0
1cf10 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1cf20 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
1cf30 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1cf40 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
1cf50 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1cf60 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
1cf70 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
1cf80 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
1cf90 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1cfa0 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  db==0 ) return 1
1cfb0 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
1cfc0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1cfd0 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1cfe0 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d  fo->db;.  /* mem
1cff0 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f  1.flags = 0;  //
1d000 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   Will be initial
1d010 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  ized by sqlite3V
1d020 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a  dbeSerialGet() *
1d030 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  /.  VVA_ONLY( me
1d040 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
1d050 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
1d060 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
1d070 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f  atements */..  /
1d080 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20  * Compilers may 
1d090 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65  complain that me
1d0a0 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74  m1.u.i is potent
1d0b0 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69  ially uninitiali
1d0c0 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75  zed..  ** We cou
1d0d0 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  ld initialize it
1d0e0 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c  , as shown here,
1d0f0 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73   to silence thos
1d100 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20  e complaints..  
1d110 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20  ** But in fact, 
1d120 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65  mem1.u.i will ne
1d130 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20  ver actually be 
1d140 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a  used uninitializ
1d150 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20  ed, and doing . 
1d160 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73   ** the unnecess
1d170 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ary initializati
1d180 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61  on has a measura
1d190 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72  ble negative per
1d1a0 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d  formance.  ** im
1d1b0 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73  pact, since this
1d1c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65   routine is a ve
1d1d0 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20  ry high runner. 
1d1e0 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f   And so, we choo
1d1f0 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72  se.  ** to ignor
1d200 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  e the compiler w
1d210 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76  arnings and leav
1d220 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  e this variable 
1d230 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
1d240 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75   */.  /*  mem1.u
1d250 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20  .i = 0;  // not 
1d260 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20  needed, here to 
1d270 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72  silence compiler
1d280 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20   warning */.  . 
1d290 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1d2a0 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1d2b0 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31  1);.  if( szHdr1
1d2c0 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 20  >98307 ) return 
1d2d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
1d2e0 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
1d2f0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1d300 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50  o->nAllField>=pP
1d310 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20  Key2->nField || 
1d320 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1d330 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1d340 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1d350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
1d360 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64  yInfo->nKeyField
1d370 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1d380 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
1d390 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1d3a0 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
1d3b0 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f  al_type1;..    /
1d3c0 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
1d3d0 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
1d3e0 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
1d3f0 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
1d400 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69   idx1 += getVari
1d410 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31  nt32( aKey1+idx1
1d420 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29  , serial_type1 )
1d430 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
1d440 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65   that there is e
1d450 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20  nough key space 
1d460 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f  remaining to avo
1d470 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66  id.    ** a buff
1d480 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68  er overread.  Th
1d490 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  e "d1+serial_typ
1d4a0 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73  e1+2" subexpress
1d4b0 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ion will.    ** 
1d4c0 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65  always be greate
1d4d0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1d4e0 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  to the amount of
1d4f0 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70   required key sp
1d500 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20  ace..    ** Use 
1d510 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69  that approximati
1d520 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  on to avoid the 
1d530 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63  more expensive c
1d540 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
1d550 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1d560 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20  ypeLen() in the 
1d570 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20  common case..   
1d580 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73   */.    if( d1+s
1d590 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75  erial_type1+2>(u
1d5a0 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26  32)nKey1.     &&
1d5b0 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53   d1+sqlite3VdbeS
1d5c0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
1d5d0 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29  ial_type1)>(u32)
1d5e0 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20  nKey1 .    ){.  
1d5f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d600 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
1d610 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62   the values to b
1d620 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20  e compared..    
1d630 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  */.    d1 += sql
1d640 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1d650 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1d660 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d  rial_type1, &mem
1d670 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74  1);..    /* Do t
1d680 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20  he comparison.  
1d690 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1d6a0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1d6b0 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e  &mem1, &pPKey2->
1d6c0 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66  aMem[i], pKeyInf
1d6d0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20  o->aColl[i]);.  
1d6e0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1d6f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
1d700 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1d710 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
1d720 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
1d730 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1d740 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1d750 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1d760 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20    /* Invert the 
1d770 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20  result for DESC 
1d780 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
1d790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1d7a0 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e  o debugCompareEn
1d7b0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  d;.    }.    i++
1d7c0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
1d7d0 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
1d7e0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a  ey2->nField );..
1d7f0 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1d800 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1d810 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1d820 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1d830 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
1d840 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
1d850 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1d860 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1d870 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1d880 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1d890 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1d8a0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1d8b0 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61  &mem1)..  */.  a
1d8c0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1d8d0 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
1d8e0 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
1d8f0 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
1d900 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
1d910 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
1d920 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
1d930 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
1d940 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
1d950 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
1d960 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
1d970 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79   */.  rc = pPKey
1d980 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a  2->default_rc;..
1d990 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a  debugCompareEnd:
1d9a0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1d9b0 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30  sult==0 && rc==0
1d9c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1d9d0 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1d9e0 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74  <0 && rc<0 ) ret
1d9f0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1da00 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20  iredResult>0 && 
1da10 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc>0 ) return 1;
1da20 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
1da30 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  B ) return 1;.  
1da40 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
1da50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1da60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
1da70 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1da80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1da90 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  EBUG./*.** Count
1daa0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1dab0 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f  ields (a.k.a. co
1dac0 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65  lumns) in the re
1dad0 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a  cord given by.**
1dae0 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65   pKey,nKey.  The
1daf0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69   verify that thi
1db00 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20  s count is less 
1db10 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1db20 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69   the.** limit gi
1db30 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d  ven by pKeyInfo-
1db40 3e 6e 41 6c 6c 46 69 65 6c 64 2e 0a 2a 2a 0a 2a  >nAllField..**.*
1db50 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72  * If this constr
1db60 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69  aint is not sati
1db70 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20  sfied, it means 
1db80 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70  that the high-sp
1db90 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72  eed.** vdbeRecor
1dba0 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
1dbb0 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  d vdbeRecordComp
1dbc0 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74  areString() rout
1dbd0 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74  ines will.** not
1dbe0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
1dbf0 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74    If this assert
1dc00 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69  () ever fires, i
1dc10 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73  t probably means
1dc20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79  .** that the Key
1dc30 49 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 6f  Info.nKeyField o
1dc40 72 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69  r KeyInfo.nAllFi
1dc50 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20  eld values were 
1dc60 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f  computed.** inco
1dc70 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
1dc80 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65  ic void vdbeAsse
1dc90 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1dca0 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20  inLimits(.  int 
1dcb0 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64  nKey, const void
1dcc0 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
1dcd0 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66   record to verif
1dce0 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65  y */ .  const Ke
1dcf0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1dd00 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
1dd10 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20   size with this 
1dd20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20  KeyInfo */.){.  
1dd30 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a  int nField = 0;.
1dd40 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75    u32 szHdr;.  u
1dd50 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f  32 idx;.  u32 no
1dd60 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75  tUsed;.  const u
1dd70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1dd80 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1dd90 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b  gned char*)pKey;
1dda0 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ..  if( CORRUPT_
1ddb0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1ddc0 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1ddd0 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1dde0 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30   assert( nKey>=0
1ddf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
1de00 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29  Hdr<=(u32)nKey )
1de10 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1de20 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20  zHdr ){.    idx 
1de30 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61  += getVarint32(a
1de40 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64  Key+idx, notUsed
1de50 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b  );.    nField++;
1de60 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
1de70 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66  Field <= pKeyInf
1de80 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 3b 0a  o->nAllField );.
1de90 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1dea0 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1deb0 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1dec0 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a  s(A,B,C).#endif.
1ded0 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65  ./*.** Both *pMe
1dee0 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f  m1 and *pMem2 co
1def0 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c  ntain string val
1df00 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65  ues. Compare the
1df10 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75   two values.** u
1df20 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1df30 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
1df40 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74  l. As usual, ret
1df50 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c  urn a negative ,
1df60 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1df70 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70  tive value if *p
1df80 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1df90 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67  n, equal to or g
1dfa0 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20  reater than .** 
1dfb0 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69  *pMem2, respecti
1dfc0 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e  vely. Similar in
1dfd0 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d   spirit to "rc =
1dfe0 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d   (*pMem1) - (*pM
1dff0 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69  em2);"..*/.stati
1e000 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72  c int vdbeCompar
1e010 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f  eMemString(.  co
1e020 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a  nst Mem *pMem1,.
1e030 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1e040 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c  m2,.  const Coll
1e050 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38  Seq *pColl,.  u8
1e060 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20   *prcErr        
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e080 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72   If an OOM occur
1e090 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  s, set to SQLITE
1e0a0 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69  _NOMEM */.){.  i
1e0b0 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  f( pMem1->enc==p
1e0c0 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
1e0d0 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20   /* The strings 
1e0e0 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74  are already in t
1e0f0 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64  he correct encod
1e100 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20  ing.  Call the. 
1e110 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
1e120 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63  n function direc
1e130 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tly */.    retur
1e140 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  n pColl->xCmp(pC
1e150 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31  oll->pUser,pMem1
1e160 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65  ->n,pMem1->z,pMe
1e170 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b  m2->n,pMem2->z);
1e180 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1e190 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20  t rc;.    const 
1e1a0 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20  void *v1, *v2;. 
1e1b0 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d     Mem c1;.    M
1e1c0 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74  em c2;.    sqlit
1e1d0 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63  e3VdbeMemInit(&c
1e1e0 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45  1, pMem1->db, ME
1e1f0 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  M_Null);.    sql
1e200 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1e210 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c2, pMem1->db, 
1e220 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1e230 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
1e240 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d  llowCopy(&c1, pM
1e250 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em1, MEM_Ephem);
1e260 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e270 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1e280 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45  c2, pMem2, MEM_E
1e290 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20  phem);.    v1 = 
1e2a0 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1e2b0 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1e2c0 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c1, pColl->enc
1e2d0 29 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69  );.    v2 = sqli
1e2e0 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1e2f0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32  lite3_value*)&c2
1e300 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1e310 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c     if( (v1==0 ||
1e320 20 76 32 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20   v2==0) ){.     
1e330 20 69 66 28 20 70 72 63 45 72 72 20 29 20 2a 70   if( prcErr ) *p
1e340 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e  rcErr = SQLITE_N
1e350 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
1e360 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c   rc = 0;.    }el
1e370 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
1e380 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
1e390 2d 3e 70 55 73 65 72 2c 20 63 31 2e 6e 2c 20 76  ->pUser, c1.n, v
1e3a0 31 2c 20 63 32 2e 6e 2c 20 76 32 29 3b 0a 20 20  1, c2.n, v2);.  
1e3b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
1e3c0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1e3d0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
1e3e0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1e3f0 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  2);.    return r
1e400 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
1e410 54 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20  The input pBlob 
1e420 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1e430 20 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20   be a Blob that 
1e440 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a  is not marked.**
1e450 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20   with MEM_Zero. 
1e460 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1e470 69 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65  it could be a ze
1e480 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74  ro-blob..*/.stat
1e490 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f  ic int isAllZero
1e4a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
1e4b0 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  int n){.  int i;
1e4c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
1e4d0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
1e4e0 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  [i] ) return 0;.
1e4f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1e500 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1e510 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74   two blobs.  Ret
1e520 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1e530 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1e540 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  if the first.** 
1e550 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1e560 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1e570 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1e580 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  nd, respectively
1e590 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62  ..** If one blob
1e5a0 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1e5b0 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20  the other, then 
1e5c0 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74  the shorter is t
1e5d0 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 53 51  he lessor..*/.SQ
1e5e0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
1e5f0 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  t sqlite3BlobCom
1e600 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1e610 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  pB1, const Mem *
1e620 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20  pB2){.  int c;. 
1e630 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e   int n1 = pB1->n
1e640 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32  ;.  int n2 = pB2
1e650 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  ->n;..  /* It is
1e660 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76   possible to hav
1e670 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74  e a Blob value t
1e680 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e  hat has some non
1e690 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20  -zero content.  
1e6a0 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a  ** followed by z
1e6b0 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75  ero content.  Bu
1e6c0 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65  t that only come
1e6d0 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66  s up for Blobs f
1e6e0 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  ormed.  ** by th
1e6f0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1e700 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68  opcode, and such
1e710 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74   Blobs never get
1e720 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a   passed into.  *
1e730 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  * sqlite3MemComp
1e740 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  are(). */.  asse
1e750 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20  rt( (pB1->flags 
1e760 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
1e770 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73  | n1==0 );.  ass
1e780 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73  ert( (pB2->flags
1e790 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
1e7a0 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69  || n2==0 );..  i
1e7b0 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70  f( (pB1->flags|p
1e7c0 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d  B2->flags) & MEM
1e7d0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28  _Zero ){.    if(
1e7e0 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42   pB1->flags & pB
1e7f0 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  2->flags & MEM_Z
1e800 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ero ){.      ret
1e810 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f  urn pB1->u.nZero
1e820 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b   - pB2->u.nZero;
1e830 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1e840 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B1->flags & MEM_
1e850 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66  Zero ){.      if
1e860 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32  ( !isAllZero(pB2
1e870 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72  ->z, pB2->n) ) r
1e880 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1e890 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a  return pB1->u.nZ
1e8a0 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65  ero - n2;.    }e
1e8b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
1e8c0 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a  isAllZero(pB1->z
1e8d0 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75  , pB1->n) ) retu
1e8e0 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1e8f0 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e  urn n1 - pB2->u.
1e900 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  nZero;.    }.  }
1e910 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42  .  c = memcmp(pB
1e920 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31  1->z, pB2->z, n1
1e930 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a  >n2 ? n2 : n1);.
1e940 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e    if( c ) return
1e950 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20   c;.  return n1 
1e960 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  - n2;.}../*.** D
1e970 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  o a comparison b
1e980 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20  etween a 64-bit 
1e990 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61  signed integer a
1e9a0 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  nd a 64-bit floa
1e9b0 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75  ting-point.** nu
1e9c0 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65  mber.  Return ne
1e9d0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1e9e0 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1e9f0 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20   first (i64) is 
1ea00 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71  less than,.** eq
1ea10 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1ea20 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1ea30 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a  nd (double)..*/.
1ea40 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1ea50 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1ea60 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20  e(i64 i, double 
1ea70 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  r){.  if( sizeof
1ea80 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
1ea90 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44  )>8 ){.    LONGD
1eaa0 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28  OUBLE_TYPE x = (
1eab0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1eac0 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29  i;.    if( x<r )
1ead0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1eae0 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e  if( x>r ) return
1eaf0 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1eb00 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1eb10 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c  i64 y;.    doubl
1eb20 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d  e s;.    if( r<-
1eb30 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1eb40 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b  808.0 ) return +
1eb50 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 39 32  1;.    if( r>=92
1eb60 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
1eb70 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  8.0 ) return -1;
1eb80 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b  .    y = (i64)r;
1eb90 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72  .    if( i<y ) r
1eba0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1ebb0 28 20 69 3e 79 20 29 20 72 65 74 75 72 6e 20 2b  ( i>y ) return +
1ebc0 31 3b 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62  1;.    s = (doub
1ebd0 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c  le)i;.    if( s<
1ebe0 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1ebf0 20 20 20 69 66 28 20 73 3e 72 20 29 20 72 65 74     if( s>r ) ret
1ec00 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75  urn +1;.    retu
1ec10 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
1ec20 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76  ** Compare the v
1ec30 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  alues contained 
1ec40 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72  by the two memor
1ec50 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69  y cells, returni
1ec60 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20  ng.** negative, 
1ec70 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65  zero or positive
1ec80 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73   if pMem1 is les
1ec90 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1eca0 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20  , or greater.** 
1ecb0 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74  than pMem2. Sort
1ecc0 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c  ing order is NUL
1ecd0 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f  L's first, follo
1ece0 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28  wed by numbers (
1ecf0 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20  integers.** and 
1ed00 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75  reals) sorted nu
1ed10 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f  merically, follo
1ed20 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65  wed by text orde
1ed30 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61  red by the colla
1ed40 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
1ed50 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c   pColl and final
1ed60 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65  ly blob's ordere
1ed70 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a  d by memcmp()..*
1ed80 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61  *.** Two NULL va
1ed90 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1eda0 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69  red equal by thi
1edb0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
1edc0 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nt sqlite3MemCom
1edd0 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1ede0 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d  pMem1, const Mem
1edf0 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43   *pMem2, const C
1ee00 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
1ee10 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20    int f1, f2;.  
1ee20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  int combined_fla
1ee30 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d  gs;..  f1 = pMem
1ee40 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d  1->flags;.  f2 =
1ee50 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20   pMem2->flags;. 
1ee60 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20   combined_flags 
1ee70 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72  = f1|f2;.  asser
1ee80 74 28 20 21 73 71 6c 69 74 65 33 56 64 62 65 4d  t( !sqlite3VdbeM
1ee90 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65 6d 31  emIsRowSet(pMem1
1eea0 29 20 26 26 20 21 73 71 6c 69 74 65 33 56 64 62  ) && !sqlite3Vdb
1eeb0 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65  eMemIsRowSet(pMe
1eec0 6d 32 29 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66  m2) );. .  /* If
1eed0 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55   one value is NU
1eee0 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74  LL, it is less t
1eef0 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49  han the other. I
1ef00 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  f both values.  
1ef10 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74  ** are NULL, ret
1ef20 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
1ef30 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1ef40 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
1ef50 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f   return (f2&MEM_
1ef60 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f  Null) - (f1&MEM_
1ef70 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Null);.  }..  /*
1ef80 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   At least one of
1ef90 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20   the two values 
1efa0 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f  is a number.  */
1efb0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1efc0 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d  flags&(MEM_Int|M
1efd0 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20  EM_Real) ){.    
1efe0 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
1eff0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1f000 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1f010 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i < pMem2->u.i 
1f020 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1f030 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1f040 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i > pMem2->u.i )
1f050 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1f060 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1f070 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  }.    if( (f1 & 
1f080 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d  f2 & MEM_Real)!=
1f090 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1f0a0 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d  Mem1->u.r < pMem
1f0b0 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20  2->u.r ) return 
1f0c0 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  -1;.      if( pM
1f0d0 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32  em1->u.r > pMem2
1f0e0 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b  ->u.r ) return +
1f0f0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1f100 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1f110 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f1&MEM_Int)!=0
1f120 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
1f130 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  2&MEM_Real)!=0 )
1f140 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1f150 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1f160 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75  Compare(pMem1->u
1f170 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b  .i, pMem2->u.r);
1f180 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f190 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1f1a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f1b0 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52     if( (f1&MEM_R
1f1c0 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1f1d0 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74   if( (f2&MEM_Int
1f1e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1f1f0 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49  return -sqlite3I
1f200 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
1f210 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31  Mem2->u.i, pMem1
1f220 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
1f230 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
1f240 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
1f250 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1f260 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   +1;.  }..  /* I
1f270 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
1f280 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
1f290 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c  other is a blob,
1f2a0 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c   the string is l
1f2b0 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74  ess..  ** If bot
1f2c0 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63  h are strings, c
1f2d0 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65  ompare using the
1f2e0 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
1f2f0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1f300 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1f310 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
1f320 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72  f( (f1 & MEM_Str
1f330 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1f340 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f350 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f    if( (f2 & MEM_
1f360 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1f370 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1f380 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1f390 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32  Mem1->enc==pMem2
1f3a0 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e  ->enc || pMem1->
1f3b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f3c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1f3d0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1f3e0 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20  TE_UTF8 || .    
1f3f0 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65          pMem1->e
1f400 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
1f410 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63  LE || pMem1->enc
1f420 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
1f430 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   );..    /* The 
1f440 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1f450 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  ce must be defin
1f460 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1f470 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a  , even if.    **
1f480 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65   the user delete
1f490 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
1f4a0 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74  sequence after t
1f4b0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
1f4c0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  is.    ** compil
1f4d0 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74  ed (this was not
1f4e0 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
1f4f0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
1f500 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20  sert( !pColl || 
1f510 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a  pColl->xCmp );..
1f520 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
1f530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1f540 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1f550 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c  ng(pMem1, pMem2,
1f560 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   pColl, 0);.    
1f570 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55  }.    /* If a NU
1f580 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70  LL pointer was p
1f590 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c  assed as the col
1f5a0 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66  late function, f
1f5b0 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20  all through.    
1f5c0 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63  ** to the blob c
1f5d0 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63  ase and use memc
1f5e0 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a  mp().  */.  }. .
1f5f0 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73    /* Both values
1f600 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20   must be blobs. 
1f610 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d   Compare using m
1f620 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72  emcmp().  */.  r
1f630 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f  eturn sqlite3Blo
1f640 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20  bCompare(pMem1, 
1f650 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pMem2);.}.../*.*
1f660 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
1f670 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
1f680 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1f690 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68  a serial-type th
1f6a0 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  at.** correspond
1f6b0 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  s to an integer 
1f6c0 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74  - all values bet
1f6d0 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63  ween 1 and 9 inc
1f6e0 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70  lusive .** excep
1f6f0 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  t 7. The second 
1f700 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
1f710 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
1f720 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a   integer value.*
1f730 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63  * serialized acc
1f740 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c  ording to serial
1f750 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63  _type. This func
1f760 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65  tion deserialize
1f770 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73  s.** and returns
1f780 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73   the value..*/.s
1f790 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65  tatic i64 vdbeRe
1f7a0 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33  cordDecodeInt(u3
1f7b0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63  2 serial_type, c
1f7c0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a  onst u8 *aKey){.
1f7d0 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72    u32 y;.  asser
1f7e0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
1f7f0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31   (serial_type>=1
1f800 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c   && serial_type<
1f810 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =9 && serial_typ
1f820 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63  e!=7) );.  switc
1f830 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1f840 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20  {.    case 0:.  
1f850 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20    case 1:.      
1f860 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1f870 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1f880 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f  return ONE_BYTE_
1f890 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1f8a0 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73  ase 2:.      tes
1f8b0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1f8c0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1f8d0 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  urn TWO_BYTE_INT
1f8e0 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1f8f0 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   3:.      testca
1f900 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1f910 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1f920 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1f930 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1f940 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  4: {.      testc
1f950 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1f960 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46  0 );.      y = F
1f970 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1f980 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ey);.      retur
1f990 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  n (i64)*(int*)&y
1f9a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f9b0 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74   5: {.      test
1f9c0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1f9d0 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1f9e0 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  rn FOUR_BYTE_UIN
1f9f0 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
1fa00 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1fa10 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1fa20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
1fa30 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d   {.      u64 x =
1fa40 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1fa50 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1fa60 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1fa70 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d  x80 );.      x =
1fa80 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f   (x<<32) | FOUR_
1fa90 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34  BYTE_UINT(aKey+4
1faa0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1fab0 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a  (i64)*(i64*)&x;.
1fac0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1fad0 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
1fae0 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 8);.}../*.** 
1faf0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
1fb00 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
1fb10 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
1fb20 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70  ex records.** sp
1fb30 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79  ecified by {nKey
1fb40 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50  1, pKey1} and pP
1fb50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e  Key2.  It return
1fb60 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  s a negative, ze
1fb70 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
1fb80 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79  e integer if key
1fb90 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1fba0 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
1fbb0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79  greater than key
1fbc0 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20  2.  The {nKey1, 
1fbd0 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20  pKey1} key must 
1fbe0 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65  be a blob.** cre
1fbf0 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
1fc00 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1fc10 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
1fc20 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
1fc30 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
1fc40 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
1fc50 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
1fc60 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
1fc70 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
1fc80 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69  argument bSkip i
1fc90 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69  s non-zero, it i
1fca0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1fcb0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1fcc0 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69  ready.** determi
1fcd0 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
1fce0 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
1fcf0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1fd00 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20  .**.** Key1 and 
1fd10 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65  Key2 do not have
1fd20 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1fd30 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  same number of f
1fd40 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a  ields. If all .*
1fd50 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70  * fields that ap
1fd60 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79  pear in both key
1fd70 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
1fd80 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1fd90 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75  t_rc is .** retu
1fda0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  rned..**.** If d
1fdb0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1fdc0 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64  on is discovered
1fdd0 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72  , set pPKey2->er
1fde0 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c  rCode to .** SQL
1fdf0 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
1fe00 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20  return 0. If an 
1fe10 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
1fe20 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50  ountered, .** pP
1fe30 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73  Key2->errCode is
1fe40 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
1fe50 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20  OMEM and, if it 
1fe60 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1fe70 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65  .** malloc-faile
1fe80 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61  d flag set on da
1fe90 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70  tabase handle (p
1fea0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1feb0 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  >db)..*/.int sql
1fec0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1fed0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20  mpareWithSkip(. 
1fee0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1fef0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
1ff00 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1ff10 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1ff20 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20   *pPKey2,       
1ff30 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1ff40 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20  /.  int bSkip   
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff60 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1ff70 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66  skip the first f
1ff80 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  ield */.){.  u32
1ff90 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ffb0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1ffc0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
1ffd0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
1ffe0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20000 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69  Index of next fi
20010 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  eld to compare *
20020 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20040 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
20050 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20  ecord header in 
20060 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69  bytes */.  u32 i
20070 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dx1;            
20080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
20090 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79  fset of first ty
200a0 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  pe in header */.
200b0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
200e0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73  e */.  Mem *pRhs
200f0 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b   = pPKey2->aMem;
20100 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
20110 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74  ield of pPKey2 t
20120 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b  o compare */.  K
20130 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
20140 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
20150 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
20160 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
20170 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
20180 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a   Mem mem1;..  /*
20190 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75   If bSkip is tru
201a0 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  e, then the call
201b0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64  er has already d
201c0 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
201d0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77  he first.  ** tw
201e0 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
201f0 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
20200 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75  . Fix the variou
20210 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  s stack variable
20220 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  s so.  ** that t
20230 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69  his routine begi
20240 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20  ns comparing at 
20250 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64  the second field
20260 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70  . */.  if( bSkip
20270 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a   ){.    u32 s1;.
20280 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67      idx1 = 1 + g
20290 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
202a0 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73  1[1], s1);.    s
202b0 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d  zHdr1 = aKey1[0]
202c0 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
202d0 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53  1 + sqlite3VdbeS
202e0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29  erialTypeLen(s1)
202f0 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20  ;.    i = 1;.   
20300 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65   pRhs++;.  }else
20310 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74  {.    idx1 = get
20320 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
20330 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20  szHdr1);.    d1 
20340 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66  = szHdr1;.    if
20350 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e  ( d1>(unsigned)n
20360 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70  Key1 ){ .      p
20370 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
20380 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
20390 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
203a0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f  return 0;  /* Co
203b0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
203c0 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d  }.    i = 0;.  }
203d0 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  ..  VVA_ONLY( me
203e0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
203f0 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
20400 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
20410 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73  atements */.  as
20420 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
20430 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
20440 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
20450 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  d .       || COR
20460 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
20470 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
20480 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
20490 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
204a0 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
204b0 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20  fo->nKeyField>0 
204c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
204d0 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
204e0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
204f0 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
20500 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48  type;..    /* RH
20510 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  S is an integer 
20520 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  */.    if( pRhs-
20530 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
20540 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
20550 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
20560 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  x1];.      testc
20570 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
20580 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
20590 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
205a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
205b0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
205c0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
205d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
205e0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
205f0 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
20600 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
20610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
20620 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
20630 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
20640 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
20650 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e   rc = -sqlite3In
20660 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52  tFloatCompare(pR
20670 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e  hs->u.i, mem1.u.
20680 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
20690 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73  .        i64 lhs
206a0 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63   = vdbeRecordDec
206b0 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79  odeInt(serial_ty
206c0 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b  pe, &aKey1[d1]);
206d0 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73  .        i64 rhs
206e0 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20   = pRhs->u.i;.  
206f0 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68        if( lhs<rh
20700 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
20710 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
20720 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68  }else if( lhs>rh
20730 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
20740 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
20750 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
20760 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72  .    /* RHS is r
20770 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  eal */.    else 
20780 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
20790 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
207a0 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
207b0 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
207c0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
207d0 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
207e0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
207f0 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65  pes 12 or greate
20800 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e  r are strings an
20810 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72  d blobs (greater
20820 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a   than.        **
20830 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73   numbers). Types
20840 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63   10 and 11 are c
20850 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76  urrently "reserv
20860 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20  ed for future . 
20870 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20         ** use", 
20880 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65  so it doesn't re
20890 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74  ally matter what
208a0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
208b0 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20  comparing.      
208c0 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d    ** them to num
208d0 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65  beric values are
208e0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  .  */.        rc
208f0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
20900 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
20910 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
20920 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
20930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
20940 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
20950 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
20960 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
20970 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m1);.        if(
20980 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
20990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
209a0 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e   mem1.u.r<pRhs->
209b0 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
209c0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
209d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
209e0 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75  mem1.u.r>pRhs->u
209f0 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
20a00 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
20a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20a20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20a30 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46  rc = sqlite3IntF
20a40 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31  loatCompare(mem1
20a50 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29  .u.i, pRhs->u.r)
20a60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20a70 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
20a80 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e  * RHS is a strin
20a90 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  g */.    else if
20aa0 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
20ab0 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
20ac0 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
20ad0 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
20ae0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
20af0 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
20b00 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
20b10 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
20b20 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e<12 ){.        
20b30 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
20b40 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61  else if( !(seria
20b50 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
20b60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
20b70 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
20b80 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d          mem1.n =
20b90 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
20ba0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
20bb0 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
20bc0 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65  em1.n)==(unsigne
20bd0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
20be0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
20bf0 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73  +mem1.n+1)==(uns
20c00 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
20c10 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d         if( (d1+m
20c20 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e  em1.n) > (unsign
20c30 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
20c40 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
20c50 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
20c60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20c70 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
20c80 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
20c90 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
20ca0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
20cb0 73 65 20 69 66 28 20 28 70 4b 65 79 49 6e 66 6f  se if( (pKeyInfo
20cc0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
20cd0 6e 66 6f 29 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  nfo)->aColl[i] )
20ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
20cf0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
20d00 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
20d10 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
20d20 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
20d30 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
20d40 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
20d50 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
20d60 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
20d70 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
20d80 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
20d90 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g(.             
20da0 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b   &mem1, pRhs, pK
20db0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
20dc0 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  , &pPKey2->errCo
20dd0 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  de.          );.
20de0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20df0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
20e00 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20  p = MIN(mem1.n, 
20e10 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
20e20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
20e30 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
20e40 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
20e50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
20e60 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20  ) rc = mem1.n - 
20e70 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20  pRhs->n; .      
20e80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20e90 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
20ea0 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65   a blob */.    e
20eb0 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
20ec0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
20ed0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20ee0 28 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d  (pRhs->flags & M
20ef0 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70  EM_Zero)==0 || p
20f00 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  Rhs->n==0 );.   
20f10 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
20f20 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
20f30 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
20f40 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
20f50 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
20f60 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
20f70 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61  ype<12 || (seria
20f80 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
20f90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
20fa0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
20fb0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72          int nStr
20fc0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
20fd0 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
20fe0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
20ff0 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65  +nStr)==(unsigne
21000 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
21010 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
21020 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67  +nStr+1)==(unsig
21030 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
21040 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74       if( (d1+nSt
21050 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  r) > (unsigned)n
21060 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
21070 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
21080 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
21090 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
210a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210c0 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
210d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
210e0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
210f0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
21100 20 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c         if( !isAl
21110 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63 68 61  lZero((const cha
21120 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53  r*)&aKey1[d1],nS
21130 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tr) ){.         
21140 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
21150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21160 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 53 74          rc = nSt
21170 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72  r - pRhs->u.nZer
21180 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
21190 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
211a0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
211b0 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68   = MIN(nStr, pRh
211c0 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
211d0 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
211e0 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
211f0 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
21200 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
21210 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
21220 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  >n;.        }.  
21230 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21240 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20   /* RHS is null 
21250 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  */.    else{.   
21260 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
21270 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
21280 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c      rc = (serial
21290 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d  _type!=0);.    }
212a0 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ..    if( rc!=0 
212b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 4b  ){.      if( pPK
212c0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ey2->pKeyInfo->a
212d0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
212e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
212f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21300 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
21310 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
21320 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
21330 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20  ey2, rc) );.    
21340 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
21350 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
21360 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
21370 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  low */.      ret
21380 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
21390 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20     i++;.    if( 
213a0 69 3d 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  i==pPKey2->nFiel
213b0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  d ) break;.    p
213c0 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d  Rhs++;.    d1 +=
213d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
213e0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
213f0 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31  _type);.    idx1
21400 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
21410 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
21420 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  );.  }while( idx
21430 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64  1<(unsigned)szHd
21440 72 31 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67  r1 && d1<=(unsig
21450 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20  ned)nKey1 );..  
21460 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
21470 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
21480 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
21490 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
214a0 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
214b0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
214c0 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
214d0 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
214e0 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
214f0 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
21500 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
21510 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
21520 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  em1).  */.  asse
21530 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
21540 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
21550 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
21560 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20  hat one or both 
21570 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
21580 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
21590 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
215a0 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
215b0 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
215c0 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
215d0 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
215e0 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  lue.  */.  asser
215f0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20  t( CORRUPT_DB . 
21600 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63        || vdbeRec
21610 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
21620 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
21630 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65  Key2, pPKey2->de
21640 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20  fault_rc) .     
21650 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65    || pPKey2->pKe
21660 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
21670 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70  cFailed.  );.  p
21680 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20  PKey2->eqSeen = 
21690 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65  1;.  return pPKe
216a0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
216b0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
216c0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
216d0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
216e0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
216f0 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
21700 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
21710 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
21720 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
21730 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  */.){.  return s
21740 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
21750 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
21760 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
21770 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  Key2, 0);.}.../*
21780 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
21790 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
217a0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
217b0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
217c0 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
217d0 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
217e0 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
217f0 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e  s an integer, an
21800 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69  d (b) the .** si
21810 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
21820 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  int at the start
21830 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
21840 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
21850 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e  le.** byte (i.e.
21860 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32   is less than 12
21870 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  8)..**.** To avo
21880 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75  id concerns abou
21890 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  t buffer overrea
218a0 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ds, this routine
218b0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a   is only used.**
218c0 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72   on schemas wher
218d0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  e the maximum va
218e0 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20  lid header size 
218f0 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c  is 63 bytes or l
21900 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
21910 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
21920 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e  pareInt(.  int n
21930 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
21940 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
21950 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
21960 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
21970 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
21980 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
21990 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28  st u8 *aKey = &(
219a0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
219b0 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  )[*(const u8*)pK
219c0 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69  ey1 & 0x3F];.  i
219d0 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  nt serial_type =
219e0 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65   ((const u8*)pKe
219f0 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65  y1)[1];.  int re
21a00 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36  s;.  u32 y;.  u6
21a10 34 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20  4 x;.  i64 v;.  
21a20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65  i64 lhs;..  vdbe
21a30 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
21a40 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
21a50 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
21a60 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
21a70 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70  assert( (*(u8*)p
21a80 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43  Key1)<=0x3F || C
21a90 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73  ORRUPT_DB );.  s
21aa0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
21ab0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
21ac0 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
21ad0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
21ae0 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f        lhs = ONE_
21af0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
21b00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21b10 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
21b20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
21b30 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
21b40 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
21b50 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
21b60 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  = TWO_BYTE_INT(a
21b70 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
21b80 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
21b90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21ba0 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
21bb0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
21bc0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
21bd0 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59    lhs = THREE_BY
21be0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
21bf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
21c00 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
21c10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
21c20 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
21c30 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
21c40 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   */.      y = FO
21c50 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
21c60 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  y);.      lhs = 
21c70 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
21c80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21c90 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
21ca0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
21cb0 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
21cc0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
21cd0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
21ce0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
21cf0 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
21d00 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
21d10 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
21d20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
21d30 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
21d40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
21d50 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74  se 6: { /* 8-byt
21d60 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
21d70 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f   */.      x = FO
21d80 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
21d90 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  y);.      x = (x
21da0 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
21db0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
21dc0 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36        lhs = *(i6
21dd0 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73  4*)&x;.      tes
21de0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
21df0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21e00 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a   }.    case 8: .
21e10 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20        lhs = 0;. 
21e20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21e30 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68  case 9:.      lh
21e40 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  s = 1;.      bre
21e50 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ak;..    /* This
21e60 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72   case could be r
21e70 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63  emoved without c
21e80 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75  hanging the resu
21e90 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20  lts of running. 
21ea0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e     ** this code.
21eb0 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61   Including it ca
21ec0 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65  uses gcc to gene
21ed0 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77  rate a faster sw
21ee0 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61  itch .    ** sta
21ef0 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68  tement (since th
21f00 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63  e range of switc
21f10 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74  h targets now st
21f20 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64  arts at zero and
21f30 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69  .    ** is conti
21f40 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20  guous) but does 
21f50 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75  not cause any du
21f60 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20  plicate code to 
21f70 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20  be generated.   
21f80 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63   ** (as gcc is c
21f90 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20  lever enough to 
21fa0 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20  combine the two 
21fb0 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68  like cases). Oth
21fc0 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69  er .    ** compi
21fd0 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69  lers might be si
21fe0 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20  milar.  */ .    
21ff0 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a  case 0: case 7:.
22000 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
22010 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
22020 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65  mpare(nKey1, pKe
22030 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20  y1, pPKey2);..  
22040 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
22050 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
22060 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
22070 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
22080 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76  PKey2);.  }..  v
22090 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   = pPKey2->aMem[
220a0 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e  0].u.i;.  if( v>
220b0 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  lhs ){.    res =
220c0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d   pPKey2->r1;.  }
220d0 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29  else if( v<lhs )
220e0 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
220f0 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20  y2->r2;.  }else 
22100 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
22110 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ld>1 ){.    /* T
22120 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
22130 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
22140 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61  are equal. Compa
22150 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20  re the trailing 
22160 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
22170 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71   */.    res = sq
22180 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
22190 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
221a0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
221b0 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  ey2, 1);.  }else
221c0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
221d0 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
221e0 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71   two keys are eq
221f0 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72  ual and there ar
22200 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20  e no trailing.  
22210 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74    ** fields. Ret
22220 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
22230 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63  ult_rc in this c
22240 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20  ase. */.    res 
22250 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
22260 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32  t_rc;.    pPKey2
22270 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
22280 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
22290 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
222a0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
222b0 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29  , pPKey2, res) )
222c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
222d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
222e0 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74  nction is an opt
222f0 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  imized version o
22300 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  f sqlite3VdbeRec
22310 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a  ordCompare() .**
22320 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69   that (a) the fi
22330 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  rst field of pPK
22340 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c  ey2 is a string,
22350 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69   that (b) the fi
22360 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65  rst field.** use
22370 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
22380 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20  sequence BINARY 
22390 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65  and (c) that the
223a0 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
223b0 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68  varint .** at th
223c0 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
223d0 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
223e0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a   a single byte..
223f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
22400 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
22410 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65  tring(.  int nKe
22420 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
22430 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
22440 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
22450 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
22460 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
22470 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
22480 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f   u8 *aKey1 = (co
22490 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20  nst u8*)pKey1;. 
224a0 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
224b0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
224c0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
224d0 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20  aMem[0].flags & 
224e0 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62  MEM_Str );.  vdb
224f0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
22500 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b  tWithinLimits(nK
22510 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
22520 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  y2->pKeyInfo);. 
22530 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
22540 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74  ey1[1], serial_t
22550 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69  ype);.  if( seri
22560 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20  al_type<12 ){.  
22570 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
22580 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65  r1;      /* (pKe
22590 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e  y1/nKey1) is a n
225a0 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20  umber or a null 
225b0 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  */.  }else if( !
225c0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
225d0 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73  x01) ){ .    res
225e0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20   = pPKey2->r2;  
225f0 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
22600 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a  ey1) is a blob *
22610 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  /.  }else{.    i
22620 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74  nt nCmp;.    int
22630 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73   nStr;.    int s
22640 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  zHdr = aKey1[0];
22650 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65  ..    nStr = (se
22660 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20  rial_type-12) / 
22670 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64  2;.    if( (szHd
22680 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79  r + nStr) > nKey
22690 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79  1 ){.      pPKey
226a0 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
226b0 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
226c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
226d0 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72  rn 0;    /* Corr
226e0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
226f0 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20      nCmp = MIN( 
22700 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
22710 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72  n, nStr );.    r
22720 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  es = memcmp(&aKe
22730 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79  y1[szHdr], pPKey
22740 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43  2->aMem[0].z, nC
22750 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65  mp);..    if( re
22760 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  s==0 ){.      re
22770 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79  s = nStr - pPKey
22780 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20  2->aMem[0].n;.  
22790 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
227a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
227b0 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29  Key2->nField>1 )
227c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
227d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
227e0 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
227f0 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
22800 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20   pPKey2, 1);.   
22810 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22820 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
22830 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
22840 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
22850 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
22860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
22870 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
22880 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
22890 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20  PKey2->r2;.     
228a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
228b0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
228c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
228d0 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
228e0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
228f0 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c  ey2->r2;.    }el
22900 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  se{.      res = 
22910 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20  pPKey2->r1;.    
22920 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
22930 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
22940 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
22950 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65  Key1, pPKey2, re
22960 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  s).       || COR
22970 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c  RUPT_DB.       |
22980 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  | pPKey2->pKeyIn
22990 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
229a0 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75  iled.  );.  retu
229b0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
229c0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
229d0 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56  r to an sqlite3V
229e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
229f0 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75  () compatible fu
22a00 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62  nction.** suitab
22a10 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  le for comparing
22a20 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f   serialized reco
22a30 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63  rds to the unpac
22a40 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65  ked record passe
22a50 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79  d.** as the only
22a60 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65   argument..*/.Re
22a70 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69  cordCompare sqli
22a80 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
22a90 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  re(UnpackedRecor
22aa0 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69  d *p){.  /* vari
22ab0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
22ac0 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52  nt() and varintR
22ad0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
22ae0 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65  ng() both assume
22af0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73  .  ** that the s
22b00 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
22b10 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73  rint that occurs
22b20 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
22b30 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a   each record.  *
22b40 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  * fits in a sing
22b50 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73  le byte (i.e. is
22b60 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76   127 or less). v
22b70 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
22b80 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73  reInt().  ** als
22b90 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  o assumes that i
22ba0 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65  t is safe to ove
22bb0 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62  rread a buffer b
22bc0 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a  y at least the .
22bd0 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73    ** maximum pos
22be0 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64  sible legal head
22bf0 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62  er size plus 8 b
22c00 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68  ytes. Because th
22c10 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72  ere is.  ** guar
22c20 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20  anteed to be at 
22c30 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f  least 74 (but no
22c40 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20  t 136) bytes of 
22c50 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e  padding followin
22c60 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66  g each.  ** buff
22c70 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72  er passed to var
22c80 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
22c90 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73  Int() this makes
22ca0 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   it convenient t
22cb0 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65  o.  ** limit the
22cc0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
22cd0 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20  der to 64 bytes 
22ce0 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74  in cases where t
22cf0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20  he first field. 
22d00 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65   ** is an intege
22d10 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
22d20 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
22d30 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d  enforce this lim
22d40 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65  it is to conside
22d50 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77  r only records w
22d60 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c  ith.  ** 13 fiel
22d70 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74  ds or less. If t
22d80 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69  he first field i
22d90 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68  s an integer, th
22da0 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a  e maximum legal.
22db0 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65    ** header size
22dc0 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20   is (12*5 + 1 + 
22dd0 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20  1) bytes.  */.  
22de0 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  if( p->pKeyInfo-
22df0 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d 31 33 20 29  >nAllField<=13 )
22e00 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
22e10 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61  = p->aMem[0].fla
22e20 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  gs;.    if( p->p
22e30 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
22e40 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  der[0] ){.      
22e50 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->r1 = 1;.     
22e60 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20   p->r2 = -1;.   
22e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
22e80 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  >r1 = -1;.      
22e90 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d  p->r2 = 1;.    }
22ea0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
22eb0 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20  & MEM_Int) ){.  
22ec0 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
22ed0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b  ecordCompareInt;
22ee0 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
22ef0 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
22f00 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Real );.    tes
22f10 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
22f20 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74  EM_Null );.    t
22f30 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
22f40 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
22f50 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d   if( (flags & (M
22f60 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c  EM_Real|MEM_Null
22f70 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26  |MEM_Blob))==0 &
22f80 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  & p->pKeyInfo->a
22f90 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  Coll[0]==0 ){.  
22fa0 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
22fb0 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20  s & MEM_Str );. 
22fc0 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
22fd0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
22fe0 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ing;.    }.  }..
22ff0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
23000 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
23010 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  e;.}../*.** pCur
23020 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
23030 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
23040 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
23050 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
23060 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
23070 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
23080 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
23090 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
230a0 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
230b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
230c0 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
230d0 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
230e0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
230f0 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74  **.** pCur might
23100 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
23110 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72  text obtained fr
23120 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  om a corrupt dat
23130 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53  abase file..** S
23140 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61  o the content ca
23150 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
23160 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65    Do appropriate
23170 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63   checks on the c
23180 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ontent..*/.int s
23190 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
231a0 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
231b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
231c0 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
231d0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
231e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
231f0 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
23200 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
23210 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
23220 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
23230 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
23240 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
23250 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
23260 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
23270 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
23280 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  v;..  /* Get the
23290 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
232a0 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
232b0 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
232c0 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
232d0 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
232e0 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
232f0 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
23300 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
23310 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
23320 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
23330 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
23340 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
23350 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
23360 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
23370 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
23380 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
23390 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
233a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
233b0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
233c0 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c  pCur) );.  nCell
233d0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
233e0 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
233f0 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ur);.  assert( (
23400 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
23410 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
23420 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
23430 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
23440 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
23450 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
23460 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ry */.  sqlite3V
23470 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
23480 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
23490 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
234a0 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
234b0 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d  u32)nCellKey, &m
234c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
234d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
234e0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
234f0 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
23500 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
23510 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
23520 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
23530 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
23540 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
23550 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
23560 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
23570 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
23580 64 72 3e 30 78 37 66 66 66 66 66 66 66 20 29 3b  dr>0x7fffffff );
23590 0a 20 20 61 73 73 65 72 74 28 20 6d 2e 6e 3e 3d  .  assert( m.n>=
235a0 30 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  0 );.  if( unlik
235b0 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 73  ely(szHdr<3 || s
235c0 7a 48 64 72 3e 28 75 6e 73 69 67 6e 65 64 29 6d  zHdr>(unsigned)m
235d0 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  .n) ){.    goto 
235e0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
235f0 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
23600 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f  The last field o
23610 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75  f the index shou
23620 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
23630 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20   - the ROWID..  
23640 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
23650 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65  he last entry re
23660 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67  ally is an integ
23670 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  er. */.  (void)g
23680 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
23690 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74  &m.z[szHdr-1], t
236a0 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
236b0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
236c0 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==1 );.  testcas
236d0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20  e( typeRowid==2 
236e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
236f0 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20  ypeRowid==3 );. 
23700 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
23710 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73  owid==4 );.  tes
23720 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
23730 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==5 );.  testcas
23740 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20  e( typeRowid==6 
23750 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
23760 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20  ypeRowid==8 );. 
23770 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
23780 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28  owid==9 );.  if(
23790 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f   unlikely(typeRo
237a0 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77  wid<1 || typeRow
237b0 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69  id>9 || typeRowi
237c0 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74  d==7) ){.    got
237d0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
237e0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65  uption;.  }.  le
237f0 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
23800 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74  SmallTypeSizes[t
23810 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73  ypeRowid];.  tes
23820 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
23830 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
23840 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
23850 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
23860 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
23870 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
23880 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
23890 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
238a0 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
238b0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
238c0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
238d0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
238e0 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
238f0 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
23900 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
23910 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
23920 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
23930 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
23940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
23950 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
23960 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
23970 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
23980 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
23990 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
239a0 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
239b0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
239c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
239d0 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
239e0 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
239f0 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63  case( m.szMalloc
23a00 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
23a10 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
23a20 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
23a30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
23a50 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
23a60 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
23a70 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
23a80 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
23a90 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
23aa0 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
23ab0 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
23ac0 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
23ad0 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
23ae0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
23af0 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
23b00 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
23b10 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
23b20 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
23b30 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
23b40 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
23b50 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
23b60 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
23b70 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
23b80 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
23b90 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
23ba0 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
23bb0 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
23bc0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
23bd0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
23be0 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
23bf0 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
23c00 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
23c10 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
23c20 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
23c30 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
23c40 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
23c50 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
23c60 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
23c70 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
23c80 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c  eyCompare(.  sql
23c90 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23cb0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
23cc0 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75  tion */.  VdbeCu
23cd0 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
23ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23cf0 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
23d00 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
23d10 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
23d20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20  *pUnpacked,     
23d30 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
23d40 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a  rsion of key */.
23d50 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d70 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
23d80 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
23d90 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
23da0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
23db0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
23dc0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d  ursor *pCur;.  M
23dd0 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
23de0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43   pC->eCurType==C
23df0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
23e00 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e    pCur = pC->uc.
23e10 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72  pCursor;.  asser
23e20 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
23e30 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
23e40 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79  r) );.  nCellKey
23e50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
23e60 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
23e70 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  ;.  /* nCellKey 
23e80 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
23e90 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
23ea0 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
23eb0 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
23ec0 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
23ed0 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
23ee0 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
23ef0 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
23f00 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
23f10 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
23f20 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
23f30 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
23f40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23f50 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
23f60 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
23f70 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
23f80 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
23f90 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
23fa0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
23fb0 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a  )nCellKey, &m);.
23fc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23fd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
23fe0 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
23ff0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
24000 57 69 74 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e  WithSkip(m.n, m.
24010 7a 2c 20 70 55 6e 70 61 63 6b 65 64 2c 20 30 29  z, pUnpacked, 0)
24020 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
24030 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
24040 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24050 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
24060 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
24070 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
24080 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
24090 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
240a0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
240b0 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
240c0 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
240d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
240e0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
240f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
24100 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
24110 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
24120 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
24130 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
24140 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
24150 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
24160 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
24170 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
24180 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
24190 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
241a0 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
241b0 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
241c0 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
241d0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
241e0 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
241f0 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
24200 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
24210 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
24220 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
24230 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
24240 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
24250 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
24260 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
24270 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
24280 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
24290 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
242a0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
242b0 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
242c0 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
242d0 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
242e0 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
242f0 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
24300 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
24310 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
24320 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
24330 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
24340 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
24350 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
24360 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
24370 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
24380 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
24390 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
243a0 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
243b0 2a 0a 2a 2a 20 49 66 20 69 43 6f 64 65 20 69 73  *.** If iCode is
243c0 20 31 2c 20 74 68 65 6e 20 65 78 70 69 72 61 74   1, then expirat
243d0 69 6f 6e 20 69 73 20 61 64 76 69 73 6f 72 79 2e  ion is advisory.
243e0 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
243f0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70  should.** be rep
24400 72 65 70 61 72 65 64 20 62 65 66 6f 72 65 20 62  repared before b
24410 65 69 6e 67 20 72 65 73 74 61 72 74 65 64 2c 20  eing restarted, 
24420 62 75 74 20 69 66 20 69 74 20 69 73 20 61 6c 72  but if it is alr
24430 65 61 64 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20  eady running.** 
24440 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  it is allowed to
24450 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
24460 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e  on..**.** Intern
24470 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
24480 69 6f 6e 20 6a 75 73 74 20 73 65 74 73 20 74 68  ion just sets th
24490 65 20 56 64 62 65 2e 65 78 70 69 72 65 64 20 66  e Vdbe.expired f
244a0 6c 61 67 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72  lag on all.** pr
244b0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
244c0 73 2e 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  s.  The flag is 
244d0 73 65 74 20 74 6f 20 31 20 66 6f 72 20 61 6e 20  set to 1 for an 
244e0 69 6d 6d 65 64 69 61 74 65 20 65 78 70 69 72 61  immediate expira
244f0 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20  tion.** and set 
24500 74 6f 20 32 20 66 6f 72 20 61 6e 20 61 64 76 69  to 2 for an advi
24510 73 6f 72 79 20 65 78 70 69 72 61 74 69 6f 6e 2e  sory expiration.
24520 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24530 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
24540 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
24550 20 2a 64 62 2c 20 69 6e 74 20 69 43 6f 64 65 29   *db, int iCode)
24560 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
24570 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
24580 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
24590 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
245a0 20 3d 20 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a   = iCode+1;.  }.
245b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
245c0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
245d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
245e0 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
245f0 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
24600 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
24610 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
24620 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53  .** Return the S
24630 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20 66 6c  QLITE_PREPARE fl
24640 61 67 73 20 66 6f 72 20 61 20 56 64 62 65 2e 0a  ags for a Vdbe..
24650 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62  */.u8 sqlite3Vdb
24660 65 50 72 65 70 61 72 65 46 6c 61 67 73 28 56 64  ePrepareFlags(Vd
24670 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
24680 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d   v->prepFlags;.}
24690 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
246a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
246b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
246c0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
246d0 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
246e0 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
246f0 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
24700 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
24710 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
24720 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
24730 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
24740 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
24750 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
24760 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
24770 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
24780 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
24790 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
247a0 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
247b0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
247c0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
247d0 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
247e0 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
247f0 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
24800 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
24810 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
24820 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
24830 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
24840 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
24850 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
24860 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
24870 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
24880 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62    assert( (v->db
24890 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
248a0 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20  _EnableQPSG)==0 
248b0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  );.    if( 0==(p
248c0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
248d0 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
248e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
248f0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
24900 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
24910 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
24920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
24930 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
24940 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
24950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
24960 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
24970 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
24980 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
24990 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
249a0 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
249b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
249c0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
249d0 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
249e0 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
249f0 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
24a00 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
24a10 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
24a20 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
24a30 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
24a40 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
24a50 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
24a60 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
24a70 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
24a80 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
24a90 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
24aa0 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
24ab0 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64  .  assert( (v->d
24ac0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
24ad0 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30  E_EnableQPSG)==0
24ae0 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 3d   );.  if( iVar>=
24af0 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70  32 ){.    v->exp
24b00 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30 30 30  mask |= 0x800000
24b10 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  00;.  }else{.   
24b20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
24b30 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
24b40 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  1));.  }.}../*.*
24b50 2a 20 43 61 75 73 65 20 61 20 66 75 6e 63 74 69  * Cause a functi
24b60 6f 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e 20 65  on to throw an e
24b70 72 72 6f 72 20 69 66 20 69 74 20 77 61 73 20 63  rror if it was c
24b80 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65  all from OP_Pure
24b90 46 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72 20 74  Func.** rather t
24ba0 68 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e  han OP_Function.
24bb0 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75  .**.** OP_PureFu
24bc0 6e 63 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  nc means that th
24bd0 65 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  e function must 
24be0 62 65 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63  be deterministic
24bf0 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  , and should.** 
24c00 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  throw an error i
24c10 66 20 69 74 20 69 73 20 67 69 76 65 6e 20 69 6e  f it is given in
24c20 70 75 74 73 20 74 68 61 74 20 77 6f 75 6c 64 20  puts that would 
24c30 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65  make it non-dete
24c40 72 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68  rministic..** Th
24c50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
24c60 76 6f 6b 65 64 20 62 79 20 64 61 74 65 2f 74 69  voked by date/ti
24c70 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  me functions tha
24c80 74 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d  t use non-determ
24c90 69 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61 74 75  inistic.** featu
24ca0 72 65 73 20 73 75 63 68 20 61 73 20 27 6e 6f 77  res such as 'now
24cb0 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  '..*/.int sqlite
24cc0 33 4e 6f 74 50 75 72 65 46 75 6e 63 28 73 71 6c  3NotPureFunc(sql
24cd0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
24ce0 74 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  tx){.#ifdef SQLI
24cf0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
24d00 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70  OR_STAT4.  if( p
24d10 43 74 78 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20  Ctx->pVdbe==0 ) 
24d20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
24d30 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56 64  .  if( pCtx->pVd
24d40 62 65 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f  be->aOp[pCtx->iO
24d50 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75  p].opcode==OP_Pu
24d60 72 65 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71  reFunc ){.    sq
24d70 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
24d80 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20  or(pCtx, .      
24d90 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73   "non-determinis
24da0 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  tic function in 
24db0 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e  index expression
24dc0 20 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73 74 72   or CHECK constr
24dd0 61 69 6e 74 22 2c 0a 20 20 20 20 20 20 20 2d 31  aint",.       -1
24de0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
24df0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
24e00 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
24e10 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
24e20 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ABLE./*.** Trans
24e30 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  fer error messag
24e40 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73  e text from an s
24e50 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72  qlite3_vtab.zErr
24e60 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
24e70 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
24e80 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
24e90 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f  te3_malloc) into
24ea0 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20   a Vdbe.zErrMsg 
24eb0 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20  (text stored.** 
24ec0 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
24ed0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
24ee0 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69  bMalloc)..*/.voi
24ef0 64 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70  d sqlite3VtabImp
24f00 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a  ortErrmsg(Vdbe *
24f10 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  p, sqlite3_vtab 
24f20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70  *pVtab){.  if( p
24f30 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
24f40 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
24f50 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71   = p->db;.    sq
24f60 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
24f70 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
24f80 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71   p->zErrMsg = sq
24f90 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
24fa0 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
24fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24fc0 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ree(pVtab->zErrM
24fd0 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e  sg);.    pVtab->
24fe0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
24ff0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
25000 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
25010 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
25020 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
25030 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f  REUPDATE_HOOK../
25040 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
25050 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
25060 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65  ot NULL, release
25070 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   any allocations
25080 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
25090 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20  with the memory 
250a0 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e  cells in the p->
250b0 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c  aMem[] array. Al
250c0 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61  so free the Unpa
250d0 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
250e0 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20  ructure itself, 
250f0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
25100 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ree()..**.** Thi
25110 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
25120 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63  ed to free Unpac
25130 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
25140 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ures allocated b
25150 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70  y.** the vdbeUnp
25160 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63  ackRecord() func
25170 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64  tion found in vd
25180 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74  beapi.c..*/.stat
25190 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
251a0 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33  Unpacked(sqlite3
251b0 20 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64   *db, int nField
251c0 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  , UnpackedRecord
251d0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
251e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
251f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c  for(i=0; i<nFiel
25200 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d  d; i++){.      M
25210 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
25220 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Mem[i];.      if
25230 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20  ( pMem->zMalloc 
25240 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ) sqlite3VdbeMem
25250 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
25260 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
25270 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
25280 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
25290 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
252a0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
252b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
252c0 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
252d0 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  _HOOK./*.** Invo
252e0 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74  ke the pre-updat
252f0 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20  e hook. If this 
25300 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
25310 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64 61 74  DELETE pre-updat
25320 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  e call,.** then 
25330 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
25340 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
25350 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e  ment should poin
25360 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61 62 6f  t to the row abo
25370 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64 61  ut.** to be upda
25380 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  te or deleted. I
25390 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
253a0 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  n calls sqlite3_
253b0 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c  preupdate_old(),
253c0 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65 64  .** the required
253d0 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72   value will be r
253e0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72 6f 77  ead from the row
253f0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
25400 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ts to..*/.void s
25410 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64  qlite3VdbePreUpd
25420 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20  ateHook(.  Vdbe 
25430 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *v,             
25440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
25450 62 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f  be pre-update ho
25460 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79  ok is invoked by
25470 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
25480 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
25490 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
254a0 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61  to grab old.* va
254b0 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  lues from */.  i
254c0 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
254d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
254e0 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  * SQLITE_INSERT,
254f0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
25500 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
25510 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
25520 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
25530 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62  se name */.  Tab
25540 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25560 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65 20 2a  Modified table *
25570 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c 20 20  /.  i64 iKey1,  
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25590 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b      /* Initial k
255a0 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  ey value */.  in
255b0 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20 20  t iReg          
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
255d0 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 6e 65   Register for ne
255e0 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  w.* record */.){
255f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
25600 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b   v->db;.  i64 iK
25610 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61 74 65  ey2;.  PreUpdate
25620 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20 63 6f   preupdate;.  co
25630 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d  nst char *zTbl =
25640 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
25650 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
25660 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20 3d 20  fakeSortOrder = 
25670 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  0;..  assert( db
25680 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d 30 20  ->pPreUpdate==0 
25690 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65  );.  memset(&pre
256a0 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f  update, 0, sizeo
256b0 66 28 50 72 65 55 70 64 61 74 65 29 29 3b 0a 20  f(PreUpdate));. 
256c0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
256d0 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b  ab)==0 ){.    iK
256e0 65 79 31 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b  ey1 = iKey2 = 0;
256f0 0a 20 20 20 20 70 72 65 75 70 64 61 74 65 2e 70  .    preupdate.p
25700 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
25710 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
25720 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25730 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55  if( op==SQLITE_U
25740 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  PDATE ){.      i
25750 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69  Key2 = v->aMem[i
25760 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65  Reg].u.i;.    }e
25770 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65 79 32  lse{.      iKey2
25780 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a   = iKey1;.    }.
25790 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
257a0 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61  Csr->nField==pTa
257b0 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20  b->nCol .       
257c0 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64  || (pCsr->nField
257d0 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26  ==pTab->nCol+1 &
257e0 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c  & op==SQLITE_DEL
257f0 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29  ETE && iReg==-1)
25800 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61  .  );..  preupda
25810 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75  te.v = v;.  preu
25820 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73  pdate.pCsr = pCs
25830 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f  r;.  preupdate.o
25840 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64  p = op;.  preupd
25850 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52  ate.iNewReg = iR
25860 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  eg;.  preupdate.
25870 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b  keyinfo.db = db;
25880 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
25890 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64  info.enc = ENC(d
258a0 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  b);.  preupdate.
258b0 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c  keyinfo.nKeyFiel
258c0 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  d = pTab->nCol;.
258d0 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
258e0 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d  nfo.aSortOrder =
258f0 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f   (u8*)&fakeSortO
25900 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74  rder;.  preupdat
25910 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b  e.iKey1 = iKey1;
25920 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65  .  preupdate.iKe
25930 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72  y2 = iKey2;.  pr
25940 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d 20 70  eupdate.pTab = p
25950 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65  Tab;..  db->pPre
25960 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64  Update = &preupd
25970 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55  ate;.  db->xPreU
25980 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62  pdateCallback(db
25990 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c  ->pPreUpdateArg,
259a0 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54   db, op, zDb, zT
259b0 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32  bl, iKey1, iKey2
259c0 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  );.  db->pPreUpd
259d0 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ate = 0;.  sqlit
259e0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65  e3DbFree(db, pre
259f0 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b  update.aRecord);
25a00 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
25a10 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
25a20 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69  e.keyinfo.nKeyFi
25a30 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65  eld+1, preupdate
25a40 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76  .pUnpacked);.  v
25a50 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
25a60 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65  db, preupdate.ke
25a70 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b  yinfo.nKeyField+
25a80 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65  1, preupdate.pNe
25a90 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66  wUnpacked);.  if
25aa0 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  ( preupdate.aNew
25ab0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
25ac0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
25ad0 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  sr->nField; i++)
25ae0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
25af0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70  dbeMemRelease(&p
25b00 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d  reupdate.aNew[i]
25b10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
25b20 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c  ite3DbFreeNN(db,
25b30 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29   preupdate.aNew)
25b40 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
25b50 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
25b60 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
25b70 2f 0a                                            /.